第4章 Mach-Zehnder干涉仪(MZI):原理、传递函数与参数扫描
如果你翻开任何一本集成光路教科书,MZI一定会出现在前几章。它不复杂,但非常实用。说白了,MZI就是把光分成两路,让它们走不同的路径,再合起来干涉。你想想看,一束光分成两束,走过不同的距离,再碰到一起,就会产生明暗条纹——这就是干涉。
我个人习惯把MZI看作光学神经网络里的"神经元突触"。它能通过调节相位,精确控制光的分配比例。在光芯片里,它就是做权重更新的核心单元。这一章,我们就把MZI的原理、传递函数和仿真方法掰开揉碎了讲清楚。
4.1 MZI的基本结构
一个标准的MZI由三个部分组成:
- 两个3dB分束器(定向耦合器或多模干涉耦合器)。第一个分束器把输入光分成两路,第二个分束器把两路光合起来。
- 两个波导臂,分别称为上臂和下臂。两臂的路径长度不同,或者折射率不同,就会产生相位差。
- 相位调制器(通常集成在上臂),通过热光效应或电光效应改变该臂的光学长度,从而精确控制Δφ。
我记得刚开始做光芯片仿真时,总觉得MZI不就是两根波导加两个耦合器吗?后来才发现,正是这个简单的结构,构成了光学神经网络里最灵活的可调权重单元。你改变Δφ,就能连续调节两个输出端口的能量分配——这其实就是神经元的"突触权重"。
4.2 传递函数推导
我们一步步来。先定义几个基本量:
- 输入电场为 E_in,分束器的耦合比为 κ(强度比,通常κ=0.5)
- 第一个分束器之后,上臂的电场为 √κ · E_in,下臂为 i√(1-κ) · E_in
- 两臂之间的相位差为 Δφ,由上臂的调制器引入
- 第二个分束器将两路电场再次耦合,输出到两个端口
完整的传输矩阵形式如下(我习惯写成矩阵乘法,方便在Python里直接算):
# 3dB分束器的传输矩阵(κ = 0.5)
T_3dB = (1/√2) * [[1, i],
[i, 1]]
# 相位差矩阵(上臂引入Δφ,下臂不变)
P = [[exp(i·Δφ), 0],
[0, 1]]
# 整体传递矩阵 H = T_3dB · P · T_3dB
# 计算后得到输出电场:
# E_out1 = i·sin(Δφ/2) · E_in
# E_out2 = cos(Δφ/2) · E_in
输出光强是电场模的平方,所以:
核心传递函数:
I_out1 = sin²(Δφ/2) · I_in
I_out2 = cos²(Δφ/2) · I_in
两路输出之和恒等于 I_in —— 能量守恒。
如果分束器的耦合比不是精确的0.5,传递函数会变成更一般的形式:
I_out1 = 4κ(1-κ) · sin²(Δφ/2) · I_in
I_out2 = I_in - I_out1
从公式可以看出,当κ偏离0.5时,消光比会下降。我在项目中测过一批MZI,其中一个分束器的κ只有0.43,结果输出端口的对比度明显不够,后来换了工艺批次才解决。
4.3 参数扫描与仿真分析
理论推导完了,我们来跑一次参数扫描。我个人习惯用Python做这种仿真,numpy算矩阵快,matplotlib画图也方便。下面是一个完整的扫描脚本:
import numpy as np
def mzi_response(delta_phi, kappa=0.5):
"""
MZI 传递函数
delta_phi : 两臂相位差 (rad)
kappa : 分束器耦合比 (强度比)
返回 (T_out1, T_out2) 两个端口的透过率
"""
# 直接使用推导出的公式
T1 = 4 * kappa * (1 - kappa) * (np.sin(delta_phi/2))**2
T2 = 1 - T1
return T1, T2
# 参数扫描:相位差从 0 到 2π,共 1000 个点
phi_scan = np.linspace(0, 2*np.pi, 1000)
T1_scan, T2_scan = mzi_response(phi_scan, kappa=0.5)
# 找出消光比最大的点
max_T1 = np.max(T1_scan)
min_T1 = np.min(T1_scan)
ER_dB = 10 * np.log10(max_T1 / (min_T1 + 1e-12))
print(f"输出端口1的消光比: {ER_dB:.2f} dB")
# 如果想看不同耦合比的影响,可以循环扫描
for k in [0.3, 0.4, 0.5, 0.6]:
T1, _ = mzi_response(phi_scan, kappa=k)
print(f"κ={k:.1f} 时最大透过率: {np.max(T1):.3f}")
运行上面的代码,你会发现当κ=0.5时,输出端口1的透过率可以从0连续调到1,消光比理论上无穷大。一旦κ偏离0.5,最大透过率就会下降,消光比也跟着恶化。
为什么消光比这么重要?在光学神经网络里,MZI用来做权重矩阵的乘法。如果消光比不够,权重就调不到0,网络的表达能力就会受限。我曾经因为忽略了分束器的工艺误差,导致仿真里效果很好的网络,流片回来性能打了七折。后来学乖了——仿真时一定要把κ的误差范围扫进去。
工程技巧:设计MZI时,不要把κ卡死在0.5。实际工艺中±5%的偏差很常见。我建议在仿真中至少扫三个κ值:0.45、0.50、0.55,看看你的网络对分束器误差是否敏感。如果不敏感,说明设计裕量足够;如果敏感,就得考虑加微调结构。
除了耦合比,还有一个参数值得扫——波导损耗。虽然MZI的损耗主要来自波导本身,但两臂的损耗差异会影响平衡。我记得有次测试,上臂比下臂多损耗了0.3 dB,结果输出端口的暗态电平下不去,查了三天才发现是波导转角半径不一致导致的。
避坑指南:我曾经在仿真MZI阵列时,只扫了Δφ,没扫温度和工艺误差。结果流片回来,16个MZI单元的干涉条纹全都不一致。从那以后,我每个MZI设计都会做三样扫描——相位、耦合比、波导损耗偏差。三者共同决定成品率。
参数对比与设计参考
下面这张表是我在实际项目中常用的MZI设计参数范围,供你参考:
| 参数 | 符号 | 典型值 | 设计窗口 | 对性能的影响 |
|---|---|---|---|---|
| 耦合比 | κ | 0.5 | 0.47 ~ 0.53 | 偏离0.5会降低消光比 |
| 相位差范围 | Δφ | 0 ~ 2π | 0 ~ 2π | 决定权重调节范围 |
| 波导损耗 | α | 1 dB/cm | < 2 dB/cm | 两臂损耗差需 < 0.1 dB |
| 调相效率 | Vπ·L | 2 V·cm | 1.5 ~ 3 V·cm | 效率越高,调相功耗越低 |
你想想看,一张表就把MZI设计的核心参数都框住了。做仿真时,先按典型值跑一遍,再扫设计窗口的边界,就能知道你的设计稳不稳。
最后说一句。MZI虽然基础,但它是光学神经网络里最常用的权重实现方式。把这一章的传递函数吃透,参数扫描的方法练熟,后面做阵列、做网络时你才会心里有底。说白了,MZI就是光芯片里的"神经元突触",它的精度直接决定了网络的推理质量。