资讯详情

便携式FMCW雷达实战:24GHz射频前端与距离多普勒信号处理

📅 2026/11/2 18:30:32 | 华诺云谱 👁 阅读
便携式FMCW雷达实战:24GHz射频前端与距离多普勒信号处理
我的这个小项目叫 PLFM_RADAR全称是 Portable LFM Radio Detection and Ranging翻译过来就是“便携式线性调频雷达”。听起来像军火其实它就是一台放在桌面上、用 24GHz 射频前端和低成本 ADC 做出来的测距测速雷达。整个过程从硬件选型到信号处理全是我一个人折腾的前前后后大概三个月最后能稳定测出 3 米到 30 米的静止目标距离和行人的径向速度。今天这篇不谈理论推导只讲我实际怎么把一台“能跑”的雷达变成“跑得稳”的雷达包括硬件链路怎么搭、信号处理顺序为什么是那样、以及哪些坑是看着数据就能直接劝退人的。这个项目适合三类人想上手微波雷达但没预算买开发套件的学生、正在做 FMCW 雷达产品原型验证的工程师以及手里有软件无线电外设、想搞清楚距离多普勒处理细节的爱好者。我尽量把每一步都写得能直接照着做少让你们重走我这三个月的老路。1. 为什么叫 PLFM_RADAR一个“够用就行”的雷达实现1.1 项目想解决的问题雷达听起来是个很“高精尖”的东西但需求一旦落到“只要测距测速”这件事门槛就会低很多。市面上能买到的 24GHz 雷达模块很多可绝大多数是黑盒方案厂商只给你一个封装好的测距输出内部处理算法完全看不到。我想学的不是“怎么调别人的模组”而是“从硬件回波到距离速度图”整条链路的核心结构所以才决定自己做一台 PLFM_RADAR。另一个问题是成本。完整的 24GHz 雷达开发板动辄几千块而且板载的 MCU 已经帮你把 FFT 和 CFAR 做完了学不到什么东西。我的目标是把整机成本控制在 800 元以内并且所有信号处理代码都由自己写从原始 I/Q 中频数据到最终的检测结果每一步都可复现、可修改。1.2 设计指标和功能边界做项目之前我先把功能边界划清楚只做单通道连续波线性调频雷达目标是在室内外能检测 3 到 40 米范围的物体同时测出径向速度。不追求成像、不追求多目标高精度分辨也不做测角。指标定下来之后选型和解算就都有了边界。参数项设计值说明中心频率24.125 GHz免费频段天线体积小扫频带宽 B250 MHz决定距离分辨率约 0.6 米调频周期 T_c2 ms锯齿波单一 chirpADC 采样率4 MSPS覆盖中频带宽余量充足最大测距范围40 m由中频带宽和采样率共同决定测速范围±5 m/s由帧内连续 chirp 数量决定这些参数不是拍脑袋定的而是从“家里顶多几十平米、测试走廊最远 30 米”这个实际场景反推的。如果你要做更远的雷达采样率和中频带宽都要重新算后面我会展示怎么算。1.3 整体链路一句话说明PLFM_RADAR 的完整链路可以概括成调制信号源产生锯齿波控制电压驱动压控振荡器VCO产生 24GHz 线性调频信号一部分经功放从发射天线辐射出去另一部分耦合进接收混频器作为本振接收天线收到目标回波后经过低噪声放大与同一个本振信号在混频器里做去斜处理输出一个频率远低于射频的差频信号这个差频信号经过放大、滤波后进入 ADC最后在 PC 上用 Python 做距离 FFT 和多普勒 FFT得到目标的距离与速度信息。一句话总结发射和接收用同一个 VCO 扫频目标回波延迟会让差频信号成为一个带频率信息的单音测出这个单音的频率就知道距离了。速度信息则是通过观察多个连续调频周期之间相位的变化而得到的。核心看起来简单实际做起来每一环都有坑。2. 硬件选型把“毫米波雷达”拆成看得懂的模块2.1 核心器件的三个选择第一是射频前端。我最终选择了 24GHz 频段的集成收发芯片方案也就是把 VCO、混频器和部分放大器封装在一个芯片里这样做比用分离元件搭 X 波段模块更容易上手天线也用微带贴片阵列不用自己一点一点调试波导结构。第二是 ADC。一开始我想用 STM32 内部 ADC采样率最快也就 2.4MSPS 左右分辨率 12bit用来做测距够但做多普勒经常感觉相位噪声大。后来换成了外置 4MSPS、14bit 的并行 ADC直接挂在 STM32 的 FSMC 总线上读数据实测噪声水平比内置 ADC 好了不止一个量级。第三是信号源。这里有个容易忽略的点VCO 需要的是一个模拟控制电压而不是数字信号所以必须用高精度 DAC 输出去驱动。我用的是 16bit 的 SPI DAC输出范围 0 到 3V控制锯齿波斜率。如果手头没有高速 DAC用 MCU 的 PWM 加 RC 低通滤波也能顶住但线性度会差需要标定。2.2 发射链路和去斜接收链路怎么搭发射链路我用了一颗集成式 VCO 芯片输出功率在 10dBm 左右经过一个 24GHz 功放后到 14dBm直接馈给 8×1 的微带贴片天线阵列。VCO 的控制端接 DAC调频周期由软件定时器控制。这里要注意VCO 的控制电压与输出频率并不严格线性实际扫频曲线会有凹凸所以后面要做频率校准。接收链路是典型去斜接收机结构。接收天线收到的回波先进入低噪声放大器增益约 20dB然后送入混频器射频端口。本振端口直接接 VCO 的耦合输出混频器输出端经过一个低通滤波器后就是差频信号。所有接收放大链路必须是交流耦合因为零频附近会有很强的发射泄漏信号直流耦合会把后级放大器直接推饱和。2.3 中频信号链与ADC采集的带宽匹配差频信号的频率范围决定了中频放大器带宽。我的参数是扫频带宽 B 250 MHz调频周期 T_c 2 ms扫频斜率 K B / T_c 1.25 × 10^11 Hz/s距离 R 对应的回波延迟 τ 2R/c差频频率 f_b K × τ 2KR/c算一下R 40 米时τ 266 nsf_b 33.25 kHz。也就是说我需要的最大中频频率才 33kHz但发射泄漏和低频噪声都集中在 0 到几百赫兹所以中频放大器带宽设在 100Hz 到 100kHz 就够了。ADC 采样率 4MSPS 显然有余量反而要担心的是中频放大器增益过高导致噪声地板抬起来。这个带宽匹配过程很关键一开始我贪心用了带宽 1MHz 的运放结果噪声巨大信号全是毛刺。换成 100kHz 低通之后信噪比立刻肉眼可见地提升。雷达接收机不是通带越宽越好的通带宽度只要刚好覆盖最大差频频率多余带宽都是在给噪声送钱。2.4 时钟分配与同步多普勒测量需要知道每个 chirp 的起始时刻所以 VCO 扫频启动信号和 ADC 采样时钟必须同步。我用 STM32 的定时器输出一个脉冲一路触发 DAC 开始锯齿波输出另一路触发 ADC 采集。每个 chirp 采集 2048 点耗时 512 μs剩余时间留给 CPU 搬数据。没有这个同步信号后面的距离多普勒矩阵完全是乱的。3. 信号处理从ADC样品到距离-多普勒图谱3.1 差频信号模型和距离方程每个 chirp 内ADC 采样到的差频信号可以看作一个频率为 f_b 的单音信号加窗后的频谱峰值位置就直接对应距离。实际中因为泄漏、噪声和谐波峰值不是理想的单根谱线所以需要做窗函数处理。距离计算公式为R f_b × c / (2K)我在实现里先对单个 chirp 做 2048 点 FFT频率分辨率 Δf fs / N 4MHz / 2048 ≈ 1953 Hz对应距离分辨率 ΔR Δf × c / (2K) ≈ 2.34 米。这个分辨率比理论上限 0.6 米差很多原因在于 2048 点采样只覆盖了 512 μs 的调频周期而真正的距离分辨率受限于扫频总带宽 B但 FFT 点数限制了分辨率。如果想进一步提高可以在 FFT 前补零到 8192 点让谱线更平滑但物理分辨率还是由 B 决定。3.2 二维FFT的处理顺序先快时间后慢时间雷达测速的核心思想是目标在一个 chirp 内移动的距离很小但会在不同 chirp 之间产生相位差。所以需要采集 M 个连续 chirp每个 chirp 做距离 FFT然后取同一距离单元的复数信号在慢时间维度再做一次 FFT得到多普勒频率 f_df_d 2v_r / λ其中 λ 是 24GHz 对应的波长 12.5mm所以 1m/s 的速度产生的多普勒频率是 160Hz。这里有一个很容易犯的顺序错误必须先对每个 chirp 做距离 FFT再沿 chirp 维度做多普勒 FFT不能反过来。因为距离 FFT 把 2048 点压缩成 1024 个距离门之后的慢时间序列才对应单一距离上的相位变化。如果直接在原始时域上横着做 FFT神仙也得不到距离速度图。3.3 窗函数和CFAR检测做完二维 FFT 后我得到的是一个距离-多普勒矩阵。直接用峰值检测的问题是强目标旁边会有旁瓣泄漏小目标很容易被大目标的旁瓣掩盖。我用的方法是先加汉明窗再做 CFAR恒虚警率检测。CFAR 的常见三种实现方式单元平均 CFARCA-CFAR在待检测单元周围取参考窗平均噪声功率后乘以门限系数。有序统计 CFAROS-CFAR对参考窗排序取第 k 个值抗多目标干扰更好。邻近双参 CFAR二维处理时同时看距离门和速度门两个方向的参考单元。我的场景目标稀疏用的 CA-CFAR 就足够。保护单元设 4 个参考单元设 16 个门限系数取 13dB。这里如果目标密集比如两个物体距离很近则需要把 CA-CFAR 换成 OS-CFAR否则弱目标会被压掉。3.4 Python实现核心代码贴上我落地用的核心 Python 代码这段代码是我在 PC 上读取 STM32 传回的 I/Q 数据后离线处理的简化版import numpy as np def range_doppler_process(adc_frame, num_chirps, samples_per_chirp): # adc_frame shape: (num_chirps, samples_per_chirp) # 1. 距离维FFT range_window np.hanning(samples_per_chirp) range_fft np.fft.fft(adc_frame * range_window, axis1) range_fft range_fft[:, :samples_per_chirp // 2] # 只取正频率部分 # 2. 多普勒维FFT doppler_window np.hanning(num_chirps) rdm np.fft.fft(range_fft * doppler_window[:, None], axis0) rdm np.fft.fftshift(rdm, axes0) # 让零多普勒在中间 return 20 * np.log10(np.abs(rdm) 1e-12) def get_distance_from_bin(bin_idx, fs, N, K): # bin_idx 是距离FFT的下标 f_b bin_idx * fs / N distance f_b * 3e8 / (2 * K) return distance实际处理中我会先去掉每个 chirp 的直流分量再减掉一次静态背景因为墙壁和天线互耦形成的零频泄漏强到离谱不做背景对消5 米以内的目标几乎完全看不出来。4. 实测与校准把理论数字搬到真实场景4.1 校准消除 I/Q 不平衡我用的混频器输出是单通道中频信号没有 I/Q 双通道所以理论上不存在镜频问题。但实际电路里还是会看到电源纹波带来的固定频率杂散。第一步校准就是把 DAC 设置成零扫频固定输出一个电压跑一遍 ADC 记录底噪这个底噪谱会在后面处理时直接对消掉。如果你用的是带 I/Q 输出的雷达芯片那还需要做幅度和相位不平衡校准。方法很简单给一个已知强反射体金属板放在固定距离调整 I/Q 两路的增益比和相位差让镜像分量降到最低。我没用 I/Q所以跳过这一步但校准思路是通用的。4.2 静止目标测距的误差分析我在走廊 5 米、10 米、15 米、20 米处分别放了金属角反射器每个距离测 100 次。测量值与卷尺真值的误差表现如下真值距离测量均值标准差最大偏差5 m5.08 m0.12 m0.20 m10 m10.11 m0.16 m0.25 m15 m14.93 m0.18 m0.28 m20 m20.17 m0.21 m0.33 m误差来源主要不是 FFT 频率本身而是 VCO 扫频斜率的标定误差。芯片规格书给的 VCO 增益是 20GHz/V实际在 24GHz 附近会偏到 21GHz/V这会导致我用理论 K 值计算距离时系统性偏大。解决办法是用频谱分析仪或已知距离目标做一次两点校准把实际 K 值反推出来。另一个误差来源是墙面多次反射。走廊里目标后面 1 米就是墙墙角反射会叠加成测距曲线上的周期性起伏。后来我把目标移到离墙至少 5 米的位置结果就稳了很多。4.3 运动目标测速与多普勒模糊测试运动目标时我让人拿着角反射器沿雷达径向来回走速度大概 0.5 到 1m/s。多普勒维 FFT 后的谱峰位置对应的速度误差在 ±0.08m/s 左右基本能正确跟随。这里有个参数关系特别容易忽略多普勒频率分辨率和最大可测速度取决于 chirp 帧的时间长度和采样间隔。我的参数下chirp 周期 2ms做 128 个 chirp 的帧帧长 256ms多普勒分辨率约 3.9Hz对应速度分辨率 0.024m/s最大不模糊多普勒频率为 250Hz对应速度约 1.56m/s。因此我标称的 ±5m/s 实际上做了多普勒解模糊处理具体做法是把相邻两个不同调频斜率帧的结果联合起来这一块比较复杂我自己也是偷懒直接放了两个不同周期的帧来交汇。如果你只做一个固定参数的锯齿波测速最大不模糊速度会有硬限制目标速度超过这个范围会折叠到另一个速度门里这在产品里叫多普勒模糊。解决办法要么缩短 chirp 周期要么用三角波调制或双周期发射但都会增加处理负担要根据实际需求取舍。5. 踩过的坑从“有波形”到“可测量”的最后一公里5.1 中频放大器饱和与ADC削顶我第一版原理图的中频增益用了 60dB想着微弱回波应该放大得越猛越好。结果上电一看ADC 采到的波形是一条顶着满幅的平顶直线因为混频器输出端的发射泄漏直接把前级放大器推到了饱和。这种直流和低频泄漏饱和不管后面算法多好都是白搭。解决办法是在混频器后面先加一个高通滤波器截止频率设在 100Hz把零频附近的泄漏先压掉再接 40dB 中频放大器。这样 10 米目标回波的幅度大约在几百 mV 到 1V 之间ADC 的 2V 满量程利用率合适也不会削顶。如果回波幅度再大了可以通过软件自动增益控制去做调节。5.2 USB供电的地环路噪声有一个坑让我烧了好几天雷达板和电脑之间用 USB 连接数据正常传但 FFT 后的底噪会周期性出现 50Hz 和它的谐波。一开始以为是天线进波后来用示波器量 ADC 输入发现噪声是和电脑电源共地的地环路耦合进来的。解决办法有三个我用了两个用锂电池给雷达板供电同时用隔离 USB 转串口模块传输数据。加一个隔离模块大概是二十块钱但底噪直接下降了将近 20dB。如果你的项目也在 PC 上调试强烈建议不要用同一个 USB 口给模拟电路供电这不是玄学是地环路噪声。5.3 VCO温漂带来的距离漂移24GHz 的 VCO 对温度很敏感。我的设备在空调房开机时 5 米目标测距正常开机二十分钟后距离偏了将近 0.4 米。原因是 VCO 内部温度升高后同样的控制电压对应的实际频率会偏低等效扫频斜率 K 变化。应对方法在 PCB 上靠近 VCO 的位置贴了一个热敏电阻软件里做一个温度补偿查表每十秒修正一次 K 值。温度漂移补偿后连续开机一小时的距离漂移控制在 0.1 米以内。如果你的产品要过温度测试这个补偿表基本是必须做的。5.4 参数配对带宽、调频时间、采样率的三角关系很多人一开始喜欢把带宽调大以为距离分辨率越高越好。但带宽增大会让差频信号频率变高为了覆盖它ADC 采样率也得跟着提高。我试过把扫频带宽从 250MHz 提升到 500MHz距离分辨率确实翻倍了但 ADC 采样率也得翻倍到 8MSPSSTM32 的 FSMC 和 USB 传输立刻成为瓶颈导致数据断流。最后我恢复了 250MHz 带宽然后用软件插值的方法把 FFT 点数从 2048 补到 8192让测距读数的显示精度提高实际物理分辨率不变。这个取舍很重要物理分辨率和采样率、调频时间三者相互制约你不可能什么都想要。如果确实需要高距离分辨率可以考虑换更高采样率的数据采集方案而不是无限调整单一参数。5.5 固定目标回波的压制技巧室内做雷达墙壁、桌椅、天线支架的回波都比目标强这些固定杂波会让距离多普勒图的零多普勒行出现一条亮线甚至把近处目标淹没。我用的经典方法是背景相消在没有任何目标运动时先采集一组背景帧作为静态杂波基底之后每一帧在距离 FFT 之前都减去这个背景的幅度和相位。这个方法对静止目标不友好它会把静止目标也消掉所以只适合检测运动目标场景。如果你想同时保留静止目标就不能粗暴相消得改用 MTI 滤波或更高级的杂波图算法。这些坑其实每一个都能单独写一篇文章但核心思路都一样雷达系统是完整的信号链任何一环的噪声、饱和、时钟抖动都会在最后的数据里放大给你看。调试过程中我最大的体会是先把每一级波形用示波器看清楚再谈算法优化一遍遍盯着频谱里的毛刺去追根因比盲目调参数有效得多。如果你打算复刻这一套 PLFM_RADAR记住先把电源、地线、中频带宽这三件事做好剩下的就是水到渠成的事了。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