FMCW 雷达这两年是真的火。车载毫米波雷达、工业测距传感器、人体存在检测、生命体征监测,几乎每个方向都会遇到 FMCW 这个词。不少朋友拿着 AWR2243 或者类似的毫米波雷达开发板,看到原始数据是一堆复数 IQ 样本,脑子里第一个问题就是——这堆数怎么变成距离的?其实答案就藏在“线性调频”和“拍频信号”这两个词里。这篇文章不打算堆公式吓人,而是尽量把 FMCW 雷达从发射线性调频信号,到回波混频产生拍频信号,再到 FFT 解出距离的完整链路讲清楚,同时结合我在实际调试毫米波雷达时踩过的一些坑,给你一条可以直接照着上手的路径。
1. 从线性调频到拍频:FMCW 测距的整体思路
1.1 为什么 FMCW 不直接测时间延迟
传统脉冲雷达测距的思路非常直观:发射一个窄脉冲,等它碰到目标反射回来,量一下发射和接收之间的时间差 Δt,距离就是 R = c·Δt/2。这个思路在原理上没有任何问题,但工程实现上很吃亏。脉冲越窄,距离分辨率越高,但窄脉冲意味着极高峰值功率,对发射器件和电源的要求都很苛刻。而且窄脉冲在时域上不好采样,硬件成本直线上升。
FMCW 换了一个角度:我不去精确测量一个短脉冲的飞行时间,而是把一个“频率会变化的连续波”发出去,然后通过比较发射信号和回波信号的频率差,反推出时间延迟。这个频率差就是拍频信号。因为发射信号的频率在已知地线性变化,所以频率差和时间延迟之间是简单的正比关系,而时间延迟又正比于目标距离。这样一来,FMCW 雷达就能以较低的峰值功率和普通采样率的 ADC,实现和脉冲雷达相近甚至更好的距离分辨率。
打个比方。你在一条匀速前进的传送带上往前走,身后放了一个标记物。传送带本身的速度在已知地增加,那么你和标记物之间的“相对速度差”就对应着你们之间的距离差。FMCW 里的发射信号就是这个不断变速的传送带,回波信号就是那个滞后了 τ 的标记物,测出的拍频就是你们之间的“速度差”。
1.2 线性调频信号(Chirp)的数学模型
典型 FMCW 雷达发射的是锯齿波线性调频信号,也叫 Chirp。它的频率从起始频率 fc 开始,以斜率 S 线性增加到 fc + B,持续时间为 T_chirp,然后瞬间跳回起始频率,开始下一个周期。B 是扫频带宽,T_chirp 是单个 Chirp 的持续时间。
发射信号的数学形式可以写成:
s_tx(t) = cos(2π fc t + π S t²),0 ≤ t ≤ T_chirp
其中 S = B / T_chirp,单位是 Hz/s,叫调频斜率。这看起来有点抽象,其实它的物理含义很直接:S 决定了频率变化的快慢,而频率变化的快慢直接决定了“同样的时间延迟能产生多大的频率差”。S 越大,同样的目标距离对应的拍频频率就越高。
这里有个关键点需要理解:FMCW 发射信号虽然是连续波,但因为它做了频率调制,实际上把一个很宽的频带 B 摊开在时间轴上了。距离分辨率最终由带宽 B 决定,公式是 ΔR = c/(2B)。这句话后面还会反复提到,因为它是整个 FMCW 测距体系里最核心的设计依据。
2. 回波混频与拍频信号:频率差是怎么被提取出来的
2.1 混频器到底在做什么
雷达天线收到目标反射回来的信号后,这个回波信号本质上就是发射信号延迟了 τ 之后的一个复制版本:
s_rx(t) = cos(2π fc(t-τ) + π S(t-τ)²)
这里 τ = 2R/c,也就是电磁波从雷达跑到目标再返回来的双程时延。如果目标是静止的,回波波形和发射波形是完全一样的,只是时间上晚到了 τ。
接下来就是 FMCW 雷达最核心的模拟处理环节:混频。接收信号和发射信号同时送入混频器,混频器把两个信号相乘,然后经过低通滤波器。学过通信原理的朋友都知道,两个余弦相乘会产生“和频”和“差频”两个分量。和频分量频率大约在二倍载频附近,直接被低通滤波器滤掉,剩下的差频分量才是我们要的东西——拍频信号。
可以这么理解混频器:它是一台模拟域的减法器,把发射信号的瞬时频率减去回波信号的瞬时频率。因为发射和回波的频率都在线性增长,减法操作就自动把“时间延迟τ”转换成了“频率差fb”,也就是拍频。
2.2 拍频信号为什么是单频固定频率
初学者最容易卡在这里:发射信号频率明明一直在变,为什么拍频是固定频率?
关键在于,回波信号和发射信号的调频斜率是完全相同的,两者在时间-频率图上就是两条平行线。发射信号的频率在t时刻是 fc + S·t,回波信号的频率是 fc + S·(t-τ),两者相减:
fb = fc + S·t - [fc + S·(t-τ)] = S·τ = (B / T_chirp)·(2R/c)
结果里根本没有 t,说明这个差值不随时间变化。两个频率“平行”地增长,差值恒定。就像两辆并排同速行驶的汽车,虽然绝对速度都很快,但相对速度为零,保持固定间距。
最后整理一下,拍频信号与目标距离的关系式:
fb = (2B·R) / (c·T_chirp)
或者反过来,测出拍频就能算出距离:
R = fb·c·T_chirp / (2B)
如果目标在运动,回波信号还会额外叠加一个多普勒频移,拍频会变成 S·τ ± fd。这也是后面做测速的基础。但在只讨论测距时,我们先把多普勒放在一边,专注理解静止目标的单频拍频。
3. 从拍频到距离:数字域信号处理链路完整拆解
3.1 距离维 FFT 与频点提取
得到拍频信号后,工作重心从模拟域转到数字域。雷达的 ADC 会以采样率 fs 对拍频信号采样,一个 Chirp 内采 N 个点。这些点通常是 IQ 复数格式的,因为 IQ 采样可以区分正负频率,为后续多普勒处理保留方向信息。
然后对每个 Chirp 的采样点做 FFT,这就是常说的距离维 FFT。FFT 的横轴是频率,对应拍频 fb;纵轴是幅度,代表该频率分量的强度。在频谱上找到峰值对应的频率 fb,套用上面的公式,就能得到目标的距离。
实际操作中,FFT 之前加窗函数几乎是必须的。我用的最多的是汉宁窗,它能把旁瓣压到 -40dB 左右,在检测多个目标时能有效避免强目标旁边出现假峰。代价是主瓣略微变宽,导致弱目标的分辨能力下降。如果检测场景里目标间距很近,可以换布莱克曼-哈里斯窗,压旁瓣效果更好,但主瓣更宽,需要根据具体场景权衡。
FFT 频率分辨率的物理极限是 Δf = 1/T_chirp,代入距离公式:
ΔR = Δf·c·T_chirp / (2B) = c/(2B)
这个式子再次确认了距离分辨率只和扫频带宽 B 有关,和 Chirp 周期、调频斜率都没关系。想提高距离分辨率,就去加大带宽。
3.2 最大测距范围与 ADC 采样率的约束
拍频信号的频率不能无限高,它受两个因素限制:中频链路的带宽和 ADC 采样率。根据奈奎斯特采样定理,ADC 能采到的最高拍频频率是 fs/2,所以最大无模糊拍频为 fb_max = fs/2。
代入距离公式,得到最大测距范围:
R_max = (fs/2)·c·T_chirp / (2B) = fs·c·T_chirp / (4B)
这里有一个新手极容易误解的地方:FMCW 雷达的 ADC 采样率并不需要覆盖射频带宽 B,因为目标信号已经被混频搬移到了低频。比如 77GHz 车载雷达有 4GHz 的射频带宽,但中频拍频信号通常只有几十 MHz,用 10~20MHz 的 ADC 采样就足够了。这就是 FMCW 相对脉冲雷达的一大优势——不用去采 GHz 级的信号,硬件成本大幅降低。
还有一个容易忽略的约束:中频信号链路上会有一个抗混叠低通滤波器,它的截止频率必须大于最大可能拍频。如果滤波器带宽设置得太窄,远距离目标的拍频会被滤掉,导致远距离目标检测不到;设置太宽,又会引入带外噪声。所以中频带宽、ADC 采样率、最大测距范围这三个参数是绑在一起设计的,不能单独调一个。
3.3 从距离维到距离-速度热图:多 Chirp 积累
单靠一个 Chirp 的 FFT 只能得到距离信息,而且单帧信号往往淹没在噪声里,所以实际雷达不会只发一个 Chirp。一帧数据里会包含 M 个 Chirp,每个 Chirp 做距离维 FFT 后,得到一个 M×N 的矩阵,横轴是距离 bin,纵轴是慢时间维。
对同一个距离 bin 上的 M 个点再做一次 FFT,就是速度维 FFT。因为运动目标在不同 Chirp 之间会产生相位变化,这个相位变化率对应的就是多普勒频率 fd,代入公式 v = λ·fd/2,就可以得到目标速度。两次 FFT 之后得到的就是雷达领域常用的距离-速度热力图。
在距离-速度热力图上,静止目标只出现在零多普勒附近,运动目标会偏到相应的速度通道里。所以即使目标距离很近,只要它存在相对径向速度,通过 2D FFT 就能把它和静止杂波分离开来。这也是 FMCW 雷达在车载场景中如此好用的核心原因之一。
得到热力图后,还需要做 CFAR 检测,也就是恒虚警率检测。CFAR 的作用是在不知道噪声功率的情况下,自适应地计算检测门限。CA-CFAR 是最常用的,取目标 bin 周围一圈参考单元的平均功率,乘以一个门限因子作为检测阈值。门限因子通常取 12~15dB,太小的话虚警率飙高,太大的话弱目标直接被吞掉。我调参时的方法是先看热力图的整体底噪水平,再反向推算门限因子,比拍脑袋调要快很多。
4. 工程落地:从原始数据到稳定测距的实操细节
4.1 AWR2243 原始数据读取的常见坑
TI 的 AWR2243 是我用的比较多的毫米波雷达方案。它的原始数据格式是复数 IQ,每个采样点包含实部(I)和虚部(Q),通常按 16 位有符号整数处理。DCA1000 采集卡导出的数据流一般按 I0, Q0, I1, Q1... 的顺序交织排列,解析时最典型的错误就是把 IQ 顺序弄反,或者把交织数据当成连续实数读。
我第一次用 AWR2243 时,距离谱上出现一串莫名其妙的幽灵峰,排查了整整一个下午。最后发现,问题出在读取时把 IQ 数据顺序搞反了。修正之后就正常了。所以拿到原始数据的第一步,一定要先验证格式排列,而不是直接往算法里灌数据。
还有一个坑是帧结构解析。一帧数据包含多个 Chirp,每个 Chirp 包含多个 ADC 采样点,采集卡可能还会在数据流里插入状态字头。解析时必须先根据雷达配置参数算出每个 Chirp 的采样点数、每个帧的 Chirp 数,再按这个结构去 reshape 数据矩阵。差一位字节都不行,否则后面所有 FFT 结果全是乱的。
字节序问题也需要注意。不同采集工具导出的数据可能是 little-endian 或 big-endian,可以用 Python 的 struct 模块检查前几个采样点的数值范围,如果幅度明显不对,大概率是字节序反了,用 byteswap 就能解决。这种问题通常会直接表现为 FFT 结果非常杂乱,而不是完全无信号。
4.2 LFMCW 和 FMCW 的关系,以及锯齿波与三角波的选择
很多文章把 FMCW 和 LFMCW 混着用,严格讲有区别。FMCW(Frequency Modulated Continuous Wave)是频率调制连续波的统称,调制波形可以是线性的、正弦的、阶梯的。LFMCW(Linear Frequency Modulated Continuous Wave)则是特指线性调频,是 FMCW 中最常见、最成熟的一种形式。工程上绝大多数场景直接说 LFMCW 就是指 FMCW,日常沟通不用太纠结,但概念上要清楚。
在波形设计上,最常用的是锯齿波和三角波两种。锯齿波的优点是每次扫频都是单调上升,频率和时间的对应关系简洁,配合多 Chirp 序列做 2D FFT,距离和速度的提取链路非常成熟。TI 毫米波雷达默认就是锯齿波加多 Chirp 帧结构。三角波则利用上扫频和下扫频得到的两个拍频,通过联立方程同时解出距离和速度。
实际项目中我基本默认选锯齿波,因为处理链路成熟、多目标检测时计算简单。三角波在多目标场景里会出现上下扫频配对错误的问题,处理起来很麻烦。只有在必须用单个 Chirp 解距离和速度的场合才会考虑三角波。
4.3 中频带宽、采样率与最大距离的匹配关系
实际配置 FMCW 雷达参数时,最需要想清楚的一组变量是调频斜率 S、ADC 采样率 fs 和中频带宽。最大拍频由最大测距范围决定,也就是 S·τ_max。如果同步叠加多普勒,还要加上多普勒频移。中频链路必须能通过这个最大拍频,ADC 采样率必须大于两倍的最大拍频。
假设雷达扫频带宽 B=4GHz,Chirp 周期 T=100μs,那么 S = 4e9/100e-6 = 4e13 Hz/s。想要最大测距范围 100 米,代入公式得到最大拍频 fb_max = S·2R_max/c ≈ 2.67MHz。中频带宽给到 5MHz,ADC 采样率至少 10MSPS,留出余量后实际用 12.5MSPS。这就是完整的参数计算过程,每一步都有明确依据,而不是拿现成例程里的配置一抄了之。
值得提醒的是,调频斜率 S 如果太大,即使目标距离不远,拍频也会很高,导致 ADC 采样率要求上升、数据量增大。所以在满足距离分辨率和最大测距范围的前提下,尽量把 S 调小一点,能够缓解采样和存储压力。
4.4 相位噪声、DC 偏移和系统延时校准
工程调试中,很多测距异常并不是算法问题,而是模拟前端的非理想特性。相位噪声是最常见的隐性杀手。本振或锁相环的相位噪声会直接抬高拍频信号的噪声底,目标越远越明显,表现是距离谱底噪升高、谱峰展宽。改善手段包括选用相位噪声更低的本振源、优化电源去耦、或者在中频链路加窄带滤波器。
DC 偏移也经常被忽略。混频器输出端会有一个直流分量映射到距离零频附近,因为 0Hz 频率就对应零距离。如果直接看距离谱,这个直流峰会盖住近距离目标信号。业内处理方式一般是距离维 FFT 之前先把 ADC 数据的平均值减掉,或者在信号链路中加高通滤波器。CFAR 检测时,前几个距离 bin 通常也直接屏蔽掉。
系统延时校准是提高绝对测距精度的关键。实际雷达存在器件延时、线缆延时等不可避免的系统时延 τ0,公式里的 τ 应该是 2R/c + τ0。我通常会在已知距离位置放一个角反射器,实测拍频反推 τ0,然后把补偿值固化到软件里。这个操作能显著提升距离测量的线性度和绝对精度,尤其在工业测距场景下几乎是必须步骤。
5. 常见问题速查:从原理到现象到解决思路
5.1 典型故障排查速查表
实际调试中遇到的距离测量问题,绝大多数可以归为表里的这几类:
| 现象 | 可能原因 | 处理方向 |
|---|---|---|
| 距离谱出现大量假峰 | 天线收发隔离度不足、混频器非线性、电源干扰 | 检查天线布局,增加隔离,优化电源去耦 |
| 目标距离数值跳变 | SNR 过低、CFAR 门限因子不当、窗函数旁瓣抬升 | 增加积累帧数,调整 CFAR 因子,加窗抑制旁瓣 |
| 近距离目标检测不到 | 混频器 DC 偏移、收发泄漏抬高零频底噪 | 时域去均值、屏蔽零频 bin,改善收发隔离 |
| 远距离目标丢失 | 发射功率不足、目标 RCS 太小、中频带宽过窄 | 提高 chirp 数量,增加多帧积累,放宽中频带宽 |
| 拍频频谱出现镜频 | IQ 两路幅度相位失衡 | 做 IQ 校准,提取镜频抑制参数 |
| 温度漂移导致距离偏移 | 晶振频率漂移、B或S 变化 | 增加温度补偿,定期用参考目标校准 |
这张表本质上覆盖了 FMCW 雷达从射频前端到数字信号处理的全链路问题。多数情况下先按照“模拟前端—中频采样—数字处理”的顺序逐层排查,能节省大量时间。我最常犯的错误是一上来就怀疑算法,结果锅全在硬件端。
5.2 实测中最容易忽视的两个细节
第一个是窗函数的选择会直接影响目标检测效果。矩形窗旁瓣只有约 -13dB,如果一个强目标旁边有弱目标,强目标的旁瓣就会把弱目标完全淹没。我习惯默认加汉宁窗,因为它主瓣宽度和旁瓣抑制之间比较均衡。如果两个目标距离差距很小,需要更高分辨率,再换回矩形窗并配合 CFAR 屏蔽策略,而不是盲目牺牲检测能力。
第二个是速度维 FFT 和数据排列的配合。做速度维 FFT 时,要确保每个距离 bin 上的慢时间数据是等间隔采集的,也就是各个 Chirp 之间时间间隔均匀。如果一帧里因为丢包或数据解析错误导致某个 Chirp 缺失,整体相位序列会断裂,速度谱上一片噪声。解析时要做好数据完整性校验,宁可丢掉当前帧,也不能把错位数据送进 FFT。
5.3 距离精度和分辨率的验证方法
拿到了一组能跑的测距结果后,强烈建议用可控实验验证一下系统性能。最简单有效的方式是用角反射器或者金属板,放置在多个已知距离处,比如 1m、3m、5m、10m,分别记录测量值。把测量距离作为纵轴、真实距离作为横轴画出来,线性拟合后能看到系统的比例误差和偏移量。比例误差通常来自晶振偏差,偏移量则来自系统延时。
距离分辨率的验证则要准备两个间距较小的目标,逐步缩小间距,观察距离维 FFT 上是否能形成两个清晰峰。当两个峰刚好合拢的时候,这个间距就是当前系统实测的距离分辨率。这一步能直观验证 B 的设计是否满足预期,也能发现天线波束宽度是否有额外限制。实测中如果分辨率远差于理论值,先查扫频带宽的配置是否正确,再查中频链路带宽会不会限住了拍频信号。
最后说个我自己养成的习惯。拿到一块新的雷达板,我不会直接跑应用代码,而是先做三件事:读原始数据验证 IQ 格式和帧结构、放一个角反验证距离公式、做一次线性度标定。这三件事做完,雷达基本处于“可用状态”,后面再写业务逻辑才有底气。很多人一上来就调 CFAR、调聚类参数,却连距离公式对应的常数都没有校准确,最后问题永远说不清。FMCW 测距这件事,原理搞懂了,参数设计就有了直觉,而这个直觉才是真正值钱的东西。