3. iToF核心原理:连续波调制、四相位采样法、相位解包裹、深度计算公式推导

好,咱们进入正题。这一章是iToF的硬核部分,也是我当年啃得最久的一块。连续波调制、四相位采样、相位解包裹,这几个概念串起来,就是iToF测距的完整链路。说白了,你理解了这章,iToF的原理你就拿下了八成。

3.1 连续波调制:为什么是正弦波?

iToF和dToF最大的区别,在于它不直接测量光子的飞行时间。它测的是相位差。怎么测相位差?靠调制。

我们给激光器一个高频的正弦波信号,让它发出的光强按正弦规律变化。这束光打到目标上反射回来,被传感器接收。你想想看,反射光相对于发射光,会有一个时间延迟Δt。这个Δt,在正弦波上就表现为相位偏移Δφ。

公式很简单:

Δφ = 2π · f_mod · Δt

其中f_mod是调制频率。Δt就是飞行时间。所以:

d = (c · Δt) / 2 = (c · Δφ) / (4π · f_mod)

嗯,这里要注意:为什么用正弦波?我个人习惯用正弦波,因为它的数学性质好——单一频率,没有谐波,解调起来干净。方波也行,但方波的高频分量会引入额外的误差,我在项目中遇到过,方波调制的系统对多路径干扰更敏感。

核心公式:

深度 d = (c · Δφ) / (4π · f_mod)

其中c是光速,f_mod是调制频率,Δφ是测得的相位差。

3.2 四相位采样法:如何从像素里“榨”出相位?

好,现在问题来了:传感器接收到的光信号,是一个叠加了环境光、噪声、反射光强变化的混合信号。我们怎么从里面提取出那个微弱的相位差Δφ?

答案是:四相位采样法。说白了,就是在同一个像素里,用四个不同的相位窗口去采样。

我画个图帮你理解:

四相位采样法示意图 发射信号 反射信号 Δφ C1(0°) C2(90°) C3(180°) C4(270°) 每个采样窗口对应一个相位偏移,采集四个电荷量C1~C4

具体怎么做?传感器在每个像素里集成了四个“抽头”(tap),每个抽头在发射信号的0°、90°、180°、270°相位处打开,采集电荷。一个完整的测量周期,我们得到四个电荷量:C1、C2、C3、C4。

然后,相位差Δφ就可以算出来了:

Δφ = arctan( (C3 - C1) / (C2 - C4) )

为什么是这个公式?我推导一下给你看:

假设接收到的信号是:

I(t) = A · sin(2πf_mod · t + Δφ) + B

其中A是振幅,B是环境光偏置。四个采样窗口分别对应相位0°、90°、180°、270°,积分后得到:

C1 = A · sin(Δφ) + B
C2 = A · sin(Δφ + π/2) + B = A · cos(Δφ) + B
C3 = A · sin(Δφ + π) + B = -A · sin(Δφ) + B
C4 = A · sin(Δφ + 3π/2) + B = -A · cos(Δφ) + B

你看,C3 - C1 = 2A·sin(Δφ),C2 - C4 = 2A·cos(Δφ)。一除,环境光B就被消掉了,振幅A也被消掉了。干净利落。

避坑指南: 我曾经在调试一款ToF模组时,发现深度值一直跳。排查了半天,原来是C1~C4的积分时间没对齐。四相位采样要求四个窗口的积分时间完全一致,否则会引入相位误差。这个坑我踩过,你记住了。

3.3 相位解包裹:当相位超过2π怎么办?

好,现在我们有Δφ了。但Δφ的范围是0到2π。如果实际相位差是3π,我们测出来只有π。这就叫相位包裹(phase wrapping)。

为什么会这样?因为正弦波是周期性的。相位每增加2π,波形就重复一次。所以测得的相位总是在[0, 2π)之间。

对应的深度范围是多少?

d_max = c / (2 · f_mod)

举个例子,f_mod = 100 MHz,那么d_max = 3×10⁸ / (2×10⁸) = 1.5米。超过1.5米,深度就“卷”回来了。

怎么解决?相位解包裹。说白了,就是判断当前测得的相位到底在第几个周期里。

常用的方法有两种:

  • 多频调制法:用两个或三个不同的调制频率分别测量。不同频率的模糊距离不同,通过对比可以解出真实相位。我在项目中用过双频方案,一个低频(比如20 MHz)测大范围但精度低,一个高频(比如100 MHz)测小范围但精度高,两者结合。
  • 空间解包裹:利用相邻像素的深度连续性,假设深度不会突变。如果某个像素的相位突然从接近0跳变到接近2π,就说明发生了包裹,给它加上一个2π。

注意: 空间解包裹在物体边缘容易出错。比如一个物体刚好在1.5米处,它的边缘像素可能一个在包裹前、一个在包裹后,解包裹算法如果处理不好,会出现“飞点”。我建议在边缘区域做额外的置信度检查。

3.4 深度计算公式:从相位到距离

好了,现在我们有了解包裹后的真实相位Δφ_real,深度计算就简单了:

d = (c · Δφ_real) / (4π · f_mod)

但实际工程中,我们还要考虑几个修正项:

修正项 原因 处理方法
温度漂移 激光器波长随温度变化,影响调制频率 内置温度传感器,查表补偿
非线性误差 像素响应不是完美的线性 出厂标定,建立查找表
多路径干扰 光线在场景中多次反射 后续章节会详细讲

完整的深度计算公式在工程中是这样的:

d_raw = (c · Δφ_real) / (4π · f_mod)
d_calibrated = LUT_temp[d_raw] + offset_wiggling

其中LUT_temp是温度补偿查找表,offset_wiggling是wiggling误差(正弦波非理想性导致的周期性误差)的修正项。

总结一下iToF的完整流程:

  1. 发射连续波调制的正弦光信号
  2. 传感器用四相位采样法采集C1~C4
  3. 计算包裹相位Δφ = arctan((C3-C1)/(C2-C4))
  4. 相位解包裹,得到真实相位Δφ_real
  5. 代入深度公式,加上标定修正,得到最终深度d

嗯,这一章的内容就到这里。四相位采样法是我觉得iToF最精妙的设计——用四个采样点就解决了环境光抑制和振幅归一化的问题。相位解包裹则是工程实现中的关键难点,多频调制方案虽然增加了硬件成本,但可靠性更高。你自己做项目时,可以根据精度要求和成本预算来权衡。

个人经验: 我建议你在做iToF系统标定时,先做一个静态场景的相位线性度测试。用一个反射靶标从0.5米移动到5米,记录每个位置的相位值。如果发现相位不是严格的线性,大概率是wiggling误差,需要做正弦波拟合修正。这个测试我每次做新项目都会跑一遍,能省去后面很多调试时间。


专注资料整理