第二章 薄膜光学基础理论:光的干涉原理、单层膜与多层膜的光学特性、特征矩阵法

2.1 光的干涉原理——薄膜的灵魂

做薄膜光学,说白了就是在玩光。光是一种电磁波,这个大家都知道。但真正让我觉得妙不可言的,是它居然能在那么薄的膜层里「折腾」出那么多花样。

光的干涉,简单讲就是两束或多束光波相遇,叠加后有的地方变亮、有的地方变暗。为什么会这样?因为光波有相位。波峰对波峰,振幅相加,变亮;波峰对波谷,相互抵消,变暗。这就是干涉。

在薄膜里,干涉是怎么发生的?你想想看,一束光打到薄膜上,一部分在薄膜上表面反射,另一部分穿过薄膜,在薄膜下表面反射,然后再穿出来。这两束反射光,走过的路程不一样,就有了光程差。光程差刚好是半波长的整数倍时,干涉相消;是波长的整数倍时,干涉相长。

核心公式: 2nd cosθ = mλ (干涉相长)
2nd cosθ = (m+1/2)λ (干涉相消)

其中 n 是薄膜折射率,d 是薄膜厚度,θ 是光在薄膜内的折射角,m 是整数。

我记得刚入行那会儿,有个项目要做 8~12μm 的红外增透膜。当时我按公式算好了厚度,结果镀出来透过率死活上不去。后来一查,是薄膜的折射率随波长变化了,我用的还是固定值。嗯,这里要注意:实际材料都有色散,n 是 λ 的函数。

2.2 单层膜的光学特性——从简单入手

单层膜是最基础的结构。别看它简单,很多设计思路都是从它延伸出来的。

单层膜能干什么?最常见的就是增透膜。比如在锗(Ge)基底上镀一层 ZnS,就能把反射率从 36% 降到 10% 以下。原理就是利用干涉相消,让上下表面的反射光互相抵消。

单层膜的反射率公式是这样的:

R = (n0 - n1^2/ns)^2 / (n0 + n1^2/ns)^2

其中 n0 是入射介质(通常是空气,n0=1),n1 是薄膜折射率,ns 是基底折射率。

当 n1 = √(n0·ns) 时,反射率 R = 0,这就是理想增透条件。但现实中,哪有那么巧的材料?

我的经验: 单层膜虽然简单,但实际镀膜时,膜厚控制是最容易出问题的。我曾经因为晶振片老化,厚度监控偏差了 5%,结果整批产品报废。后来我养成了一个习惯:每次镀膜前先做一次「空白试镀」,校准厚度。

单层膜还有一个特点:它的光学特性是波长相关的。在中心波长处效果最好,偏离中心波长,增透效果就会下降。这也是为什么单层膜只能用在窄波段,宽波段必须上多层膜。

2.3 多层膜的光学特性——组合的艺术

单层膜搞不定的事,多层膜来办。多层膜就是把不同折射率、不同厚度的薄膜一层层叠起来,让每一层的光学行为相互配合,实现更复杂的光学功能。

多层膜能做什么?我随便列几个:

  • 宽带增透膜: 在 3~5μm 或 8~12μm 波段实现低反射
  • 带通滤光片: 只让特定波段的光通过,其他波段全部反射
  • 分光镜: 把一束光分成两束,比例可调
  • 高反膜: 反射率做到 99.9% 以上,用于激光腔镜

多层膜的设计,说白了就是找一组膜层参数(厚度、折射率、层数),让整个膜系的光学性能满足要求。这可不是拍脑袋能搞定的,得靠计算。

注意: 多层膜不是层数越多越好。层数多了,工艺难度指数级上升,膜层之间的应力匹配、附着力、环境稳定性都会成为问题。我见过有人设计 40 层的膜系,结果镀出来全裂了。有时候,8 层能搞定的事,别硬上 10 层。

2.4 特征矩阵法——计算多层膜的利器

好了,前面说了那么多,怎么算?总不能一层层用手算吧?当然不行。特征矩阵法就是干这个的。

特征矩阵法的思路是这样的:把每一层薄膜看作一个「光学变换器」,用 2×2 的矩阵来描述它对光波的作用。然后,把各层的矩阵乘起来,就得到整个膜系的矩阵。最后,从总矩阵里提取出反射率、透过率。

每一层的特征矩阵长这样:

M = [cosδ, (i sinδ)/η]
    [i η sinδ, cosδ]

其中 δ = 2π n d cosθ / λ 是相位厚度,η 是光学导纳(对于 s 偏振,η = n cosθ;对于 p 偏振,η = n/cosθ)。

整个膜系的矩阵就是各层矩阵的乘积:

M_total = M1 × M2 × M3 × ... × Mk

然后,反射率和透过率就可以从总矩阵的元素里算出来:

R = |(η0 B - C)/(η0 B + C)|^2
T = (4 η0 ηs) / |η0 B + C|^2

其中 B 和 C 是总矩阵的导出量,η0 和 ηs 分别是入射介质和基底的导纳。

我个人习惯: 写代码实现特征矩阵法时,我会把矩阵乘法单独写成一个函数,方便调试。另外,一定要考虑偏振态,s 和 p 的导纳不同,结果也不同。很多初学者在这里栽跟头。

下面是我用 Python 实现的一个简单版本,供参考:

import numpy as np

def layer_matrix(n, d, theta, lam, polarization='s'):
    """计算单层膜的特征矩阵"""
    delta = 2 * np.pi * n * d * np.cos(theta) / lam
    if polarization == 's':
        eta = n * np.cos(theta)
    else:
        eta = n / np.cos(theta)
    
    M = np.array([
        [np.cos(delta), 1j * np.sin(delta) / eta],
        [1j * eta * np.sin(delta), np.cos(delta)]
    ])
    return M

def total_matrix(layers, theta, lam, polarization='s'):
    """计算多层膜的总特征矩阵"""
    M_total = np.eye(2, dtype=complex)
    for n, d in layers:
        M = layer_matrix(n, d, theta, lam, polarization)
        M_total = M_total @ M
    return M_total

def reflectance(M_total, eta0, etas):
    """从总矩阵计算反射率"""
    B = M_total[0, 0]
    C = M_total[1, 0]
    R = abs((eta0 * B - C) / (eta0 * B + C))**2
    return R

这段代码虽然简单,但已经能处理大部分常规问题了。实际项目中,我会再加上角度扫描、波长扫描、偏振平均等功能。

避坑指南: 我曾经在计算大角度入射时,忘了考虑折射角的变化。结果算出来的反射率曲线跟实测对不上。后来发现,θ 在每一层都不一样,得用斯涅尔定律逐层计算。这个坑,我替你们踩过了。

2.5 本章知识体系

为了让大家更直观地理解本章的知识结构,我画了一张图:

第二章 薄膜光学基础理论 知识体系 光的干涉原理 单层膜光学特性 多层膜光学特性 特征矩阵法(核心算法) 反射率/透过率计算 实际应用:增透膜 | 带通滤光片 | 分光镜 | 高反膜 注意事项 材料色散 | 偏振态选择 | 膜厚控制精度 | 应力匹配 | 环境稳定性

这张图把本章的核心逻辑串起来了:从干涉原理出发,到单层膜和多层膜的特性,再到特征矩阵法这个计算工具,最后落到实际应用和注意事项。做薄膜设计,脑子里得有这张图。


好了,这一章的内容就到这里。光干涉是基础,单层膜是入门,多层膜是进阶,特征矩阵法是工具。把这些吃透了,后面讲膜系设计、工艺控制,你才能跟得上。

公众号:蓝海资料掘金营,微信deep3321