“日拱一卒”这个系列我本来打算随便写写结果第一篇发出去之后不少做信号处理的朋友留言催更尤其是聊到差频信号和速度解算那块大家普遍反映“原理书翻得明白一到自己上手调数就发懵”。这期接着往下啃把FMCW雷达里最容易绕晕的几个点一次说透差频信号怎么把距离“装”进去、距离FFT里那些容易被忽略的细节、速度为什么能靠相位差测出来以及锯齿波调制下那个著名的“距离-速度耦合”到底是怎么回事。这篇依然默认你有基础概念知道FMCW是发射连续波、通过频率调制来测距测速的。如果你刚接触建议先把“调频连续波”“差频信号”“距离FFT”这几个关键词对应的基础篇看完。这篇的目标是让你读完能自己上手处理一套雷达中频数据知道每一行代码背后的物理含义调参的时候心里有数。1. 从差频信号说起FMCW雷达怎么把距离“装”进去1.1 混频之后你看到的其实是“时间差”很多人看FMCW的公式推导会觉得抽象我的经验是把它想象成两个人对着喊话一个人发射机声音频率随时间均匀变高另一个人接收机听到的是对方喊声的延迟版本。延迟越多两人当前喊出的频率差就越大。这个频率差就是差频信号。用锯齿波调制来说明。发射信号的频率从 ( f_c ) 开始以斜率 ( S ) 线性上升扫频周期为 ( T_c )扫频带宽为 ( B )三者关系是[ S \frac{B}{T_c} ]发射信号经过目标反射后被接收回波比发射信号晚 ( \tau 2R/c ) 到达其中 ( R ) 是目标距离( c ) 是光速。把发射信号和回波信号送到混频器里做乘法再滤掉高频分量剩下的就是差频信号频率为[ f_b S \cdot \tau S \cdot \frac{2R}{c} ]这个式子就是整个FMCW测距的核心。前面乘的 ( S ) 相当于是把“时间延迟”这个物理量转换成了“频率”这个更容易测量的量。距离越大回波延迟越大差频就越高。你只要测出差频频率距离就出来了[ R \frac{f_b \cdot c}{2S} ]所以FMCW本质上是个“时间-频率”转换器。不要被混频器的乘法运算吓住你只需要关心最终结果差频信号的频率里藏着目标的距离信息相位里藏着目标的速度信息。1.2 为什么偏偏要用线性调频这里有个值得琢磨的地方如果只是要测回波延迟直接发一个单频连续波不行吗不行。单频连续波只能测相位变化也就是速度但测不了距离因为没有任何时间标记供你比对。而普通的脉冲雷达是通过发射脉冲、等待回波来直接测时间延迟的距离分辨率取决于脉冲宽度需要非常窄的脉冲和高峰值功率。FMCW的高明之处在于它用“扫频带宽”换取了“时间分辨率”。频率随时间线性变化回波和发射信号的频率差自然就反映了时间差而频率是很容易精确测量的。你不需要发一个极窄的脉冲只需要在较长时间内线性扫频然后做一次傅里叶变换就能得到高分辨率的距离信息。所以“线性”这两个字不是随便选的。只有频率随时间严格线性变化差频频率才与回波延迟成正比。如果调频曲线非线性差频就会出现畸变距离维的谱峰就会展宽、偏移这就是后面工程上要说的“调频非线性校正”问题。实际系统里为了保证线性度通常会用DDS配合PLL做闭环矫正或者加预失真补偿这部分是硬件工程师的活但信号处理的人也要心里有数。2. 距离FFT那些容易被忽略的细节2.1 采样率、扫频带宽与最大测量距离计算出差频信号之后下一步就是把它数字化然后做FFT看频率峰值。但这里面每一步都有参数约束不是随便设的。先说采样率。差频信号的最高可能频率由最大探测距离决定[ f_{b_max} S \cdot \frac{2R_{max}}{c} \frac{B}{T_c} \cdot \frac{2R_{max}}{c} ]按照奈奎斯特采样定理ADC采样率至少是最高信号频率的两倍。所以最大不模糊距离和采样率之间的关系是[ R_{max} \frac{f_s \cdot c}{4S} ]注意这里的 ( f_s ) 是ADC采样率不是扫频带宽。很多初学者把带宽 ( B ) 当成了采样率这是第一个容易犯的错误。扫频带宽决定距离分辨率采样率决定最大不模糊距离两个概念别混。举个例子某车载/工业毫米波雷达扫频带宽 ( B 250 \text{ MHz} )扫频周期 ( T_c 50 \text{ μs} )那么调频斜率 ( S 5 \times 10^{12} \text{ Hz/s} )。如果ADC采样率 ( f_s 10 \text{ Msps} )最大不模糊距离就是[ R_{max} \frac{10 \times 10^6 \times 3 \times 10^8}{4 \times 5 \times 10^{12}} 150 \text{ m} ]如果你把带宽当成采样率代入算出来会比实际大几十倍调试时会出现“目标明明在五十米外距离维峰值却出现在几十厘米处”这种诡异现象。然后是距离分辨率。这个大家应该已经知道了[ \Delta R \frac{c}{2B} ]物理本质是FFT的频率分辨率有限在观测时间 ( T_c ) 内频率分辨率约为 ( 1/T_c )再把这个频率不确定性换算成距离就是上式。注意这里跟采样点数无关是物理极限。补零只能让频谱的显示更平滑并不能提高物理分辨率。2.2 窗函数、补零和峰值插值工程上的三件套理想情况下目标是一个单频信号FFT之后会是一个完美的尖峰。但实际因为观测时间有限频谱会有一个主瓣和一堆旁瓣。旁瓣会掩盖附近的小目标所以工程上几乎一定要加窗。我在实际调试里的习惯是默认先用汉明窗或汉宁窗。这两种窗的旁瓣衰减大约在 -43 dB 左右主瓣展宽约 1.44 倍。如果你有强弱目标相差 20 dB 以上的场景旁瓣抑制不够就得换成布莱克曼-哈里斯窗或者凯泽窗旁瓣能到 -90 dB 级别但代价是主瓣更宽距离分辨率进一步下降。补零的做法也很有意思。假设一次扫频采样了 ( M ) 个点直接做 ( M ) 点FFT频谱的栅格间距是 ( f_s/M )。很多时候你发现峰值落在两个频点之间读出来的频率不准。这时候可以把数据补零到 ( 4M ) 点再做FFT栅格就细了四倍看起来更“清晰”。但必须强调补零不改变频谱的实际包络它只是让离散频点更密相当于“描点更细”物理分辨率没有任何提升。想要真正的亚分辨率精度需要用峰值插值算法。我在实际项目里常用的是抛物线插值取峰值点以及左右各一个点用抛物线拟合得到真正的峰值位置。这个方法简单、计算量小在信噪比大于 10 dB 时能把距离精度做到分辨率的高十分之一左右性价比极高。下面这张表是我常用的距离维处理参数参考不同场景可以微调参数典型值影响扫频带宽 ( B )250 MHz距离分辨率 ( c/2B )扫频周期 ( T_c )50 μs频率分辨率 ( 1/T_c )ADC采样率 ( f_s )10 Msps最大不模糊距离FFT点数512/1024频谱栅格密度窗函数汉明/汉宁旁瓣抑制与主瓣展宽3. 速度是怎么测出来的多普勒原理与慢时间FFT3.1 单目标场景跨chirp相位差分法测速度最直观的思路是用相位。目标运动时相邻两个chirp的回波在同一个距离bin上的相位差会发生变化。设目标径向速度为 ( v )波长 ( \lambda )两个chirp间隔为 ( T_c )那么相位差[ \Delta \phi \frac{4\pi v T_c}{\lambda} ]只要测出这个相位差速度就出来了[ v \frac{\lambda \cdot \Delta \phi}{4\pi T_c} ]这个方法在单目标场景下非常高效计算量极小一个复乘取角度就搞定。但相位测量的前提是你已经通过距离FFT正确找到了目标所在的距离bin并且在两个chirp之间目标没有跨出这个bin。如果目标速度太快在扫频周期内移动超过一个距离分辨率单元相位法就失效了。工程上会限制最大速度保证 ( T_c ) 时间内目标位移不超过 ( \Delta R/2 )。还有个容易踩的坑相位差是通过反正切函数计算出来的它的范围是 ( (-\pi, \pi] )一旦真实相位差超过这个范围会出现多值的模糊也就是“相位卷绕”。所以相位法能测的最大不模糊速度是[ v_{max} \frac{\lambda}{4T_c} ]超过这个速度测出来的值会来回翻折需要结合多普勒FFT或目标运动状态做解模糊。3.2 多目标场景慢时间维FFT与距离-多普勒图实际的雷达场景里通常不止一个目标。这时候相位差分法就不够用了因为多个目标的回波会混叠在同一个距离bin里互相干涉你取到的相位是矢量和算出来谁的速度都不对。标准做法是引入“帧”的概念。一帧发射 ( N ) 个chirp对每个chirp都做距离FFT得到一个距离维的频谱。然后针对每个距离bin沿 ( N ) 个chirp方向再做一次FFT这就是慢时间维FFT或者叫多普勒维FFT。两次FFT之后得到的是一个二维矩阵横轴是距离维纵轴是多普勒维工程上叫距离-多普勒图RD图。每个峰值对应一个目标峰值在距离维的位置是目标的距离在多普勒维的位置对应目标的速度。速度分辨率和多普勒FFT的点数有关[ \Delta f_d \frac{1}{N T_c},\quad \Delta v \frac{\lambda}{2 N T_c} ]多普勒维的最大不模糊频率是 ( f_{d_max} 1/(2T_c) )对应的最大不模糊速度同样是[ v_{max} \frac{\lambda}{4T_c} ]这套方法里一帧内chirp的数量 ( N ) 决定了速度分辨率和多普勒维的信噪比增益。( N ) 越大速度分辨率越好但同时帧时间变长对运动目标来说目标在帧内可能跨越多个距离bin产生距离走动需要更复杂的运动补偿才能处理。所以 ( N ) 不是越大越好这是个权衡。我在做参数设计时一般这么起步根据最大速度指标用 ( v_{max} \lambda/(4T_c) ) 倒推 ( T_c )然后根据速度分辨率指标用 ( \Delta v \lambda/(2N T_c) ) 倒推 ( N )最后检查 ( N T_c ) 是否在可接受的帧周期内以及目标在帧内的位移是否小于半个距离分辨率。这套顺序走下来参数一般都能自洽。4. 距离-速度耦合锯齿波最大的坑4.1 单斜率锯齿波到底测到了什么如果你用的是单斜率锯齿波那么恭喜你距离FFT和多普勒FFT做完之后速度信息可以从多普勒维读出来但距离维的结果是有偏的。这是因为运动目标会给差频信号叠加一个多普勒频移。前面推导过差频频率本来应该是 ( S \cdot 2R/c )但目标以径向速度 ( v ) 运动时回波的真实频率与发射频率之间还有一个多普勒偏移 ( f_d 2v/\lambda )。于是实际观测到的差频变成了[ f_b S \cdot \frac{2R}{c} - f_d ]把这个“被污染”的差频代入距离公式算出来的距离就错了[ R_{measured} R - \frac{v \cdot f_c}{S} ]这里 ( f_c ) 是载频。举个数你就明白偏差有多夸张。载频 ( f_c 77 \text{ GHz} )扫频斜率 ( S 5 \times 10^{12} \text{ Hz/s} )目标速度 ( v 10 \text{ m/s} )相当于36 km/h算出来的距离偏差是[ \Delta R \frac{10 \times 77 \times 10^9}{5 \times 10^{12}} 0.154 \text{ m} ]看起来不大但如果目标速度到 30 m/s误差就有将近半米。在很多安全相关场景里这个误差是不能接受的。这就是锯齿波调制最著名的“距离-速度耦合”问题单从一个chirp的差频信号里你看不出这多出来的频率是距离贡献的还是速度贡献的。4.2 三角波调制一个简单有效的解耦思路要同时解出距离和速度最直接的办法是发三角波一个chirp里包含上扫频段和下扫频段。目标回波在这两个频段产生的差频分别记为 ( f_{b_up} ) 和 ( f_{b_down} )它们在物理表达式上多普勒项一个是负号、一个是正号[ f_{b_up} S \cdot \frac{2R}{c} - f_d ][ f_{b_down} S \cdot \frac{2R}{c} f_d ]联立解出距离和速度[ R \frac{c \cdot (f_{b_up} f_{b_down})}{4S} ][ v \frac{\lambda \cdot (f_{b_down} - f_{b_up})}{4} ]方法原理上很漂亮上下扫频的峰配对成功就能同时解出距离和速度。但实操里有几个问题要面对第一上下扫频的峰配对。如果场景里有多个目标上扫频有 ( P ) 个峰下扫频有 ( Q ) 个峰一一对应关系不确定就得用某种关联算法去配对通常基于能量相近、速度连续、目标运动模型做全局最优匹配计算复杂度比单锯齿波大一截。第二三角波的帧利用率低。上扫频和下扫频分别占用了原本可以连续发射chirp的时间相同帧时长下速度分辨率会打折扣。第三上下扫频的调频非线性如果不对称配对后的距离和速度精度会明显下降。所以实际应用中往往会在上扫频、下扫频之外再加一段波形用于校正这在雷达信号处理里叫“辅助扫频”。4.3 更进阶的思路多斜率调制与相位补偿三角波解耦有个前提假设在上扫频和下扫频这段时间里目标的距离和速度基本不变。这对机动车这种目标还行但遇到行人、自行车这类运动模式复杂的对象假设就勉强了。更稳健的做法是使用多斜率调制也就是在同一帧里安排多个不同斜率的chirp。每个斜率对应一条“距离-速度耦合方程”多组方程联立就能把距离和速度唯一确定下来。斜率的选取不是随便定的通常要求斜率之间有足够大的差异且互为质数或者接近质数比例避免方程组病态解。有些系统会用三种甚至四种斜率让解耦更稳定。另一种思路是相位补偿。既然我们知道多普勒频移的贡献量可以通过速度FFT先算出来那么先做一个粗测速然后用这个粗速度去修正距离维的差频最后再用修正后的距离值做更精确的速度估计迭代一两次。这种先粗后细的处理顺序在处理距离和速度耦合时非常常见。此外运动目标在慢时间内跨距离bin的问题也会进一步恶化距离-速度解耦的效果。处理手段是Keystone变换或者更高阶的运动参数估计但这些在轻量级处理器上往往是算力负担很多量产方案会在算法层面做简化。总之没有银弹都是工程权衡。我在一个模拟项目里实际对比过单锯齿波、三角波和三斜率调制同样的天线、同样的前端单锯齿波在30 m/s目标上距离误差约0.5 m三角波正确配对后的距离误差在0.1 m以内但多目标时分机率升高三斜率调制在代价是帧时间延长、计算量翻倍的情况下解耦效果最稳定。真要做量产品我的建议是不要一上来就堆复杂度先想清楚最小场景需要几个目标、多大的速度范围再决定用哪种波形。5. 工程调参实战与排查记录5.1 一套可以抄作业的参数设计流程每次拿到一个新的雷达硬件我的参数设计流程是固定的分享出来给你参考第一步从指标反推波形参数。假设要求最大距离 ( R_{max} 100 \text{ m} )距离分辨率 ( \Delta R 0.5 \text{ m} )最大速度 ( v_{max} 20 \text{ m/s} )速度分辨率 ( \Delta v 0.5 \text{ m/s} )载频 ( f_c 77 \text{ GHz} )。由距离分辨率得[ B \frac{c}{2 \Delta R} \frac{3 \times 10^8}{2 \times 0.5} 300 \text{ MHz} ]由最大速度得[ T_c \frac{\lambda}{4 v_{max}} \frac{0.0039}{4 \times 20} \approx 48.75 \text{ μs} ]取 ( T_c 50 \text{ μs} )则斜率 ( S 300 \times 10^6 / 50 \times 10^{-6} 6 \times 10^{12} \text{ Hz/s} )。由最大距离和采样率的关系[ f_s \frac{4 S R_{max}}{c} \frac{4 \times 6 \times 10^{12} \times 100}{3 \times 10^8} 8 \text{ Msps} ]留点余量ADC采样率取 10 Msps。由速度分辨率得帧内chirp数[ N \frac{\lambda}{2 T_c \Delta v} \frac{0.0039}{2 \times 50 \times 10^{-6} \times 0.5} 78 ]取 ( N 128 )这样慢时间FFT是2的幂计算友好速度分辨率还能更好一点。帧周期 ( T_{frame} 128 \times 50 \text{ μs} 6.4 \text{ ms} )对大多数场景够用。这套参数是我在调试中常用的典型值你可以直接拿来当初始值用。真正到现场一般只需要微调窗函数和检测门限。5.2 我踩过的五个常见坑第一个坑频谱峰值不在正确的距离位置而是整体偏移。排查步骤是先排除速度耦合把目标放在静止环境下测峰位如果静止时正确、运动时偏移那就是耦合问题改用三角波或多斜率调制。如果静止时也不对检查调频非线性校准表看斜率测量值是否和设定值一致。第二个坑旁瓣把弱目标盖住了。这是目标场景动态范围太大强弱目标反射系数能差30 dB甚至更多。处理方案是换低旁瓣窗比如布莱克曼-哈里斯同时考虑做距离维的杂波抑制比如零多普勒杂波滤除。这里有个容易被忽略的点换窗之后主瓣变宽两个相近目标的距离分辨率实际会变差要重新审视目标间的可分离性。第三个坑测速出现速度模糊。现象是目标实际在接近但不远处而RD图上目标峰出现在多普勒维的另一端像是“远离中又带个接近”。原因就是 ( v_{max} ) 不够相位差超过 ( \pi ) 导致折叠。解决思路很直接减小 ( T_c )但要注意 ( T_c ) 变小会降低差频频率分辨率间接退化距离测量精度所以还要同时提高ADC采样率或者增加FFT点数来补偿。第四个坑相位差分测速时相位跳变。工程上相邻chirp的相位差本身有一个很大的固定偏移如果处理链路中没有做相位归一化或者对消直接取相位差会得到随机值。后来定位到是混频器本振泄漏造成的直流偏置差频信号里有一个巨大的零频分量干扰了目标峰附近相位。处理办法是先用高通滤波或者调频相位抵消把直流项干掉再取相位。第五个坑强目标尾瓣影响远处弱目标。这种场景在桥上、隧道口特别多。强反射目标在距离维的旁瓣延伸几十个bin弱目标被淹没。我在一个模拟项目X里调试时用距离维加窗后依然压不下去最后发现是因为强目标回波造成了ADC轻微饱和产生了非线性而这个非线性展宽了频谱已经不是窗函数能压住的了。解决步骤是先降低增益或者用分段增益控制策略保证强目标不饱和再回来处理旁瓣。这些坑看起来散本质归类就三类参数匹配问题、算法能力不足问题、前端非线性问题。检查时按顺序捋一遍先确认硬件再确认参数最后优化算法不要一上来就在算法里打转。5.3 调雷达就像调镜头先有对焦再有构图说了这么多最后聊点个人体会。做FMCW雷达信号处理前期最容易犯的错误是手里拿着一个雷达却像用显微镜一样到处观察一上来就想搞复杂的检测算法、跟踪算法。我自己的经验是先把最基础的距离FFT做得干干净净确保单目标静止场景下峰值位置、幅度、相位都是稳定可重复的然后再测速度看看多普勒维的峰是否锐利、有无杂散。这就像用相机先确保对焦准确了、画面不糊了再去谈构图和后期。基础信号处理链路不干净后面接再高级的算法都白搭。这套“先对焦、再构图”的思路我后面在好几个项目里都用它带过新人效果都很稳。FMCW雷达是个看着原理简单、实际细节特别吃经验的领域希望这篇“日拱一卒”能帮你少走点弯路。下篇如果继续写我打算把CFAR检测门限和点迹凝聚的实战细节拿出来聊聊那又是一堆可以讲半天的坑。