4、相位恢复技术:Gerchberg-Saxton算法、TIE(传输强度方程)、相位解包裹

相位恢复,说白了就是「从强度反推相位」。

你想想看,探测器只能记录光强,相位信息全丢了。但波前像差诊断偏偏需要相位。怎么办?

我早年做自适应光学系统调试时,最头疼的就是这个环节。探测器拍了一堆光斑图,但波前长什么样,完全不知道。后来才明白,相位恢复就是解决这个问题的。

这一章,我带你过三种主流方法:Gerchberg-Saxton 算法、传输强度方程(TIE)、相位解包裹。它们各有各的脾气,用对了地方,事半功倍。

核心观点:相位恢复不是「猜」,而是利用已知约束(光强分布、光瞳形状、物体支撑域)反演出相位。三种方法分别适用于不同场景:GS 适合迭代优化,TIE 适合连续光场,解包裹则是前两者的后处理必备。

4.1 Gerchberg-Saxton 算法:迭代中的「来回拉扯」

GS 算法是我个人用得最多的方法之一。它的思路很直观:

  1. 在物平面和傅里叶平面之间来回迭代。
  2. 每次迭代,用已知的振幅替换计算出的振幅。
  3. 相位则保留,慢慢收敛到真实值。

我在项目中遇到过一种情况:用 GS 算法恢复一个二元光学元件的相位分布,迭代了 50 次还不收敛。后来发现,初始相位猜得太离谱了。换成随机相位,反而更快。

我的经验:GS 算法对初始值敏感。如果收敛慢,试试换一组随机初始相位,或者用低分辨率先跑几轮,再插值到高分辨率继续迭代。

下面是一个简化的 GS 算法流程。实际工程中,我会加上支持域约束和振幅正则化。

// 伪代码:Gerchberg-Saxton 算法核心步骤
function GS_iteration(object_amplitude, fourier_amplitude, initial_phase):
    // 1. 构造初始复振幅
    complex_field = object_amplitude * exp(i * initial_phase)
    
    // 2. 傅里叶变换到频域
    fourier_field = FFT(complex_field)
    
    // 3. 替换振幅,保留相位
    fourier_field = fourier_amplitude * exp(i * angle(fourier_field))
    
    // 4. 逆傅里叶变换回物域
    complex_field = IFFT(fourier_field)
    
    // 5. 替换振幅,保留相位
    complex_field = object_amplitude * exp(i * angle(complex_field))
    
    return angle(complex_field)  // 返回更新后的相位

嗯,这里要注意:GS 算法假设光场是相干光。如果是部分相干光,效果会打折扣。我建议先用干涉仪确认一下光源的相干性。

4.2 传输强度方程(TIE):从「散焦」中找相位

TIE 是另一种思路。它不靠迭代,而是利用光强沿传播方向的变化来求解相位。

说白了,就是拍两张照片:一张在焦面,一张离焦一点。然后解一个偏微分方程,直接算出相位。

我记得有一次做显微成像的波前校正,样品很薄,用 GS 算法怎么都不收敛。换成 TIE,拍了两张离焦图,几分钟就解出了相位。爽快。

避坑指南:我曾经因为离焦量选得太小,导致相位噪声爆炸。TIE 对离焦距离很敏感。一般建议离焦量产生的光强变化在 5%~20% 之间。太小了信噪比不够,太大了线性近似失效。

TIE 的核心公式长这样:

∂I/∂z = - (λ / 2π) · ∇ · (I · ∇φ)

其中:
I  = 光强分布
φ  = 待求相位
λ  = 波长
∇  = 梯度算子
∂I/∂z = 光强沿传播方向的变化率(由两张离焦图差分得到)

实际求解时,我会用快速傅里叶变换(FFT)解这个泊松方程。速度很快,适合实时系统。

方法 输入 输出 适用场景
GS 算法 物面振幅 + 傅里叶面振幅 相位分布 相干光、已知光瞳
TIE 焦面 + 离焦面光强 相位分布 部分相干光、连续光场
相位解包裹 包裹相位(-π ~ π) 连续相位 所有相位恢复方法的后处理

4.3 相位解包裹:把「锯齿」拉平

不管是 GS 还是 TIE,算出来的相位都是包裹的——值域在 -π 到 π 之间。真实相位可能是 10π、20π,但你看不到,因为被「折叠」了。

相位解包裹,就是把这些折叠的锯齿拉平,恢复出连续的真实相位。

我踩过最大的坑就在这里。有一次解包裹算法没选对,结果相位图出现了一大片「跳变」——看起来像悬崖,实际上是解包裹路径错了。

我的建议:如果相位变化平缓,用最简单的路径积分法就行。如果相位有噪声或断点,用最小二乘法或质量引导法更稳。别一上来就上复杂算法,先试试简单的。

下面是一个一维解包裹的示意代码:

// 一维相位解包裹(简单路径积分)
function unwrap_phase(wrapped_phase):
    unwrapped = zeros_like(wrapped_phase)
    unwrapped[0] = wrapped_phase[0]
    
    for i in range(1, len(wrapped_phase)):
        delta = wrapped_phase[i] - wrapped_phase[i-1]
        // 如果跳变超过 π,调整
        if delta > pi:
            delta -= 2*pi
        elif delta < -pi:
            delta += 2*pi
        unwrapped[i] = unwrapped[i-1] + delta
    
    return unwrapped

二维解包裹更复杂,因为有多个路径可以选择。我习惯用质量图引导法——先算每个像素的相位质量,然后从高质量区域向低质量区域扩散解包裹。这样能有效抑制噪声传播。

4.4 三种方法的关系与选择

你可能会问:这三种方法到底怎么选?

我的经验是:

  • 有光瞳约束、相干光好 → 用 GS。迭代慢一点,但精度高。
  • 有离焦图像、部分相干光 → 用 TIE。速度快,适合实时。
  • 不管用哪种,最后都要解包裹。这一步别省。

下面这张图,是我自己总结的相位恢复技术知识结构。你可以看到,三种方法最终都指向同一个目标:得到连续的真实相位。

相位恢复技术知识结构图 相位恢复技术知识结构 输入:光强图像 Gerchberg-Saxton 迭代优化 传输强度方程 直接求解 相位解包裹 后处理 包裹相位(-π ~ π) 解包裹算法 输出:连续真实相位 GS + TIE 输出包裹相位 解包裹是必经后处理 三者缺一不可

总结一下:相位恢复不是单一技术,而是一个「组合拳」。GS 和 TIE 负责从强度反推包裹相位,解包裹负责把包裹相位拉平。我建议你在实际项目中,先搞清楚光源相干性和数据采集条件,再选合适的方法。别盲目追求算法复杂度,简单方法往往更可靠。