## 引言
激光测距其实想法非常简单。想知道物体离激光器有多远,我们只要发一束光过去,等它反射回来测一下时间就可以算出来。
问题在于,光速实在太快了。想测到厘米量级,时间分辨率就要来到几十皮秒。对于还在智斗vivado的我们来说,这个方案显然不太友好。
于是我们换一种思路,让时间差变成频率差,从而达到放慢时间的目的,用大家的电子系血液完成测距。这就是本文的主角,**FMCW 激光测距**。

图里这一桌东西,就是我们的实验系统。
## 什么是 FMCW 激光测距?
FMCW 是 Frequency Modulated Continuous Wave,也就是调频连续波。顾名思义,它发的不是一个很短的脉冲,而是一束一直存在、频率不断变化的光。
不妨想象激光器正在按锯齿波扫频。某一时刻发出去的光,到镜子那里反射回来时,已经比本地的光晚了一点点。于是回波光和本振光重新相遇时,二者频率不完全相同,会在探测器上打出一个拍频。镜子越远,延迟越大,拍频也越高。
这样,距离就从“光跑了多久”变成了“频谱上的峰在哪里”。后者显然更适合交给 ADC、FFT 和电脑处理。

略过严格推导并不会影响后续阅读。只要记住一件事:理想情况下,目标距离和拍频位置成正比。扫频带宽越大,理论距离分辨率越好。我们实验里的激光器工作在 300 mA、25 ℃,5 V 峰峰值调制时扫频带宽大约 30 GHz,对应的理想距离分辨率约 1 cm。听起来已经很好了,对吧?
在周期性锯齿波信号的激励下,激光器输出频率随时间线性变化,表达式为$f(t)=f_0+\frac{B}{T}t$,其中$f_0$为起始频率,$B$为扫频带宽,$T$为扫频周期。激光束通过分束器分成两路:一部分作为本振光衰减后直接进入探测器,另一部分经过自由空间传播到目标并反射回探测器。由于传播延时$\tau=2d/c$,回波光的频率为$f(t-\tau)=f_0+\frac{B}{T}(t-\tau)$。
两路光在探测器上发生干涉。由于光电二极管(PD)为平方律检波,因此
$$
I_{PD}(t)=\left|\vec E_1(t)+\vec E_2(t)\right|^2=\left|\vec E_1(t)\right|^2+\left|\vec E_2(t)\right|^2+\color{blue}{2\left|\vec E_1(t)\right|\left|\vec E_2(t)\right|}\sin\theta
$$
其中$\vec E_1(t)=\vec E_1\sin (2\pi f(t)\cdot t)$和$\vec E_2(t)=\vec E_2\sin (2\pi f(t-\tau)\cdot t)$分别为本振光和回波光的电场矢量,$\theta$为两束光的偏振角。前两项为直流项,主要由光强决定;第三项为交流项:
$$
2\left|\vec E_1(t)\right|\left|\vec E_2(t)\right|\sin\theta=\sin\theta E_1E_2\left(\cos[2\pi (f(t)-f(t-\tau))t]-\cos[2\pi (f(t)+f(t-\tau))t]\right)
$$
上式中$\cos[2\pi (f(t)+f(t-\tau))t]$等高频项将被模拟前端滤除,因此探测器收到信号为
$$
I_{PD}(t)=\underbrace{\frac{1}{2}\left|\vec E_1\right|^2+\frac{1}{2}\left|\vec E_2\right|^2}_{\text{直流项}}+\underbrace{\left|\vec E_1\right|\left|\vec E_2\right|\sin\theta\cos\left(2\pi(f(t)-f(t-\tau))t\right)}_{\text{交流项}}
$$
其中拍频$f(t)-f(t-\tau)=\frac{B}{T}\tau$与目标距离成正比。通过对交流项进行频谱分析,可以从拍频位置读取目标距离信息。频谱中将在连续时间频率
$$
\Omega=\frac{2\pi B}{T}\tau=\frac{2\pi B}{cT}\Delta_d
$$
处出现峰,其中$\Delta_d=d_0+2L$为两路光的光程差,$d_0$为系统内部光程差,$L$为目标距离。
由于激励信号一般由DAC提供,且假设DAC与ADC使用相同的采样率$f_s=\frac{1}{T_s}$,若DAC一个周期点数为$N$,$T=NT_s$,从而
$$
\Omega=\frac{2\pi B}{cN}\Delta_d\cdot f_s
$$
因此FFT频谱中该峰的位置为
$$
\omega=\frac{\Omega}{2\pi f_s}=\frac{B}{cN}\Delta_d
$$
## 问题一:有用信号被直流项淹没了
在普通单端PD里,探测器输出大致可以分成两部分。一部分是两束光自身强度带来的直流项,另一部分才是携带距离信息的拍频交流项。不幸的是,前者往往很大,后者往往很小。也就是说,探测器大部分动态范围都被一个“没什么用但很占地方”的直流背景吃掉了。

