在毫米波FMCW体制雷达的信号处理链路里FFT大概是出现频率最高的一个名词。但坦白说大部分人对它的理解只停留在“输入时域波形、输出频谱峰值”这个应用层很少有人去深究为什么在FMCW里做一次FFT就等效于一次相干积累这个问题的答案恰恰藏在那个平时没人注意的门信号表达式里。这篇文章我会从一个基础chirp的信号模型出发把门信号的时域表达式、频域响应、以及FFT等效为相干积累的推导过程完整过一遍再延伸到工程参数设计、窗函数选择和常见坑位。适合刚接触毫米波雷达的入门工程师也适合那些FFT用了很久但没把原理吃透的嵌入式开发者。1. 先把FMCW处理链路串起来1.1 发射信号、回波信号与差频信号FMCW调频连续波雷达发射的是频率随时间线性变化的信号业内称之为chirp。一个chirp的瞬时频率从起始频率线性扫到终止频率扫频带宽记为B持续时间记为T_c。在复基带模型里发射信号可以写成下面这个经典形式s_T(t) A_T · exp(j·2π·(f_c·t (k/2)·t²)), 0 ≤ t ≤ T_c其中f_c是载频k B/T_c 是调频斜率。回波信号本质上是发射信号的延时版本如果目标距离为R那么单程时延就是 τ 2R/cc为光速。收发信号在接收端混频也就是相乘之后滤掉高频分量得到一个差频信号拍频信号s_B(t) A · exp(j·2π·(k·τ)·t j·φ)这个差频信号的频率 f_b k·τ (2B/(c·T_c))·R和目标距离R呈严格正比关系。所以FMCW雷达把测距问题转化成了测频率问题后面的整条信号处理链路——包括FFT、检波、恒虚警检测——全都是围绕这个差频信号展开的。这里有一步容易被忽略上面的模型假设目标在一个chirp内近似静止也就是τ基本不变。对于车载、安防、工业测距这类典型场景目标速度远不足以在几十微秒的chirp内产生明显的相位走动这个静态假设是成立的。如果目标速度极快比如弹道目标chirp内的相位走动会把差频信号的频谱展宽这时候要么缩短chirp时间要么引入专门的速度补偿算法。明白这个前提后面理解FFT为什么能等效为相干积累就很顺了。1.2 数字采样后的信号模型实际接收链路里差频信号经过低通滤波和ADC采样变成一个长度为N的数字序列。设ADC采样率为f_s一个chirp内采样N个点N f_s·T_c。采样后的信号模型是x[n] A · exp(j·2π·f_b·n·T_s j·φ) w[n], n 0, 1, ..., N-1其中T_s 1/f_s是采样间隔w[n]是接收机噪声工程上通常建模为零均值复高斯白噪声。到这里我们要做的核心工作就非常明确了在一段长度为N、被噪声污染了的复数序列里估计未知频率f_b。估计频率越准、抗噪能力越强雷达的测距精度和检测灵敏度就越高。这时候会有一个很自然的疑问为什么偏偏用FFT来做这个频率估计直接数过零点、或者做时域相关不行吗当然可以但FFT的优势在于它一次把所有可能频率假设都算完了而且它在数学上等价于一整套匹配滤波操作——这就是我们接下来要讨论的“相干积累”的雏形。1.3 “积累”到底在积累什么雷达领域里“积累”是个高频词它的含义是把多次观测的能量叠加起来让微弱的回波信号从噪声里“浮”出来。积累分为两类相干积累和非相干积累。相干积累要求信号相位对齐直接在复数域做幅度相加积累N个样本后信号幅度变成原来的N倍信噪比功率增益也是N倍这是理论最优的处理方式非相干积累是对幅度或功率做累加相位信息已经丢弃增益会明显下降通常只能换来根号N量级的幅度增益。而FFT做的事情本质上就是一组“按频率假设对齐相位再求和”的相干积累操作。每个FFT输出bin其实都在做一个匹配滤波判决假设真实信号频率是某个值把所有采样点的相位补偿掉再求和看看能积累出多大的能量。如果假设频率和真实频率一致信号同相叠加输出幅度最大如果假设频率偏离真实频率信号之间互相抵消输出被压下去。这既是FFT能用来测频的原因也是“FFT等效为相干积累”这句话的真正含义。2. 门信号表达式决定系统性能的隐形主角2.1 门信号的时域表达式在信号模型里我们只观测0到T_c这一段时间范围的差频信号其余时间一律认为是零。这个“只取一段、其余截断”的操作数学上就是乘一个矩形窗——在雷达领域这个矩形窗通常被称为门信号表达式为g(t) rect((t - T_c/2) / T_c) 1, 0 ≤ t ≤ T_c 0, 其他换句话说对连续的差频信号s_B(t)做观测等效于把它和门信号g(t)相乘s_B(t)·g(t)。门信号的持续时间T_c就是相干积累的时间长度。很多人写FFT代码时根本不会显式写这个矩形窗因为数字采样天然蕴含了“只取N个点”的操作但它的影响无处不在。为什么说它是“隐形主角”因为门信号直接决定了两个最重要的系统指标频率分辨率和信噪比增益。门开得越宽也就是chirp时间越长你“盯着信号看”的时间越久频率上分得越细噪声被积累抵消得越干净。这个逻辑和生活经验完全一致——你看一个匀速跑动的人观察时间越长对他的速度估计就越准。2.2 矩形窗的频域响应与旁瓣本质门信号g(t)的傅里叶变换是一个sinc函数G(f) ∫₀^{T_c} exp(-j·2π·f·t) dt T_c · exp(-j·π·f·T_c) · sinc(f·T_c)其中sinc(x) sin(πx)/(πx)。幅度谱 |G(f)| T_c·|sinc(f·T_c)|主瓣峰值在f0第一零点落在 f ±1/T_c。这个sinc形状看似简单却隐藏着许多工程问题的根源。我用一个生活化类比来帮助记忆你用门信号把一段信号“啪”地截断相当于把音量从正常瞬间切到零这个突变边界在频域里一定会产生一串旁瓣。这就好比演出结束后音响突然断电你听到的不只是安静还有那一瞬间的“咔嗒”冲击声——那就是旁瓣。矩形窗的第一旁瓣只比主瓣低约13dB也就是说一个强目标的旁瓣足以盖住另一个弱目标的主峰这在多目标场景里非常致命也是后面要讲加窗必要性的起点。2.3 门宽度带来的三个直接后果第一个后果是频率分辨率受限。sinc主瓣的两个第一零点之间宽度为2/T_c而工程上定义的最小可分辨频率间隔是Δf 1/T_c。对应到FMCW测距距离分辨率ΔR Δf·c·T_c/(2B) c/(2B)。这个结果值得留意距离分辨率只由扫频带宽B决定跟chirp时间长短、采样率高低都没有直接关系。带宽越大距离分辨越细这就是为什么现代毫米波雷达都在往大带宽方向走。第二个后果是旁瓣掩盖效应。矩形窗旁瓣只有-13dB强目标旁瓣会污染邻近距离门的检测结果。工程上一旦遇到“大目标旁边的小目标找不见”的问题第一步就该怀疑是矩形窗泄漏造成的。第三个后果是chirp边沿的数据质量最差。门信号的起始和结束时刻对应chirp的频段边沿射频前端VCO/PLL的锁相建立需要时间这段数据的线性度和相位噪声往往最差。成熟的雷达处理流程里通常会主动丢弃每个chirp开头和结尾各1%~5%的采样点再进入FFT。这个细节对测距精度的改善非常明显后面工程章节会再展开。3. FFT等效为相干积累推导与物理意义3.1 从DFT定义出发的完整推导现在进入正题。N点DFT的定义是X[k] Σ_{n0}^{N-1} x[n] · exp(-j·2π·n·k/N), k 0, 1, ..., N-1把前面采样后的信号模型代进去并假设信号频率f_b恰好等于第k₀个频点也就是f_b k₀·f_s/N。那么第k₀个FFT输出为X[k₀] Σ_{n0}^{N-1} [A·exp(j·2π·f_b·n·T_s) w[n]] · exp(-j·2π·n·k₀/N) A·Σ_{n0}^{N-1} exp(j·2π·n·(f_b·T_s - k₀/N)) W[k₀] A·N W[k₀]信号部分从单点幅度A积累成了A·N对应信号功率变成|A·N|² A²·N²。噪声部分W[k₀]是N个独立噪声样本的线性组合每个样本方差为σ²线性组合后方差变成N·σ²。于是输出端的信噪比是SNR_out (A²·N²) / (N·σ²) N·(A²/σ²) N·SNR_in结论清晰地摆在这里N点FFT之后落在正确频点上的信噪比功率增益正好是N倍换算成对数就是10·log10(N) dB。N128时增益21dBN1024时增益30dB。这就是“FFT等效为相干积累”的数学依据不是经验法则而是DFT定义直接推出来的结论。3.2 为什么说这个增益是“相干”的信号部分之所以能换来N²倍的功率增益关键在于每个采样点的信号相位在所选频点处被完全补偿从而实现了同相叠加。注意这个过程是线性的频点假设不同每个采样点需要补偿的相位旋转速度也不同。FFT内部做的事情就是对每一个可能频率假设做一次“相位旋转再求和”这与雷达信号处理里的经典匹配滤波在数学上完全同构。噪声则没有这种结构。白噪声在采样点之间的相位是随机独立、均匀分布的它在FFT累加时不会同相叠加只有功率方差按N倍线性累加。一边是信号幅度涨N倍一边是噪声功率涨N倍折算到信噪比就是功率增益N倍。信号获得的是“相干”的幅度增益噪声获得的是“非相干”的功率增益两者之差正是相干积累的信噪比收益来源。这也是为什么我之前一直在强调复数域处理如果先取模再累加相位信息被扔掉信号幅度不再线性增长积累增益就会大打折扣。那些在嵌入式上为了省事直接对ADC原始数据做平方律检波的方案本质上放弃了相干积累的红利系统性能会明显吃亏。3.3 门信号与FFT的统一视角把第2节和第3节串起来看事情就完整了。差频信号在时域先乘门信号g(t)再做FFT这两个操作分别是频域卷积和频域采样时域相乘s_B(t)·g(t) ⇔ 频域卷积S_B(f) ⊛ G(f) 离散采样后做DFT ⇔ 对连续频谱 S_B(f) ⊛ G(f) 以 1/T_c 为间隔采样当信号频率f_b正落在某个FFT bin上时卷积结果在主瓣峰值处被采样输出幅度最大当f_b偏离bin中心时输出幅度按sinc函数衰减。这就是“栅栏效应”和“扇形损失”scalloping loss的来源。换句话说门信号和FFT不是两个独立模块而是一套完整的“有限观测时间傅里叶分析”机制的两个侧面。这个统一视角还有一个实用推论FFT输出的各个bin并不是相互独立的频谱点而是sinc权重的采样结果。如果目标频率恰好位于两个bin正中间矩形窗的峰值会被压低约3.9dB。所以实际系统通常会对chirp数据做补零zero padding让频谱曲线更平滑或者用频谱插值算法比如抛物线插值、Chirp-Z变换来估计精确频率把扇形损失补回来。3.4 从一维FFT到二维、四维的扩展逻辑搞懂了一维FFT的相干积累本质扩展到多维就很自然了。FMCW经典处理链路是两维FFT快时间维也就是每个chirp内的采样点做距离FFT慢时间维也就是多个chirp之间的同一距离门数据再做一次FFT得到多普勒速度信息。慢时间FFT同样是一次相干积累积累对象是相同距离门上随chirp序号变化的相位序列速度分辨率由相干积累总时间M·T_c决定。这也就是4D毫米波雷达的技术底座在距离、速度两维FFT基础上再对MIMO天线阵的各个通道做角度维FFT形成距离-速度-方位-俯仰四维数据。角度维的处理本质上也是相干积累每个角度假设对应一组阵元相位补偿用FFT或数字波束形成做空间域的积累。理解了“FFT相干积累”这一条主线再看这些扩展就会觉得处处相通。4. 工程实现中的参数设计与常见坑4.1 从指标倒推chirp参数与FFT点数工程上做参数设计思路是从系统指标倒推而不是拍脑袋选数。假设要做一个探测距离40米的24GHz毫米波雷达模块先定扫频带宽B。距离分辨率要求ΔR c/(2B)如果B取250MHzΔR约0.6米对大多数测距和检测场景够用。想要0.3米分辨率带宽就得翻倍到500MHz射频和ADC的压力都会上来。最大探测距离R_max决定差频信号的最高频率f_b,max 2·B·R_max/(c·T_c)。差频信号必须满足采样定理f_b,max要低于f_s/2。注意这里f_s、T_c、N三者是绑定的N f_s·T_c。一个常见失误是把B选得很大、T_c又取得随意结果算出来f_b,max超过f_s/2远距离目标的频谱混叠整个数据全乱套。我习惯的流程是先定R_max和B算出f_b,max并留20%~30%余量再定f_s然后根据需要的距离分辨率和帧率来定T_c和N。T_c太短FFT点数不够频率分辨率变差T_c太长帧率下降实时目标跟踪跟不上。实际调参时建议把这些量做成一张参数表来回看改任何一个都要联动检查其他几个能省掉大量返工时间。4.2 窗函数怎么选才不亏矩形窗的旁瓣只有-13dB实际系统几乎都会加窗。我在项目里常用的选型参考如下窗函数主瓣宽度相对矩形窗第一旁瓣适用场景矩形窗1倍-13dB极致分辨率、无强目标遮挡汉明窗2倍-43dB综合目标检测默认选择海宁窗2倍-31.5dB配合频谱插值做高精度测频布莱克曼窗3倍-58dB强目标压制弱目标场景加窗是有代价的主瓣变宽意味着距离分辨率和速度分辨率下降。比如加了汉明窗后原本0.6米的分辨率实际会恶化到约1.2米。工程上就是在这两个矛盾目标之间做取舍——想要分辨邻近目标就少加点窗想要抑制强目标旁瓣就多加点窗。对于STM32F4这类MCU上的嵌入式FFT实现我建议直接工程默认用汉明窗计算量可以忽略综合性能最稳。还有一点经验如果后续要做频率插值或相位测距窗函数的尾部形状会影响插值精度海宁窗比汉明窗更平滑插值误差更小。而如果你做的是生命体征这类相位敏感测量加窗反而会引入幅度调制需要仔细评估有时候宁可用矩形窗加后面数字滤波。4.3 常见问题排查速查表把我在实际调试中反复踩过的坑整理成一张速查表遇到问题可以直接对照现象可能原因排查方向目标峰值旁出现成对假峰IQ通道幅度/相位不平衡检查正交混频通道校准参数静态目标频谱展宽门信号边沿非线性丢弃chirp首尾1%~5%样本远距离峰值幅度起伏大扇形损失scalloping loss补零或插值后提取峰值目标速度出现模糊慢时间维采样不足提高chirp重复频率频谱中心出现巨大直流峰收发泄漏或ADC偏置加高通滤波或扣除直流整体SNR比理论值低很多过早取模丢掉相位信息确认是否在复数域做积累这里特别想强调门信号边缘数据的问题。很多雷达驱动代码里会配置一个“样本丢弃”参数把每个chirp前几十个采样点直接丢掉。这个操作看起来浪费了数据实际上换来了更好的频谱质量因为chirp起始段VCO频率还没稳定线性度差、相位噪声大。我见过不少项目因为省这几个采样点FFT峰值旁边一直有杂散排查半天才发现是门信号边缘在作怪。4.4 从24GHz模块到4D雷达的工程延伸在STM32F4这类MCU上做嵌入式FFT频谱分析算是很多入门工程师的第一站工程实践。一般直接用CMSIS-DSP库的arm_cfft_f32函数做256点或512点复FFT配合相应的窗函数权重就能实现距离维处理。MCU资源有限FFT点数不会太大这时候窗函数的选择更敏感因为点数少意味着频率主瓣本来就宽。到了FPGA平台Vivado的FFT IP核支持流式和突发式架构点数可以做到4096甚至更高。FPGA上要特别注意IP核内部的缩放scaling schedule配置不同级间缩放策略直接决定输出端的定点动态范围和量化精度。我在这上面吃过亏缩放配置没算准大目标峰值直接被削顶小目标信号被量化噪声完全淹没折腾了两天才定位到是IP核缩放的问题。4D毫米波雷达则是在距离维和速度维FFT基础上继续在角度维做相干积累。再往外扩展雷达与摄像头的融合系统会把雷达点云和图像目标做时空同步帧结构设计直接影响两个传感器之间的时间对齐精度。这些高阶应用虽然领域不同但底层逻辑仍然离不开“门信号决定观测时长、FFT完成相干积累”这条主线。5. 延伸应用与我的实操心得5.1 生命体征检测里的相干积累最近比较火的毫米波雷达生命体征检测本质上是把FMCW的相位信息用到了极致。胸壁随呼吸和心跳产生的位移只有毫米级在距离FFT峰值处的相位上会留下微小的调制信号。对这个相位序列再做慢时间维FFT就能提取出呼吸频率和心跳频率。这里有个物理规律绕不开慢时间维FFT的相干积累时间决定了频率分辨率。呼吸频率约0.2~0.5Hz心跳约1~1.7Hz要分辨0.1Hz量级的频率间隔积累时间至少要10秒量级。这也是为什么这类产品的数据刷新率普遍不高——不是算法不行而是相干积累的物理需求摆在那里。理解了FFT和相干积累的关系这类产品设计中的很多“妥协”就都能看明白了。5.2 关于门信号与FFT的一点个人体会最后说点个人经验。我刚入门那会儿也是把FFT当成现成的谱分析函数直接用后来做弱目标检测时怎么调参数都压不住噪声才静下心把相干积累的推导完整推了一遍。推完之后才意识到自己之前对SNR增益的直觉一直是错的——总以为是根号N倍实际上相干积累是N倍。这个偏差放在系统设计里能差出好几dB的余量判断。所以我建议每个做雷达信号处理的同学无论用的是MCU、FPGA还是纯软件仿真都至少亲手推一遍3.1节那个DFT展开。不是为了背公式而是为了建立对整个信号处理链路的“手感”。当你能把门信号表达式、FFT和相干积累这三件事在脑子里合成一个整体的时候再去看参数设计、系统联调和问题排查思路会清晰很多。
阅读完成 · 觉得有帮助?