2. 光计算基本原理
做光计算芯片的人,绕不开三个词:干涉、衍射、傅里叶光学。
说白了,它们是光计算的"数学语言"和"物理引擎"。
我在接触光计算之前,一直用电子思路做卷积——乘加、累加、移位。后来发现,光天生就会做这些操作,而且快得离谱。怎么做到的?答案就在这三个原理里。
2.1 干涉——光波的"乘法器"
两束光相遇,不是简单的亮度相加。
相位相同的地方变亮,相位相反的地方变暗。这就是干涉。
数学上很简单:
I = I₁ + I₂ + 2√(I₁I₂)·cos(Δφ)
你看,最后一项 2√(I₁I₂)·cos(Δφ) 就是"交叉项"。它把相位差 Δφ 变成了强度变化。这就是光的乘法能力——用相位控制幅度。
我记得第一次在实验室看到干涉条纹时,心里想的是——这不就是一个模拟乘法器吗?
我在项目中遇到过相位漂移的问题。热光调相器刚上电时,温度还没稳定,权重值一直往下掉。后来加了一个闭环锁定电路,才把精度拉回来。嗯,做干涉调制,温度控制是必修课。
下面是一段 Python 模拟双光束干涉的代码,你可以看看干涉条纹是怎么算出来的:
import numpy as np
# 双光束干涉 — 强度分布计算
lam = 632.8e-9 # 波长 632.8 nm
d = 1e-3 # 双缝间距 1 mm
L = 1.0 # 观察屏距离 1 m
x = np.linspace(-5e-3, 5e-3, 1000) # 屏上位置
k = 2 * np.pi / lam
delta_phi = k * d * x / L # 相位差
I = 4 * np.cos(delta_phi / 2)**2 # 归一化光强
# 找干涉亮纹位置
peaks = x[np.abs(I - 4) < 1e-6]
print(f"干涉条纹峰值位置(前5个): {peaks[:5]}")
这个代码跑出来的条纹间距是 λL/d ,和实验完全吻合。你调调 d 或者 λ,条纹密度马上变。
2.2 衍射——光的"卷积核"
光通过一个小孔或狭缝后,不会直直地走,它会"扩散"开来。这就是衍射。
夫琅禾费衍射的数学形式长这样:
U(θ) ∝ ∫ E(x) · exp(-i·k·x·sinθ) dx
你仔细看看这个式子——它和卷积的数学形式几乎一模一样!
输入 E(x) 乘上一个相位因子,再积分。光学系统天然就在做"乘法 + 累加"。
我刚开始做光栅卷积核时,踩过一个坑:光栅的占空比没优化好,导致零级衍射太强,高级次能量不够。卷积核的"权重分布"完全偏了。后来刷了三天文献,发现占空比调到 50% 左右时,±1 级衍射效率最均衡。
衍射是实现空间卷积的天然路径。
你想想看,电子芯片做 3×3 卷积要 9 次乘加,光路里一次衍射就完成了。这就是加速的来源。
2.3 傅里叶光学——频域视角的"翻译器"
透镜为什么能做傅里叶变换?
因为光经过透镜后,每个点的相位延迟和位置呈二次关系,恰好就是傅里叶变换的核函数。
公式长这样:
F(u, v) = ∬ f(x, y) · exp[-i·2π(ux + vy)] dx dy
在光学里,透镜的前焦面放输入图像,后焦面看到的就是它的二维频谱。这就是 4f 系统——光学的频域处理平台。
我做系统集成时,最头疼的就是透镜对准。稍微偏一点,频谱就歪了,重建出来的图像全是鬼影。后来我学了一招:用 alignment 光栅做基准,先把透镜调到 Airy 斑对称,再装芯片。省了不少时间。
| 原理 | 物理本质 | 数学工具 | 光计算角色 |
|---|---|---|---|
| 干涉 | 两束光叠加,相位差→强度变化 | I = I₁ + I₂ + 2√(I₁I₂)cos(Δφ) | MZI 权重调制 |
| 衍射 | 光通过狭缝/光栅后空间扩散 | U(θ) ∝ ∫ E(x)·exp(-ikxsinθ)dx | 光栅卷积核 |
| 傅里叶光学 | 透镜实现二维傅里叶变换 | F(u,v) = ∬ f·exp[-i2π(ux+vy)]dxdy | 频域加速处理 |
2.4 三者协同——一张图讲清楚
这三个原理不是孤立的。
在光学卷积加速芯片里,它们配合得很默契:
- 干涉 给每个权重赋值(相位调制 → 幅度加权)
- 衍射 把权重和输入图像"卷"在一起(空间卷积)
- 傅里叶光学 提供频域视角,让你可以直接在频谱上做滤波
下面这张图把三者的关系画在了一起: