第3章 光学矩阵乘法原理:MZI干涉与矩阵架构
说实话,我第一次接触马赫-曾德尔干涉仪(MZI)的时候,觉得这东西不就是个光学版的"跷跷板"吗?后来真正在实验室里搭系统,才发现里面的门道比我预想的多得多。这一章,咱们就把MZI的干涉原理和用它搭矩阵乘法的架构聊透。
核心认知:MZI是硅光计算芯片中最基础的计算单元。你想想看,一个巴掌大的芯片上,可能要集成成百上千个MZI。搞懂它的原理,就等于拿到了光子矩阵乘法的入场券。
3.1 MZI干涉原理:从"分光"到"干涉"
MZI的结构其实不复杂。它由两个分束器和两条波导臂组成。光从左侧进入,先被第一个分束器一分为二,分别走上臂和下臂,然后在第二个分束器处汇合,发生干涉。
我在项目中用过热光效应的MZI,也用过电光效应的,各有各的坑。热光的调谐范围大,但响应慢;电光的快,但损耗大。选型的时候得仔细掂量。
为什么会发生干涉?说白了,就是两路光在汇合时,相位差决定了它们是"相互增强"还是"相互抵消"。控制其中一臂的相位,就能控制输出光的分配比例。
我的习惯:每次调试MZI之前,先用连续光扫一遍相位响应曲线。这样能快速发现分束器是否偏了、波导损耗是否异常。别问我为什么强调这个——我曾经在测试时发现干涉对比度上不去,折腾了两天才定位到是分束器的分束比偏离了50:50。
数学上,MZI的传输矩阵可以写成这样:
⎡ E_out1 ⎤ ⎡ cos(θ/2) -i·sin(θ/2) ⎤ ⎡ E_in1 ⎤
⎣ E_out2 ⎦ = ⎣ -i·sin(θ/2) cos(θ/2) ⎦ ⎣ E_in2 ⎦
其中 θ 是两臂之间的相位差。通过改变 θ,就能连续调节两个输出端口的光强分配。
来个简单的Python函数,算一算输出光强:
import numpy as np
def mzi_output_power(p_in, theta):
"""
计算MZI两个输出端口的光强
p_in : 输入光功率(假设从端口1输入)
theta: 相位差(弧度)
"""
p_out1 = p_in * np.cos(theta / 2) ** 2
p_out2 = p_in * np.sin(theta / 2) ** 2
return p_out1, p_out2
# 举个栗子:θ=π/2 时,两路各分一半
p1, p2 = mzi_output_power(1.0, np.pi / 2)
print(f"输出1: {p1:.3f}, 输出2: {p2:.3f}")
# 输出1: 0.500, 输出2: 0.500
注意:实际芯片中的MZI会有额外损耗,分束器也不是完美的50:50。这些非理想因素会在矩阵乘法中引入误差。我的经验是——留好校准余量,别把理论值当实测定。
3.2 光学矩阵乘法架构:把MZI串起来
单个MZI只能做2×2的矩阵运算。要做大矩阵怎么办?把它们级联起来。目前主流架构有两种:Reck架构和Clements架构。
我记得第一次用Reck架构搭3×3矩阵时,相位校准调了整整两天。后来换成Clements架构,校准效率高了不少。你想想看,架构选型直接影响工程实现的工作量。
Reck架构:三角形网格
- MZI排成三角形,N×N需要 N(N-1)/2 个MZI。
- 每个MZI负责消去矩阵中的一个元素,按顺序逐层收敛。
- 优点:结构直观,适合理解原理。
- 缺点:光路传播路径长度不一,造成相位误差累积。
Clements架构:矩形网格
- MZI排成矩形,N×N同样需要 N(N-1)/2 个MZI。
- 光路传播路径等长,相位误差更均匀,校准更友好。
- 优点:误差分布均匀,适合大规模集成。
- 缺点:结构稍复杂,布線需要更精细。
我的建议:如果你在做原型验证,用Reck架构就够了,调试起来直观。但如果是做产品级芯片,我强烈建议用Clements架构——大规模集成时,均匀的误差分布能省掉你大量的校准时间。
两种架构的对比如下:
| 对比维度 | Reck架构 | Clements架构 |
|---|---|---|
| 排列形状 | 三角形 | 矩形 |
| MZI数量(N×N) | N(N-1)/2 | N(N-1)/2 |
| 光路路径长度 | 不一致 | 一致 |
| 相位误差分布 | 不均匀 | 均匀 |
| 校准难度 | 中等 | 相对容易 |
| 大规模集成友好度 | 一般 | 高 |