ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FMCW毫米波雷达测速全解析:从原理到工程实践

FMCW毫米波雷达测速全解析:从原理到工程实践 1. 从零理解FMCW测速为什么毫米波雷达都在用这项技术先聊点实际的。去年我给一个智能交通项目做车辆测速方案选型市面上能选的方案很多激光雷达精度高但怕雨雾、摄像头便宜但受光线影响大、超声波雷达倒是便宜但测距测速能力太弱。最后选来选去用的还是24GHz毫米波雷达模块核心就是FMCW技术也就是调频连续波。为什么FMCW在毫米波雷达里这么流行因为它能用一个相对简单的方案同时解决两个问题测距和测速。而且它的实现成本、体积、功耗都控制得住不像脉冲雷达那样需要极高的峰值功率和复杂的时间同步电路。我见过不少刚开始接触雷达的开发者一听到“FMCW”就觉得高深实际上它的物理原理并不复杂本质上是利用了电磁波的频率差和多普勒效应。简单说一下FMCW的工作方式雷达发射一个频率随时间线性变化的连续波这个波形通常叫“锯齿波”或者“三角波”。发射信号遇到目标后反射回来雷达接收端收到的是延迟后的回波信号。由于发射信号频率一直在变同一时刻的发射信号和回波信号之间就会产生一个频率差这个频率差叫“中频频率”或者“拍频”。目标越远回波延迟越大拍频就越大目标有径向运动时多普勒效应还会在这个拍频上叠加一个频移。通过对拍频信号做频谱分析就能把距离和速度都提取出来。这套方案特别适合毫米波频段。毫米波的波长短同等天线尺寸下波束更窄角度分辨率更好而且毫米波频段可用带宽大距离分辨率能做到厘米级。加上雷达本身主动发射电磁波不依赖外部光源全天候能力比摄像头强太多。这也是为什么现在的车载雷达、交通测速、工业液位计、无人机避障几乎都绕不开FMCW毫米波雷达。这篇博文我会把这套技术彻底拆开讲从测速原理、信号处理链路到实际工程中的参数配置、模块选型、常见坑点全部覆盖。适合刚接触雷达的硬件工程师、做信号处理的软件开发者以及做智能交通、安防、工业检测方案选型的产品经理。看完你至少能回答三个问题FMCW怎么测速、测速精度受什么影响、实际项目中怎么把这个雷达跑起来。2. 核心原理拆解单目标怎么测多目标怎么分辨2.1 混频器与差频信号FMCW测速的第一块基石要理解FMCW测速先得知道雷达内部发生了什么事。雷达前端会有一个压控振荡器VCO它产生频率随时间线性上升的微波信号这个信号的一部分直接从天线发射出去另一部分耦合进混频器作为本振信号。回波信号被接收天线捕获后也送进混频器混频器的输出经过低通滤波得到的就是“发射信号频率”与“接收信号频率”之差对应的低频信号也就是中频信号。这个中频信号是整个信号处理的起点。它携带了目标的距离和速度信息。理想情况下如果目标是静止的回波只是发射波形的延迟副本那么任意时刻的发射频率减去回波频率结果是一个固定的频率差正比于目标的距离。用公式表达就是中频频率 S × 2R / c其中S是扫频斜率单位Hz/sR是目标距离c是光速。比如扫频带宽250MHz、扫频时间1ms那么斜率S就是2.5×10^11 Hz/s。目标在10米处中频频率就是2.5×10^11 × 20 / 3×10^8 ≈ 16.7kHz。这个频率落在音频范围内所以模拟电路里做个低通滤波加放大再用ADC采样就行了。到这里你可能要问那速度信息从哪来答案是相位。目标一旦有径向运动回波的相位就会随时间变化这个相位变化率对应的频率偏移就是多普勒频移。在FMCW系统里多普勒频移会叠加到中频频率上导致上升沿测出的频率包含距离和速度的耦合项。所以只用一个上升沿的锯齿波无法直接把距离和速度分开需要配合多帧处理或者三角波调制。2.2 动目标测速从相位变化到多普勒频移实际测速时我们通常用的是“快时间-慢时间”两个维度的处理思路。每一次扫频chirp持续几十到几百微秒在单个chirp内采样得到的信号叫“快时间信号”它主要反映距离信息而同一个距离门上的相位在多个连续chirp之间的变化则反映目标速度。这个相位变化对应的频率放在慢时间维度上做FFT之后就是多普勒频率。多普勒频率 fd 与目标径向速度 v 的关系是fd 2v / λ其中λ是雷达工作波长。24GHz雷达的波长约12.5mm如果目标以30m/s108km/h的速度接近雷达多普勒频率约4800Hz。这个频率远小于中频距离频率所以慢时间维的采样率不需要太高帧率做到几十赫兹就够。这里有个重要的工程点锯齿波FMCW里单个chirp的峰值频率实际上是“距离频率 多普勒频率”。也就是说直接用单chirp的峰值频率算距离会引入速度误差。速度越大距离测量偏差越大。要解决这个问题常用两种手段一是用三角波调制上升沿和下降沿的频差分别包含正负符号不同的速度项联立方程就能同时解出距离和速度二是在连续chirp之间做慢时间FFT先解出多普勒频率修正距离项。实际产品中后者因为便于用2D-FFT统一处理用得更多。2.3 多目标分辨距离-多普勒二维FFT到底做了什么当场景里有多个目标时单个chirp的中频信号就是多个频率分量的叠加。比如前方50米有一辆车80米有一棵树100米有一个行人混频后的中频信号里就有三个不同频率的正弦波叠加。对快时间信号做FFT频谱上会出现三个峰峰值对应的频率分别换算成距离就能区分不同距离的目标。但如果有两个目标距离相同、速度不同呢这时候它们在快时间维上的频率相同只有一个峰区分不开。解决方法是把多个chirp的回波排列成二维矩阵横轴是快时间采样点纵轴是chirp序号。先在快时间维做FFT距离FFT得到距离-慢时间矩阵再在慢时间维做FFT多普勒FFT就得到距离-多普勒二维频谱图。每个目标在二维谱上都是一个独立的峰横坐标对应距离纵坐标对应速度峰值幅度对应目标反射强度。这就是常说的Range-Doppler Map简称RDM。我在实际项目里就是靠这张RDM图做目标检测的。FFT之后会得到一个二维复数矩阵幅度值存成一个数组接下来要做的就是在里面找峰。常规做法是恒虚警检测CFAR简单点可以直接设定一个自适应阈值或者固定阈值但多目标场景下固定阈值很容易漏检或虚警所以CFAR基本是标配。3. 工程实操从参数计算到跑通一版测速程序3.1 关键参数设计带宽、chirp时间、帧结构怎么定先说说我在24GHz雷达模块上常用的一组参数然后完整推导一遍。假设用的是24GHz ISM频段可用带宽200MHz左右有的模块能做到250MHz我们选择扫频带宽B200MHz单个chirp持续时间Tc102.4μs一个帧里包含M128个chirp帧周期Tf约15ms。距离分辨率δR c / (2B) 3×10^8 / (2×2×10^8) 0.75m。这个分辨率意味着距离相隔小于0.75米的目标在距离维上无法被FFT分开。速度分辨率δv λ / (2 × Tf) ≈ 0.0125 / (2 × 0.015) ≈ 0.42m/s。最大不模糊速度vmax λ / (4 × Tc) ≈ 0.0125 / (4 × 102.4×10^-6) ≈ 30.5m/s约110km/h满足绝大多数交通场景。最大不模糊距离怎么算主要看中频带宽和ADC采样率。如果ADC采样率fs1MHz根据奈奎斯特定理最大可分辨中频频率是500kHz对应最大距离Rmax fs × c / (4 × S)。这里的S B/Tc 200MHz / 102.4μs ≈ 1.95×10^12 Hz/sRmax 1×10^6 × 3×10^8 / (4×1.95×10^12) ≈ 38.5m。所以这套参数下最远能测到约38米正好覆盖停车场、十字路口这类短距场景。3.2 信号处理链路加窗、FFT、峰值搜索一步一步来下面给出一段我实际用过的Python代码用来处理雷达原始中频数据。核心步骤包括快时间维加窗FFT、慢时间维加窗FFT、生成RDM、做CFAR检测、提取目标距离和速度。这段程序的数据来源是24GHz雷达模块输出的IQ数据格式是“每个chirp采样点数 × chirp个数”的二维复数矩阵。为了方便说明代码里用的是模拟数据但处理流程和真实数据完全一致。import numpy as np from scipy.fft import fft, fftshift, ifftshift # 参数配置 c 3e8 # 光速 fc 24e9 # 雷达中心频率 B 200e6 # 扫频带宽 Tc 102.4e-6 # chirp持续时长 fs 1e6 # ADC采样率 Ns int(fs * Tc) # 单chirp采样点数102 M 128 # chirp数量 S B / Tc # 扫频斜率 lam c / fc # 波长 # 构建模拟中频信号目标1距离25m速度5m/s目标2距离12m速度-3m/s t_fast np.arange(Ns) / fs t_slow np.arange(M) * Tc R1, v1 25.0, 5.0 R2, v2 12.0, -3.0 data np.zeros((M, Ns), dtypenp.complex64) for m in range(M): tau1 2 * (R1 v1 * t_slow[m]) / c tau2 2 * (R2 v2 * t_slow[m]) / c phase1 2 * np.pi * (S * tau1 * t_fast (fc * tau1)) phase2 2 * np.pi * (S * tau2 * t_fast (fc * tau2)) data[m, :] np.exp(1j * phase1) np.exp(1j * phase2) 0.1 * (np.random.randn(Ns) 1j * np.random.randn(Ns)) # 步骤1距离维FFT加汉明窗抑制旁瓣 window_r np.hamming(Ns) range_fft fft(data * window_r, axis1) # (M, Ns) # 步骤2多普勒维FFT加汉明窗 window_d np.hamming(M) rdm fftshift(fft(range_fft * window_d[:, None], axis0), axes0) # (M, Ns) # 步骤3取幅度谱 power np.abs(rdm) # 步骤4简单CFAR检测二维滑窗 def cfar_2d(spec, guard2, train6, pfa1e-4): nr, nc spec.shape det np.zeros_like(spec, dtypebool) noise_map np.zeros_like(spec, dtypenp.float64) for r in range(train guard 1, nr - train - guard - 1): for cidx in range(train guard 1, nc - train - guard - 1): win np.concatenate([ spec[r-guard-train:r-guard, cidx-guard-train:cidxguardtrain1].flatten(), spec[rguard1:rguardtrain1, cidx-guard-train:cidxguardtrain1].flatten(), spec[r-guard-train:rguardtrain1, cidx-guard-train:cidx-guard].flatten(), spec[r-guard-train:rguardtrain1, cidxguard1:cidxguardtrain1].flatten() ]) noise np.mean(win) noise_map[r, cidx] noise thr noise * (pfa ** (-1.0 / len(win)) - 1) if spec[r, cidx] thr: det[r, cidx] True return det det_map cfar_2d(power) # 步骤5峰值提取与距离/速度换算 range_axis np.fft.fftfreq(Ns, d1/fs) * c / (2 * S) doppler_axis np.fft.fftshift(np.fft.fftfreq(M, dTc)) * lam / 2 det_idx np.argwhere(det_map) for ridx, cidx in det_idx: # 这里可以做峰值精化最简单的就是取邻近最大值 vr doppler_axis[ridx] R abs(range_axis[cidx]) if R 40 and abs(vr) 35: # 过滤越界目标 print(f检测到目标: 距离{R:.2f}m, 速度{vr:.2f}m/s)这段代码跑出来的结果能稳定检测到两个模拟目标。两个距离维上对应目标的峰值速度一正一负说明目标一个正在接近、一个正在远离。实际处理真实数据时需要根据雷达前端的增益、噪声底噪调整CFAR的参数否则虚警会很多。我在项目里试过guard cell设成2、train cell设成6到8在10米到40米范围内效果比较稳。3.3 24GHz模块实测选型要点与配置注意事项说回硬件。市面上24GHz毫米波雷达模块很多有只出中频模拟信号的、有内部带MCU直接出目标点迹的、还有走FMCW原始数据接口的。我用的是一款不带MCU的射频前端模组自己接ADC和处理器做信号处理这样灵活性最大。模块型号我不点了但选型有几点可以分享。第一确认VCO扫频线性度。如果扫频曲线非线性中频信号带宽会变大、频谱展宽距离分辨率会变差。很多模块会在内部做PLL锁定和线性校正选型时务必问清楚有没有这个功能。第二注意发射功率和天线增益。室内短距场景EIRP一般做到10到14dBm就够了过高的发射功率还会带来干扰合规问题。24GHz ISM频段的法规在各国有差异做产品出口要特别留意。第三天线设计直接影响角度分辨率和波束覆盖。有些模块用微带贴片阵列波束宽度30°×30°适合做车道级检测有些模块用单天线加透镜波束窄、增益高适合做定点测速。根据应用场景选不要盲目追求宽波束。参数配置上最容易被忽视的是chirp之间需要留出死区时间让VCO回扫稳定一般留5到10μs。我最初做板卡调试时死区时间设成0结果VCO频率还没稳定就开始了下一次chirp频谱上出现一大片杂散目标峰都快看不出来了。后来查了很多资料确认是回扫稳定时间的问题把Tc从90μs加长到110μs问题立刻解决。4. 4D毫米波雷达与目标检测这套测速原理怎么演进4.1 从2D到4D多出的一维是方位角还是高度角传统24GHz毫米波雷达的测速建立在“点目标”模型基础上。它把目标看成一个个反射点输出的是距离、速度加上天线阵的相位差还能估算水平角度这就是3D雷达。4D毫米波雷达则在水平角基础上增加了俯仰角也就是高度维同时通常还包含多普勒速度输出的是“点云”每个点都有距离、水平角、俯仰角、速度四个维度。4D雷达的信号处理链路里最核心的一点是天线阵列规模的扩大。比如采用MIMO技术用3发4收虚拟出12个通道配合角度FFT或超分辨算法就能把角度分辨率做到几度以内。角度估计之后每个距离-多普勒峰会再扩展成多个角度峰从而把空间上靠得很近的目标区分开。对测速逻辑来说4D雷达的速度测量依然基于多普勒原理但新的问题是一个目标会对应多个点云每个点云的速度可能略有不同比如车身不同部位对雷达的径向速度并不完全一致。这时候不能拿单点速度代表整个目标而要做聚类和跟踪滤波用目标整体的运动状态估计速度。这一步很多初学者会踩坑直接从点云里取最大速度当目标速度结果目标明明匀速行驶速度输出却抖得厉害原因就是车辆两侧靠近雷达的部位和远离雷达的部位径向速度分量不一样。4.2 目标检测与跟踪卡尔曼滤波让测速结果更平滑雷达输出的原始测速值即使是同一个目标相邻帧之间也会有几cm/s甚至十几cm/s的跳变。跳变来源很多多径反射、幅度闪烁、FFT栅栏效应、目标遮挡变化。因此实际测速系统里几乎都会接一个跟踪滤波模块。我最常用的方法是卡尔曼滤波。状态量取距离、速度、加速度观测值取雷达检测到的距离和速度。预测方程按匀速或者匀加速模型建模量测噪声协方差矩阵根据雷达到目标的距离远近动态调整——距离越远信噪比越低量测噪声设大一些滤波收敛更稳。做交通测速时还有一个和摄像头同步的问题。激光雷达、毫米波雷达输出的是目标的空间位置和运动速度摄像头输出的是像素坐标。要做“百度摄像头与毫米波雷达目标时空同步”就得把雷达输出的目标框投影到图像平面同时摄像头检测的目标框也反投影到雷达坐标系再通过交并比或匈牙利算法做匹配。时间同步上两个传感器帧率不同需要用外推或插值把时间戳对齐到同一时刻。这块我在项目里做过完整实现核心是校准外参矩阵和时间偏移量后面有机会单独写一篇。4.3 测速应用场景盘点从道闸到无人机都在用FMCW毫米波雷达测速的成熟场景我自己接触过的和业内常见的至少有四类。一是智能交通里的卡口测速和路口车流量统计。24GHz雷达装在路侧立杆上正对来车方向测速误差要求在±1km/h以内。这类场景距离近、角度窄参数配置相对简单但需要防雨雪衰减所以雷达前端增益余量要留足。二是工业领域比如行车、天车防碰撞和堆取料机定位。工厂环境粉尘大、光照差激光雷达容易失效毫米波雷达反而稳定。测速不要求很精细更关注相对距离的变化趋势FMCW的连续测距能力在这里体现得很充分。三是无人机定高和避障。无人机平台功耗和重量敏感24GHz模块重量做到几十克、功耗一两瓦就能提供厘米级的相对高度和速度估计辅助视觉和IMU完成降落、避障。四是安防周界和人员检测。4D雷达点云出来后能区分行走的人、奔跑的人和车辆靠的就是速度和微多普勒特征比如人跑步时四肢摆动会在主多普勒频率旁边产生边带这就是微多普勒效应。每种场景对帧率、带宽、功率的要求都不一样。做产品开发别一开始就上高规格模块先把参数算清楚再挑个合适的中等规格方案就够了。5. 调试中遇见的坑与实战排查思路5.1 速度测不准先查FFT栅栏效应和窗函数我遇到过最多的问题就是“测出的速度总差了零点几米每秒”。这个误差的来源很大一部分是FFT栅栏效应。多普勒FFT输出的频率分辨率是1/(M×Tc)如果目标真实的频率刚好落在两个频点之间FFT峰会在相邻两个频点上“泄能”峰值位置和真实频率有偏差。解决思路是对峰值位置做频谱插值比如抛物线插值或者更精细的Chirp-Z变换。加窗也是把双刃剑。汉明窗能压低旁瓣但主瓣变宽两个速度相近的目标更难区分。我在处理强反射目标附近的弱目标时曾经因为汉明窗旁瓣抑制不够弱目标直接被强目标的旁瓣淹没了。后来换成切比雪夫窗指定旁瓣抑制60dB效果立竿见影。但要注意切比雪夫窗主瓣更宽速度分辨率会下降典型做法是稍微增加chirp数M来补偿。5.2 静止杂波太强MTI滤波到底该不该加雷达做测速时周围静止的建筑物、地面、栏杆反射很强它们的多普勒频率是0集中在RDM的零速通道上。如果不处理CFAR检测会把很多静止物体当目标报出来虚警率很高。我的做法是分场景如果只关心运动目标比如交通测速那就在慢时间维上做一个MTI滤波器最简单的就是一阶差分y[n] x[n] - x[n-1]它能把零速分量陷掉如果既关心静止目标又关心运动目标比如安防里要同时知道“有车停下”和“有车开过来”我就保留零速通道但在CFAR检测时对这个通道单独降低检测门限避免漏检。这里要特别提醒MTI滤波会改变信号的相位关系对速度值本身也有影响。用一阶差分后目标的多普勒频率不变但频谱形状会略微变化幅度稍降。实测下来速度误差在可接受范围但如果你需要高精度测速最好还是在原始RDM上直接做检测再用跟踪滤波剔除静止目标。5.3 多目标速度错配解模糊与配对问题锯齿波FMCW有个天生的缺点距离和多普勒是耦合的。如果只用单帧上升沿chirp提取距离和速度那么测出的“距离频率”实际是距离和速度的混合项。我在调试一个双目标场景时两辆车在不同距离、不同速度结果解算出的目标位置完全错乱。原因就是没有区分快时间频率里的距离项和速度项。破解办法是使用三角波调制上升沿和下降沿的斜率一正一负把两次FFT的峰值频率联立起来。设f_up fr fdf_down fr - fd那么fr (f_up f_down)/2fd (f_up - f_down)/2。这样一个距离-速度对就可以唯一确定了。代价是三角波的扫频时间是锯齿波的两倍帧率会降低。在实际项目中如果目标是匀速直线运动三角波完全够用如果目标有强加速就需要引入多斜率波形或者多帧联合处理那是更复杂的课题了。5.4 环境干扰导致虚警怎么从频谱特征上过滤有一次在停车场做测试雷达前方是金属卷帘门卷帘门产生了强烈的多次反射回波RDM上出现了一串间隔均匀的“距离幻影”。这些幻影的位置满足整数倍的真实距离关系幅度逐次降低。我排查了一个多小时才意识到是多次反射。过滤器方面一是设置最小检测信噪比弱反射峰直接剔除二是检测“距离-幅度递减规律”识别多次反射的级联峰值三是做目标历史帧关联真实目标的轨迹是连续平滑的幻影通常跳变剧烈。第三种在工程里最实用配合卡尔曼滤波能极大减少虚警。还有一次雷达旁边有电机产生电磁干扰频谱上出现固定频率的窄带峰导致测速完全失效。解决方法是先做一个底噪采样在雷达开启后把固定干扰频点剔除或者在ADC端加带通滤波。这个问题的坑点在于底噪会随温度漂移最好每隔一段时间自动重新标定。6. 写在最后的几个实操建议如果你准备从零开始做一套FMCW毫米波雷达测速系统我给几点实用建议。第一先认真读完模块的数据手册。很多模块对chirp参数的范围、ADC采样率、中频带宽有硬性约束手册里写得很清楚。我见过不少项目写在配置寄存器里的参数明明超出了模块能力最后出来的数据一塌糊涂调节半天没用回看手册才发现问题。第二准备一个能输出标准信号的调试工具箱。做信号处理调试时用信号源模拟中频信号是一个很高效的办法。先不接真实目标用矢量信号源打出已知距离和速度对应的拍频信号检查整个处理链路是否正确。链路通了再上真实目标问题定位会快很多。第三善用频谱分析仪观察中频输出。混频器之后的信号先用频谱仪看一眼看是否有预期频率峰、有没有严重的杂散这比直接接ADC然后一步步排查FFT结果要直观得多。我在调第一版板卡时靠频谱仪几分钟就发现了VCO扫频不稳定的问题。第四不要用固定门限做CFAR以外的目标检测。环境一变底噪就变固定门限要么虚警要么漏检。哪怕是简单的单元平均CFAR也比固定门限强一个量级。最后分享一个我踩过的坑做车载场景测速时我用24GHz模块放在挡风玻璃后面测试速度一直不稳定后来发现玻璃对毫米波信号有衰减和多径反射。解决办法是把天线模块尽量贴近玻璃内侧避开加热丝区域同时把发射功率增加2-3dB。这些细节模块规格书和数据手册里都不会写只有实际装车测试才能发现。FMCW毫米波雷达测速原理说透了就那么几步发射扫频波、混频得中频、FFT提频率、CFAR找峰、跟踪滤波平滑。真正拉开差距的是对细节的把控参数怎么配、干扰怎么滤、相位怎么解、目标怎么关联。希望这篇博文能帮你少走一些我走过的弯路。
返回列表