如果你已经啃完FMCW雷达的第一篇笔记,大概率会有这种感觉:调频连续波的基本框架好像懂了,无非就是线性调频、混频、FFT三板斧,可一旦自己动手设计参数,或者面对一张不那么理想的距离-多普勒图,脑子里还是会冒出各种“为什么”。这篇文章就是冲着这些为什么来的。
这一篇我打算把范围收窄一点,聚焦在FMCW雷达原理里最容易让人似懂非懂的几块:差拍信号到底携带了什么、二维FFT是怎么把距离和速度同时捞出来的、速度模糊为什么绕不开、参数设计时又该怎么权衡。适合正在学习毫米波雷达基础、或者准备自己搭一套小雷达仿真/原型验证的朋友,读完你至少能回答这几个问题:为什么用FMCW而不用脉冲波、为什么中频频率能同时反映距离和速度、以及怎么根据指标倒推出系统参数。
1. 从脉冲雷达到FMCW:一次调制方式的“换轨”
很多教材讲FMCW之前会先铺垫脉冲雷达,我当时觉得挺绕的,后来自己做了一次对比实验才明白这样安排的用意:你以为FMCW只是把连续波加了调频,实际上它是把测距测速的难度从“时间测量”转移到了“频率测量”上,这个转移才是精髓。
1.1 脉冲雷达的核心矛盾:近距离与低功耗很难兼得
脉冲雷达的原理很直观:发一个短脉冲,等它打到目标再反射回来,通过来回时间差算距离。时间差Δt与目标距离R的关系是R = c·Δt/2,测的是时间间隔。问题在于,电磁波传播速度太快了,1米的距离对应的时间差只有大约6.7纳秒。你要测到厘米级精度,就得让接收机的时间分辨率达到亚纳秒级,这对硬件是实打实的挑战。
更麻烦的是功耗和占空比。脉冲雷达为了把发射能量集中在一个极短脉冲里,峰值功率通常要做得比较高,否则回波信号太弱。而很多应用场景——比如车载雷达、工业液位计、安防传感器——对功耗和成本非常敏感,你不可能天天背着一个大功率发射机到处装。连续波雷达恰好能避开这个坑:它一直发射、一直接收,峰值功率和平均功率差不多,信号能量被摊到整个周期里,接收机积分时间变长,信噪比自然就上来了。
1.2 连续波加调频的本质:把距离“翻译”成频率
单纯连续波能测速度,因为多普勒效应会让回波频率相对发射频率偏移一点,但测不了距离,因为相位差无法区分是目标远了还是近了一个整波长。解决办法就是给连续波加上频率调制,最常见的调制波形就是线性调频,也就是频率随时间线性上升的锯齿波或者三角波,每个线性段也叫一个chirp。
发射频率可以写成f_tx(t) = f_0 + S·t,其中S是调频斜率,表示每秒增加多少Hz。回波是发射波经过τ = 2R/c时间延迟后的版本。在接收端把发射信号和回波信号做混频,输出的差频(也叫拍频)大致是S·τ。这个差频是一个实实在在的频率值,比如S=100MHz/ms时,目标在30米处,τ约0.2μs,拍频约20kHz。你看,距离信息就转成了频率信息,而频率测量在工程上非常成熟——扔给一个FFT就能拿到。
这里我插一个自己的体会:刚开始学的时候老纠结“差频”是个理想化的频率,“实际信号明明是宽带调频的,混频后怎么可能是一个纯音?”后来想明白了,雷达只对回波中与发射信号相关的成分敏感,线性调频的回波和发射信号之间的差频确实是窄带的。这也是为什么FMCW接收机的中频带宽可以做得比射频带宽小得多,ADC采样率要求也因此大幅下降,硬件成本一下子友好很多。
2. 差拍信号里藏着距离和速度:混频输出的完整解读
知道差拍频率等于S·τ只是第一步,真正让我卡了很久的地方在于:当目标在运动时,回波的延迟τ本身会随时间变化,差拍信号里就不只含有距离信息了,还叠着多普勒频移。你如果没把这个耦合想明白,后面看二维FFT的结果时很容易摸不着头脑。
2.1 运动目标的差拍信号为什么是“两个频率叠加”
假设目标以径向速度v运动。发射信号为余弦波,频率为f_0+S·t,相位是积分的累加结果。回波信号等于发射信号延时τ(t)后的复制,而τ(t) = 2(R_0 + v·t)/c。对混频后的差拍信号做相位展开,它的瞬时频率可以近似为:
f_b = (2S R_0 / c) + (2v f_0 / c)
第一项是距离产生的拍频,第二项是载频上的多普勒频移。注意这里v的方向会影响第二项正负:目标靠近时回波频率偏高,拍频变大;远离时拍频变小。于是你得到的是一个带有频率偏移的单音信号,这个偏移量既和距离有关又和速度有关。
单条锯齿波的情况下,你只知道总拍频,无法把距离和速度分开。这个时候有两种常用出路:一是改用三角波调制,在上升沿和下降沿分别测出两个拍频,联立方程组解出距离和速度;二是用多个等间隔的锯齿波组成一个帧,在慢时间维上再做一次FFT,利用相邻chirp之间的相位差提取速度。第二种方式就是我们常说的二维FFT,现在绝大多数毫米波雷达方案都用它。
2.2 用一个数值例子直观感受数量级
理论公式不落到数字上等于白学。假设某雷达参数:起始频率f_0=77GHz,调频带宽B=500MHz,chirp时长T_c=100μs,调频斜率S=B/T_c=5×10^12 Hz/s。目标距离R=50米,靠近速度v=20m/s。
距离拍频:2S R/c = 2 × 5e12 × 50 / 3e8 ≈ 1.667MHz。
多普勒频移:2v f_0/c = 2 × 20 × 77e9 / 3e8 ≈ 10.27kHz。
总拍频约为1.677MHz(目标靠近,拍频略高)。这个例子至少告诉我们两件事:距离产生的拍频通常在MHz量级,而速度产生的频移只有几十kHz量级,如果不加区分,速度信息就像一片大海里的涟漪,很容易被淹没。这也是为什么要拿多个chirp一起做相位差分:单个chirp的FFT峰值上,一点点频移根本分不出来,但相邻两行chirp之间同一距离门的相位变化却是可以直接读取的。
2.3 I/Q采样:为什么差拍信号不能只取实数
还有个容易被忽略的工程细节:差拍信号的直流分量和多普勒符号问题。如果雷达只有一个实信号通道,混频输出经过FFT后,你无法区分多普勒频移是正还是负,因为实数谱是对称的。特别是目标靠近和远离时,本来拍频一个向上偏一个向下偏,实信号处理会把它们混在一起,速度信息就丢了。
解决办法是使用正交混频,输出I/Q两路信号,构造复数信号。这样频谱变成单边带,正负频率可以区分,多普勒的符号才能保住。我在第一次搭仿真时偷懒只用了实信号,结果目标明明在靠近,速度却是正的,怎么调参数都对不上,后来才意识到是缺了正交通道。这个坑在原理书上一般也就一句话带过,但做实际系统时非常关键。
3. 二维FFT之前,先想清楚距离分辨力和多普勒分辨力
很多教程直接扔给你:距离维FFT得到距离,速度维FFT得到速度。但如果你不清楚两个维度的分辨力分别由什么决定,到了自己选参数时必然抓瞎。这一节我逐步拆一下。
3.1 距离分辨力:为什么只看带宽
距离维上,中频信号是一个持续时间为T_c的单一频率,它的频率分辨力约等于1/T_c。由f_b = 2S R/c可以推得频率分辨力对应的距离分辨力:
ΔR = c/(2S·T_c) = c/(2B)
这就有意思了:分辨力只和调频带宽B有关,和chirp时长无关。想要看清单个目标的分辨程度,就得把带宽做大。77GHz车载雷达常用带宽从几百MHz到1GHz,对应厘米级分辨力;工业液位计如果带宽只有几十MHz,分辨力就只能是米级,只能测大目标的距离。带宽就是一把尺子的刻度密度,说得直白一点,B越大,你越能分辨两个靠得近的目标。
顺便说一句,为什么两个目标需要“分辨”,而不是“测不准”?因为如果两个目标的拍频分量靠得太近,FFT主峰会融成一个包络,你看到的是一个展宽的山峰,怎么都分不出到底是几个目标。这一条在密集多目标场景里特别重要,也是很多人仿真时发现“分开的目标怎么变成一团”的原因。
3.2 多普勒分辨力:速度维取决于相参积累时长
再看速度维。一个帧里有N个chirp,每个chirp在慢时间维上相当于相位采样,两次采样之间的时间间隔就是chirp重复周期T_c。对这个慢时间序列做FFT,频率分辨力约为1/(N·T_c),也就是相参积累总时长决定多普勒分辨力。
速度分辨力可以写成:
Δv = λ/(2·N·T_c) = λ/(2·T_frame)
这里λ=c/f_0是波长。直观理解:速度信息是以相位形式存储的,积累时间越长,你就能把相近的角速度分开。所以如果你想让两个速度相近的目标在帧内的峰值分开,就得增加chirp数量或者加长chirp周期,但代价是什么?下一节会谈到,最大的代价就是速度模糊。
为了把这两条对应关系刻在脑子里,我习惯用一个对照表:
| 指标 | 决定因素 | 直观理解 |
|---|---|---|
| 距离分辨力 | 调频带宽B | 尺子的最小刻度,B越大越精细 |
| 最大测量距离 | 中频带宽与采样率 | 不至于让高频拍频被低通滤掉 |
| 速度分辨力 | 帧时长T_frame | 观测时间越长,速度区分越细 |
| 最大不模糊速度 | 每两个chirp的间隔T_c | 采样间隔越密,可测速度范围越大 |
这张表基本够应付绝大多数初期的方案评估。
3.3 距离-多普勒图怎么读
二维FFT之后得到的是一个二维复数矩阵,横轴是距离门索引,纵轴是多普勒门索引。某个固定距离、固定速度的目标会在矩阵中对应位置产生一个尖峰。一般雷达调试软件会直接给你一张热力图,颜色越亮的点代表能量越集中。读图的时候,首先看峰值位置对应的距离门;其次看同一距离门附近纵向上有没有连续的能量带,那通常意味着存在一个持续运动的目标;如果图上出现像“栅栏”一样的等距条纹,大概率是多径反射或者镜面目标。
我自己初学的时候,最喜欢拿一个角反射器在雷达前面做实验,让它从远到近移动,数一数距离门的变化,再看速度门的方向是不是和运动方向一致。这一步看似幼稚,但真的能把抽象公式映射成直觉,强烈建议有条件的人拿实际设备测一把,没有设备也可以用仿真数据替代。
4. 速度模糊与距离耦合:系统设计里最大的坑
如果说前面那些是“原理”,那这一节就是“实战中一定会撞到的墙”。几乎所有基于线性调频连续波的系统,都会在某个环节被速度模糊问题困扰。我甚至觉得,看懂速度模糊的瞬间,才是真正理解了FMCW。
4.1 最大不模糊速度从哪来的
慢时间维是一个均匀采样序列,采样间隔是T_c。根据奈奎斯特采样定理,这个序列能无模糊表达的最大频率是1/(2T_c)。把这个频率映射到多普勒频率,再换算成速度:
v_max = λ/(4T_c)
举个例子,77GHz雷达,波长约3.9mm,如果T_c=100μs,那么v_max大约为9.75m/s,也就是约35km/h。汽车在路上轻轻松松超过这个速度,直接后果就是测出来的速度会“折叠”,一个移动目标可能被显示成完全错误的速度值。
我在一个模拟项目里就踩过这个坑:当时把chirp周期调得比较长,想提高距离分辨力的积分增益,结果目标在10米外以15m/s运动,图上显示的速度却是负值。那一刻真觉得数值看起来啥都不对,后来逐项排查才发现是模糊问题。所以,敲定T_c之前,一定要先算准v_max是否覆盖场景的极限速度。
4.2 距离-多普勒耦合与折叠的两种表现
速度模糊的直观表现有两种。第一种叫多普勒折叠:真实多普勒频率超过了1/(2T_c),在慢时间FFT上它会被混叠到一个别的位置,表现为速度符号反转或数值偏差。第二种叫距离-多普勒耦合:如果你用的是线性调频连续波,目标运动引起的距离变化会让距离门也跟着偏移,特别是高速目标,距离门误差可能直接跨过一个甚至多个距离单元。
耦合问题在三角波调制下更明显。上升沿和下降沿的拍频分别为f_b1 = f_R - f_D和f_b2 = f_R + f_D,联立解得f_R=(f_b1+f_b2)/2,f_D=(f_b2-f_b1)/2。如果目标速度过大导致f_D超过系统设定的范围,上面的求解就会出现符号错误,距离和速度同时报错,这就是所谓的“距离速度耦合”出问题的典型场景。解决办法之一是选择更短的chirp周期来扩大v_max,但后面会看到,这又会挤压和速度分辨力是同一批参数。
4.3 工程上的解模糊思路
既然模糊不可避免,工程上就有几套常用打法。第一种是多chirp间隔法,也就是在一个帧里交替插入两个不同T_c的chirp段,用两组不同v_max的测量结果做“解包裹”,找出真实速度。这种方法实现简单,但会牺牲一半的积累时间。第二种是调频斜率交替法,用不同斜率的chirp交替发送,系统联立两组方程也能解出真实距离速度,代价是中频带宽要留出更大余量。第三种是更为复杂的随机相位调制或稀疏阵处理,常见于高端雷达,但计算量会显著上升。
对于初学者,我的建议是:先别急着上复杂的解模糊算法,先用参数设计把v_max余量留够,然后通过多帧跟踪去消除速度歧义。简单说,两帧之间目标速度不会突变,可以在时间上平滑,这往往比单帧解模糊更稳健,也更贴近实际雷达后处理的写法。
5. 参数设计里的经典三角形权衡
终于到了“动手设计参数”的部分。前面所有原理,最终都要落到一张系统参数表里:带宽B、chirp周期T_c、每帧chirp数N、帧周期T_frame、中频带宽、ADC采样率。这些参数环环相扣,牵一发而动全身。
5.1 指标需求倒推参数路线
设计之初,先列需求,比如:最大距离200m,距离分辨力0.5m,最大速度80km/h(约22.2m/s),速度分辨力0.1m/s。然后就可以倒推:
距离分辨力0.5m → B = c/(2×ΔR) = 300MHz。
最大距离200m → 最大拍频 f_b_max = 2B R_max / c = 2×300MHz×200 / 3e8 = 400kHz,中频带宽至少要留400kHz以上,实际工程上会再留1.5到2倍余量,所以中频滤波器和ADC采样率都要覆盖到800k到1MHz左右。
最大速度22.2m/s → T_c ≤ λ/(4v_max) = 0.0039/(4×22.2) ≈ 43.9μs,所以T_c选40μs以内。
速度分辨力0.1m/s → 帧时长T_frame ≥ λ/(2×Δv) = 0.0039/(0.2) ≈ 19.5ms,这意味着N = T_frame / T_c至少需要约500个chirp。这个N有点偏大,算出来之后你就知道指标给得太苛刻了,现实里往往会放宽速度分辨力,比如调到0.5m/s,N降到100左右,帧率也能保持10Hz以上。
这个倒推过程特别适合在Excel里拉一个表,把几个公式都写上,然后拖参数看联动变化。原理书里给的公式再漂亮,不如亲手算一遍来得有感觉。
5.2 不同场景的典型参数取向
不同应用场景,参数取向差异很大,我用几个典型场景说明。
车载中长距雷达:通常B在500MHz上下,T_c在40到80μs,N在64到128,帧率10到20Hz,这套配置能做到距离分辨力0.3到0.6米,速度覆盖主流车速。重点是速度模糊的余量要够,所以T_c不敢拉太长。
工业液位计:目标几乎是静止的,速度维基本不关心,反而更看重距离分辨力和近距离盲区。这时候B可以适当大一点,但chirp周期可以很长,中频带宽要求低,系统可以做得非常便宜。
手势识别/隔空控制雷达:目标距离近、速度快、且动作复杂。这类雷达喜欢用小带宽(几十MHz),但T_c很短,N中等,重点是把v_max做大,同时把角度维度加进来,用多根天线形成空间分辨力。
5.3 一些容易忽略的参数坑
参数设计表面上是套公式,实际上有很多隐含约束。第一个是ADC采样率和中频带宽的匹配。如果你把B设得很大,R_max又拉得很高,最远目标的拍频会超过中频带宽,目标直接“看不见”,这不是算法能救回来的。第二个是chirp之间的留守时间,也就是调频回扫需要时间,如果你把T_c定得刚好等于理论极限,实际有效积分时间会缩水,速度分辨力会劣化,所以T_c要留一点裕量。第三个是发射通道的非线性:实际的压控振荡器频率响应不可能是理想直线,调频斜率非线性会造成距离维展宽,严重时分辨率明显变差,这时候要么做预失真校正,要么在算法里做去斜修正。
我自己做第一版参数表时,最大的教训是:别只盯单个公式,要把所有公式放在一起跑一个全局检查。比如B增大→中频带宽增大→ADC采样率升高→功耗和成本上升;N增大→帧时长拉长→速度更新率下降→实时性变差,这些联动关系必须同步评估,而不是孤立地追求某一项最优。
6. 从一套最小参数开始:走通一次完整的计算
原理讲了这么多,不如带着大家完整过一遍参数推导的实例。这个例子是我之前搭一个模拟车载雷达原型时用的,参数不算最优,但足以用来演示整套链条。目标:做一个最大测距50米、距离分辨力0.5米、最大测速25m/s、速度分辨力0.5m/s的线性调频连续波雷达参数设计。
首先定频率:选24GHz波段还是77GHz?为了演示用77GHz,波长λ≈3.9mm。
距离分辨力0.5m,B = c/(2×0.5) = 300MHz。因为实际要留一点裕量,我可以把B选为350MHz,反正VCO能拉得动。
最大测距50m,拍频上限 f_b_max = 2B R_max/c = 2×350e6×50/3e8 ≈ 116.7kHz。留1.5倍裕量,中频带宽取200kHz,ADC采样率至少要400kHz,实际用500kHz采样率,满足奈奎斯特。
最大测速25m/s,T_c ≤ λ/(4v_max) = 0.0039/(4×25) ≈ 39μs。取T_c=33μs,这样即使车速略微超一点也在容许范围,同时给回扫留了时间。
速度分辨力0.5m/s,T_frame ≥ λ/(2×0.5) = 3.9ms。取每帧N=128,则帧总时长T_frame = 128×33μs ≈ 4.22ms,对应的帧率约237Hz,速度分辨力为Δv = λ/(2×T_frame) ≈ 0.462m/s,满足要求。
到这里,三个核心指标都满足了:距离分辨力由B保证,最大测距由中频带宽保证,最大测速由T_c保证,速度分辨力由N和T_frame保证。这套参数组合看起来还挺舒服:帧率很高,适合实时性强的场景;但代价是FFT点数较多,处理器要扛得住128行chirp的二维FFT。
如果把同样需求改到工业液位计场景:最大距离提高到100m,速度范围降到1m/s以内,那T_c就可以大大放宽,比如T_c=5ms,N只要几行,算法负担瞬间变小,成本也低,因为可以换用更慢的ADC和中频带宽更窄的滤波器。这两种场景背后的取舍逻辑,恰恰是FMCW雷达方案设计的精髓——没有绝对的好参数,只有适不适合需求。
写到这里,我自己把“日拱一卒”的感觉又强化了一遍。每次从公式出发绕一圈再回到系统参数,都会发现自己对雷达的理解更立体一点。我建议你也别只停留在看文章,拿一套参数去写个简单的二维FFT仿真,哪怕只是把混频信号生成出来、做两层FFT、看到距离-多普勒图上的尖峰慢慢移动,那种从公式到图形的“卡扣感”是任何文字都给不了的。等到真踩过几次速度模糊和距离分辨力不足的坑,你会回来感谢今天算的每一遍表。