一个聪明的办法是把公共项消掉。
这就轮到平衡光电探测器(BPD)登场了。我们用 2×2 耦合器把两路光合成两路输出。由于耦合器引入的相位关系,两路输出中的直流强度项相同,而干涉项正负相反。两个光电二极管一相减,公共直流项被抵消,拍频项反而保留下来。根据光学耦合器件特性,其S参数为
$$
\begin{bmatrix}
b_1\\
b_2\\
b_3\\
b_4
\end{bmatrix}
=
\mathbf S
\begin{bmatrix}
a_1\\
a_2\\
a_3\\
a_4
\end{bmatrix},
\qquad
\mathbf S
=
\frac{1}{\sqrt2}
\begin{bmatrix}
0 & 0 & 1 & j\\
0 & 0 & j & 1\\
1 & j & 0 & 0\\
j & 1 & 0 & 0
\end{bmatrix}
$$
考虑实际使用中,3,4端口为出口,没有入射波。因此可以简化写出
$$
\begin{bmatrix}
b_3\\
b_4
\end{bmatrix}
=
\frac{1}{\sqrt2}
\begin{bmatrix}
1 & j\\
j & 1
\end{bmatrix}
\begin{bmatrix}
a_1\\
a_2
\end{bmatrix}
$$
令1,2端口输入光为$\vec E_1$和$\vec E_2$,则输出光为
$$
\begin{bmatrix}\vec E_3\\
\vec E_4
\end{bmatrix}
=
\frac{1}{\sqrt2}\begin{bmatrix}
1 & j\\
j & 1
\end{bmatrix}\begin{bmatrix}
\vec E_1\\
\vec E_2
\end{bmatrix}
$$
因此两个PD的输出信号分别为
$$
\begin{aligned}
I_+&=\left|\vec E_3\right|^2=\frac{1}{2}\left|\vec E_1\right|^2+\frac{1}{2}\left|\vec E_2\right|^2+\color{blue}{\left|\vec E_1\right|\left|\vec E_2\right|\sin\theta}\\
I_-&=\left|\vec E_4\right|^2=\frac{1}{2}\left|\vec E_1\right|^2+\frac{1}{2}\left|\vec E_2\right|^2-\color{blue}{\left|\vec E_1\right|\left|\vec E_2\right|\sin\theta}
\end{aligned}
$$
因此差分信号为
$$
I_{out}=I_+-I_-={2\left|\vec E_1\right|\left|\vec E_2\right|\sin\theta}
$$

这个操作非常符合《电子电路与系统基础》的思想:既然有共模干扰,那就差分。只不过这里差分的不是普通电压信号,而是两路光电流。
## 问题二:激光器并不严格线性扫频
解决了直流项以后,事情还没有结束。FMCW 测距还有一个更根本的假设:激光器频率要随时间线性变化。
静态下,给激光器一个线性的调制电压,它的输出光频率也应该线性扫动。这样回波光和本振光的频率差就是一个稳定的拍频,FFT 里应该出现一个漂亮的尖峰。
然而实际激光器并不是一个理想的压控振荡器。电流、电压到光频率的动态响应存在非线性和滞后。于是我们给它一个直的输入,它回给我们一条弯的扫频曲线。频率扫不直,拍频就不再是单一频率,频谱峰会被压平而不好找。不同距离下,测量路频谱当然也会变化,但峰并不尖,位置也不够稳。对于一个靠“峰值脚标”读距离的系统来说,这就很痛苦。

这时就需要预失真。所谓预失真,就是先承认激光器会把输入弄弯,然后提前把输入往反方向弯一点。这样经过激光器自己的非线性之后,真正输出的光频率反而接近直线。

