2、毫米波雷达原理:FMCW雷达测距测速原理、雷达信号处理流程、目标检测与点云生成
好,咱们进入正题。毫米波雷达,尤其是FMCW体制的,在自适应巡航里扮演的角色,说白了就是「眼睛」——而且是那种不怕黑、不怕雾、不怕雨雪的眼睛。我最早接触FMCW雷达是在2016年做ADAS预研项目,当时被一堆中频信号和傅里叶变换搞得头大。后来摸透了,发现核心逻辑其实很清晰。
2.1 FMCW雷达测距测速原理
FMCW,全称是Frequency Modulated Continuous Wave,调频连续波。它不发射脉冲,而是发射频率随时间线性变化的连续波。你想想看,就像你对着山谷喊一声,回声的频率和你的声音不一样——因为多普勒效应。FMCW雷达就是利用这个差异来算距离和速度的。
具体怎么做的?发射信号频率从f0开始,以斜率S线性增加到f0+B(B是带宽),然后重复。这叫一个chirp。发射信号碰到目标反射回来,和当前发射信号混频,得到中频信号。这个中频信号的频率f_IF,和目标的距离R成正比:
f_IF = S * (2R / c)
其中c是光速,S是调频斜率。你看,距离越远,中频频率越高。这就是测距的基本原理。
关键公式:距离分辨率 ΔR = c / (2B)。B越大,分辨率越高。我见过不少工程师为了省成本压缩带宽,结果两个目标分不开,这就是典型的「省钱省出问题」。
那测速呢?如果目标在运动,回波信号还会有一个额外的多普勒频移。这时候,我们发射两个相邻的chirp,比较它们中频信号的相位差Δφ。速度v和相位差的关系是:
v = λ * Δφ / (4π * Tc)
λ是波长,Tc是chirp周期。嗯,这里要注意:相位差测量有模糊问题,速度不能太大,否则会卷绕。我在高速公路上测试时遇到过,一辆车从旁边超车,速度显示突然跳成负数——就是相位卷绕了。
2.2 雷达信号处理流程
从天线收到信号到输出目标点云,中间要经过好几步。我习惯把它分成四个阶段:
- 混频与中频采样:接收信号和发射信号混频,得到中频信号。然后ADC采样,变成数字信号。
- 距离FFT(1D FFT):对每个chirp的中频信号做FFT,得到距离维的频谱。峰值位置对应目标距离。
- 速度FFT(2D FFT):对多个chirp的同一距离门做FFT,得到速度维的频谱。峰值位置对应目标速度。
- 恒虚警检测(CFAR):在距离-速度二维频谱上做目标检测,提取有效目标。
我建议你画一张流程图,把每个阶段的输入输出标清楚。我自己做项目时,经常在2D FFT之后先看一眼热力图——如果背景噪声很均匀,说明信号质量不错;如果出现大片亮斑,那多半是干扰或者自激。
个人经验:ADC采样率的选择很关键。采样率太低,距离分辨率会下降;太高,数据量爆炸。我一般按中频信号最高频率的2.5倍来选,留点余量。
2.3 目标检测与点云生成
做完2D FFT,我们得到的是一个距离-速度二维复数矩阵。接下来要从中找出真正的目标。这一步叫恒虚警检测,简称CFAR。
CFAR的原理很简单:对每个待检测单元,用周围单元估计噪声功率,然后设定一个自适应阈值。超过阈值的,判为目标。常用的有CA-CFAR(单元平均)和OS-CFAR(有序统计)。
我曾经在一个项目中,用CA-CFAR在隧道里疯狂虚警——因为隧道壁的回波太强,把噪声估计抬高了,导致真实目标反而漏检。后来换成OS-CFAR,问题解决了。所以你看,算法没有绝对的好坏,得看场景。
检测到目标后,我们得到的是距离、速度、角度(通过多天线MIMO技术获得)三个维度的信息。把这些信息组合起来,就形成了点云。每个点云点包含:
| 参数 | 含义 | 典型范围 |
|---|---|---|
| 距离 | 目标到雷达的直线距离 | 0.5m ~ 250m |
| 速度 | 目标的径向速度 | -100 m/s ~ +100 m/s |
| 方位角 | 目标在水平方向的角度 | -60° ~ +60° |
| 俯仰角 | 目标在垂直方向的角度 | -15° ~ +15° |
| 信噪比 | 目标强度与噪声的比值 | 10dB ~ 40dB |
点云生成之后,还要做一步聚类和跟踪。因为同一个目标(比如一辆车)可能会产生多个点云点,需要把它们合并成一个目标。常用的聚类算法有DBSCAN和基于距离的欧式聚类。
避坑指南:我曾经在雨雪天气测试,发现点云里出现大量「幽灵点」。后来排查发现,是雨滴反射造成的。解决办法是提高CFAR的检测门限,或者加入多帧确认机制——连续两帧都检测到才认为是真实目标。
最后,点云数据会送给后面的跟踪模块和融合模块。在自适应巡航中,毫米波雷达的点云是核心输入之一,和摄像头、激光雷达的数据融合后,才能得到稳定可靠的环境感知结果。
嗯,这一章的内容就到这里。FMCW雷达的原理听起来复杂,但拆开来看,无非就是「发射-接收-混频-FFT-检测」这几个步骤。你只要把每个步骤的物理意义搞清楚,代码实现就是水到渠成的事。