校正一个FMCW激光测距系统

## 引言 激光测距其实想法非常简单。想知道物体离激光器有多远,我们只要发一束光过去,等它反射回来测一下时间就可以算出来。 问题在于,光速实在太快了。想测到厘米量级,时间分辨率就要来到几十皮秒。对于还在智斗vivado的我们来说,这个方案显然不太友好。 于是我们换一种思路,让时间差变成频率差,从而达到放慢时间的目的,用大家的电子系血液完成测距。这就是本文的主角,**FMCW 激光测距**。 ![实验系统实物图](/static/uploads/blog/image_20260528_085415.png) 图里这一桌东西,就是我们的实验系统。 ## 什么是 FMCW 激光测距? FMCW 是 Frequency Modulated Continuous Wave,也就是调频连续波。顾名思义,它发的不是一个很短的脉冲,而是一束一直存在、频率不断变化的光。 不妨想象激光器正在按锯齿波扫频。某一时刻发出去的光,到镜子那里反射回来时,已经比本地的光晚了一点点。于是回波光和本振光重新相遇时,二者频率不完全相同,会在探测器上打出一个拍频。镜子越远,延迟越大,拍频也越高。 这样,距离就从“光跑了多久”变成了“频谱上的峰在哪里”。后者显然更适合交给 ADC、FFT 和电脑处理。 ![FMCW 测距基本结构](/static/uploads/blog/image_20260528_085513.png) 略过严格推导并不会影响后续阅读。只要记住一件事:理想情况下,目标距离和拍频位置成正比。扫频带宽越大,理论距离分辨率越好。我们实验里的激光器工作在 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里,探测器输出大致可以分成两部分。一部分是两束光自身强度带来的直流项,另一部分才是携带距离信息的拍频交流项。不幸的是,前者往往很大,后者往往很小。也就是说,探测器大部分动态范围都被一个“没什么用但很占地方”的直流背景吃掉了。 ![单端探测中直流项对动态范围的挤占](/static/uploads/blog/image_20260528_085607.png) 一个聪明的办法是把公共项消掉。 这就轮到平衡光电探测器(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} $$ ![平衡光电探测结构](/static/uploads/blog/image_20260528_085641.png) 这个操作非常符合《电子电路与系统基础》的思想:既然有共模干扰,那就差分。只不过这里差分的不是普通电压信号,而是两路光电流。 ## 问题二:激光器并不严格线性扫频 解决了直流项以后,事情还没有结束。FMCW 测距还有一个更根本的假设:激光器频率要随时间线性变化。 静态下,给激光器一个线性的调制电压,它的输出光频率也应该线性扫动。这样回波光和本振光的频率差就是一个稳定的拍频,FFT 里应该出现一个漂亮的尖峰。 然而实际激光器并不是一个理想的压控振荡器。电流、电压到光频率的动态响应存在非线性和滞后。于是我们给它一个直的输入,它回给我们一条弯的扫频曲线。频率扫不直,拍频就不再是单一频率,频谱峰会被压平而不好找。不同距离下,测量路频谱当然也会变化,但峰并不尖,位置也不够稳。对于一个靠“峰值脚标”读距离的系统来说,这就很痛苦。 ![未校正时不同距离下的频谱](/static/uploads/blog/image_20260528_090253.png) 这时就需要预失真。所谓预失真,就是先承认激光器会把输入弄弯,然后提前把输入往反方向弯一点。这样经过激光器自己的非线性之后,真正输出的光频率反而接近直线。 ![预失真校正思路](/static/uploads/blog/image_20260528_090030.png) 这个想法听起来像是在和激光器斗法。它弯一点,我们就反着弯一点强行掰直。问题在于,怎么知道它到底弯了多少? 我们的办法是加一条参考延时干涉路。 激光器输出后,一小部分光被分到参考路里。它经过一段已知长度的光纤延时,再和自己干涉。这个参考路不负责测目标距离,它负责监视激光器扫频是否线性。注意到拍信号的相位可由瞬时拍频积分得到,即 $$ \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). $$ 采到参考路拍信号后,上位机对它做希尔伯特变换,提取相位随时间的变化。理想扫频时,相位应该接近一条直线;实际相位偏离直线的部分,就可以认为是扫频非线性留下的痕迹。 ![预失真迭代流程](/static/uploads/blog/image_20260528_090124.png) 于是我们得到一个非常朴素的迭代方案。第 k 轮用当前 DAC 码字驱动激光器,采参考路信号,算相位误差,然后把这部分误差按比例扣回下一轮 DAC 码字里。再扫,再采,再改。实验中我们测试了不同反馈系数,最后选用 p=20,迭代 15 轮。 实验里 DAC 每个周期有 16384 个码字点,采样率为 10 MHz。由于周期切换附近会有一些不太干净的数据,我们只取中间稳定的一段做分析。参考路使用约 4 m 光纤作为延时,对应延时约 13.3 ns。 ![激光器中心频率与偏置电压关系](/static/uploads/blog/image_20260528_090218.png) ## FFT峰终于站起来了 先看没有预失真的情况。 预失真迭代之后,频谱的观感就舒服多了。峰明显变得集中,也更容易找到。此时再做测距,读数就不再像是在一团展宽频谱里猜答案。 ![校正后不同距离下的频谱](/static/uploads/blog/image_20260528_090353.png) 可见参考路也能看到迭代确实在起作用!DAC 码字从原来的近似直线逐渐变成带补偿形状的曲线,相位演化曲线则越来越接近直线,参考路 FFT 里的峰也随着迭代逐渐集中。 ![DAC 码字的迭代变化](/static/uploads/blog/image_20260528_090426.png) ![相位演化曲线逐渐接近线性](/static/uploads/blog/image_20260528_090522.png) ![参考路频谱峰随迭代变得集中](/static/uploads/blog/image_20260528_090537.png) 最后看结果。在 1.7 m 左右的位置,未校正时测距误差约为 0.7 m;经过 15 轮预失真迭代后,误差降低到约 2.3 cm。进一步比较导轨刻度和 FFT 峰值脚标,整体线性关系也比较好,测距精度约 2.5 cm。 ![图片描述](/static/uploads/blog/image_20260528_090722.png) ## 结语 至此,我们已经得到了一台可以工作的 FMCW 激光测距系统。它并不完美,光路耦合、偏振漂移、寄生反射、激光器相位噪声都会继续影响结果。但这次实验已经说明了一件事:很多时候,测不准不是因为原理错了,而是因为原理里的“理想条件”在实验台上并不存在。 平衡探测负责把拍频从直流背景里救出来,参考延时干涉负责让扫频非线性变得可见,预失真迭代负责把这部分非线性一点点压下去。 从 0.7 m 到 2.3 cm,听起来像是一个很大的跨越。但拆开来看,它不过是把几个不理想因素逐个处理掉。信号干净一点,扫频直一点,FFT 峰尖一点,距离读数也就终于站稳了。

评论

留下评论

邮箱仅用于识别,不会公开

支持 KaTeX:$...$ 行内 · $$...$$ 独立公式
加载评论中...