这个想法听起来像是在和激光器斗法。它弯一点,我们就反着弯一点强行掰直。问题在于,怎么知道它到底弯了多少?
我们的办法是加一条参考延时干涉路。
激光器输出后,一小部分光被分到参考路里。它经过一段已知长度的光纤延时,再和自己干涉。这个参考路不负责测目标距离,它负责监视激光器扫频是否线性。注意到拍信号的相位可由瞬时拍频积分得到,即
$$
\phi_{\mathrm{beat}}(t)=2\pi\int_0^t f_{\mathrm{beat}}(\tau)\,\mathrm d\tau .
$$
假设激光经过一段已知延时 $\tau_m\ll T_{\mathrm{chirp}}$ 后与自身干涉形成监测拍信号,该延时可通过加入一段光纤实现,则监测拍频满足
$$
f_{\mathrm{beat},m}(t)=f_{\mathrm{chirp}}(t)-f_{\mathrm{chirp}}(t-\tau_m)
\approx \frac{\mathrm d}{\mathrm dt}f_{\mathrm{chirp}}(t)\cdot\tau_m .
$$
因此,其对应相位可写为
$$
\phi_{\mathrm{beat},m}(t)
=2\pi\int_0^t \frac{\mathrm d}{\mathrm d\tau}f_{\mathrm{chirp}}(\tau)\cdot\tau_m\,\mathrm d\tau
=2\pi\tau_m\bigl(f_{\mathrm{chirp}}(t)-f_{\mathrm{chirp}}(0)\bigr).
$$
若将扫频写成理想线性项与非线性项之和
$$
f_{\mathrm{chirp}}(t)=\frac{B}{T}t+f_{\mathrm{nl}}(t),
$$
并取 $f_{\mathrm{nl}}(0)=0$,则有
$$
\phi_{\mathrm{beat},m}(t)
=2\pi\tau_m\left(\frac{B}{T}t+f_{\mathrm{nl}}(t)\right)
=kt+\phi_{\mathrm{beat},m,\mathrm{nl}}(t)
$$
其中
$$
k=2\pi\tau_m\frac{B}{T},
\qquad
\phi_{\mathrm{beat},m,\mathrm{nl}}(t)=2\pi\tau_m f_{\mathrm{nl}}(t).
$$
采到参考路拍信号后,上位机对它做希尔伯特变换,提取相位随时间的变化。理想扫频时,相位应该接近一条直线;实际相位偏离直线的部分,就可以认为是扫频非线性留下的痕迹。

于是我们得到一个非常朴素的迭代方案。第 k 轮用当前 DAC 码字驱动激光器,采参考路信号,算相位误差,然后把这部分误差按比例扣回下一轮 DAC 码字里。再扫,再采,再改。实验中我们测试了不同反馈系数,最后选用 p=20,迭代 15 轮。
实验里 DAC 每个周期有 16384 个码字点,采样率为 10 MHz。由于周期切换附近会有一些不太干净的数据,我们只取中间稳定的一段做分析。参考路使用约 4 m 光纤作为延时,对应延时约 13.3 ns。

## FFT峰终于站起来了
先看没有预失真的情况。
预失真迭代之后,频谱的观感就舒服多了。峰明显变得集中,也更容易找到。此时再做测距,读数就不再像是在一团展宽频谱里猜答案。

可见参考路也能看到迭代确实在起作用!DAC 码字从原来的近似直线逐渐变成带补偿形状的曲线,相位演化曲线则越来越接近直线,参考路 FFT 里的峰也随着迭代逐渐集中。



最后看结果。在 1.7 m 左右的位置,未校正时测距误差约为 0.7 m;经过 15 轮预失真迭代后,误差降低到约 2.3 cm。进一步比较导轨刻度和 FFT 峰值脚标,整体线性关系也比较好,测距精度约 2.5 cm。

## 结语
至此,我们已经得到了一台可以工作的 FMCW 激光测距系统。它并不完美,光路耦合、偏振漂移、寄生反射、激光器相位噪声都会继续影响结果。但这次实验已经说明了一件事:很多时候,测不准不是因为原理错了,而是因为原理里的“理想条件”在实验台上并不存在。
平衡探测负责把拍频从直流背景里救出来,参考延时干涉负责让扫频非线性变得可见,预失真迭代负责把这部分非线性一点点压下去。
从 0.7 m 到 2.3 cm,听起来像是一个很大的跨越。但拆开来看,它不过是把几个不理想因素逐个处理掉。信号干净一点,扫频直一点,FFT 峰尖一点,距离读数也就终于站稳了。
评论
留下评论
邮箱仅用于识别,不会公开
$...$行内 ·$$...$$独立公式