
简介一套围绕FMCW雷达测距的紧凑型MATLAB仿真程序面向雷达、信号处理方向的初学者与有MATLAB基础的开发者帮助理解调频连续波雷达从线性扫频、回波混频到差频分析的完整测距链路。资源浓缩了发射信号构造、目标回波模拟、混频差频生成、FFT频谱分析以及距离换算等关键环节适合课程设计、毕业设计或算法预研。压缩包共6个文件以5个.m脚本/函数为主另有1个txt说明文档整体仅3KB轻量易读脚本可按功能模块拆解便于逐步调试和二次修改。调整扫频带宽、扫描周期、目标距离等参数即可观察差频峰值的移动与测距误差变化深入理解距离分辨力及参数折中。目前已有926人浏览学习虽体积小但代码组织清晰可作为FMCW雷达仿真实验的入门模板也为多目标检测、速度解算等拓展预留了基础。1. 为什么 FMCW 是近程感知里最省心的测距方案做近程感知的人大多被脉冲雷达的时序折腾过发射大功率窄脉冲、等待回波、精确控制收发切换、还要处理近距离盲区。FMCW调频连续波Frequency Modulated Continuous Wave把问题换了个角度——发射功率低、全天时工作、距离和速度同时测量而且中频信号落在 MHz 量级直接用 ADC 采样就能解算出目标信息。这套体制在车载雷达、工业液位计、安防周界、无人机定高和生命体征检测里几乎是默认选择。它最反直觉的一点是系统测量的其实不是“回波时间”而是“发射瞬间与接收瞬间的频率差”再用扫频斜率把频率差换算成距离。这篇博文从混频原理讲到参数设计再给出可复现的信号处理流程和标定方法。适合正在选型或已经开始调 FMCW 雷达、但被波形参数和数据链路困住的工程师。2. FMCW 测距测速体制的链路拆解与器件选型2.1 从差拍频率到距离映射FMCW 工作的核心公式FMCW 雷达发射信号频率随时间线性变化常见波形是三角波或锯齿波。锯齿波调频周期为T_chirp扫频带宽为B则调频斜率S B / T_chirp。发射信号经目标反射后与本地振荡器混频得到差拍频率f_b。对静止目标回波延迟τ 2R / c差拍频率为f_b S * τ (B / T_chirp) * (2R / c)因此距离与差拍频率呈线性关系R f_b * c * T_chirp / (2 * B)要理解这个公式的工程含义可以看一个具体例子假设带宽B 150 MHzchirp 周期T_chirp 60 μs若中频信号里有一个 100 kHz 的谱峰则对应距离约为100e3 * 3e8 * 60e-6 / (2 * 150e6) 6 m。这个线性映射是 FMCW 最优雅的地方——不数脉冲、不测飞行时间只需做一次 FFT 找谱峰。对运动目标回波还会附加多普勒频移f_d 2v / λ差拍频率变为f_b S * 2R/c ± f_d。锯齿波无法区分距离和速度的耦合所以工程上要么用三角波的两个斜率分别解算要么用多 chirp 帧结构在快时间维度和慢时间维度分别做 FFT。后文会具体展开这两种方案。2.2 零中频与低中频架构镜频干扰和直流偏置怎么权衡实际 FMCW 雷达前端有两种主流架构。零中频Homodyne架构直接将回波与发射信号混频差拍信号基带落在0 ~ B频段内ADC 采样率可以做得较低系统功耗和成本都有优势。但这种架构有两个固有缺陷一是发射信号泄露到接收链路会产生直流偏置近距离目标回波也可能落在极低频率容易淹没在 1/f 噪声里二是零中频 I/Q 两路增益和相位不匹配会产生镜频干扰导致真实目标旁边出现虚假目标。低中频Heterodyne架构在混频前先加一级中频搬移比如把差拍信号搬移到几十 MHz 的中频再采样避开直流区。代价是 ADC 采样率要求更高、链路多一级混频器。我的经验是做车载雷达这种目标动态范围大的场景低中频更稳做液位计或存在检测这种近距离低速场景零中频加高通滤波完全够用。选型时重点看接收链路噪声系数和 1/f 拐角频率——零中频方案里这个指标直接决定最小可测距离。2.3 FMCW 雷达器件选型的一组可用配置一个典型的 24 GHz FMCW 雷达链路可以这样搭VCO 选具备线性调谐特性的型号PLL 用集成斜坡发生器的芯片如 TI LMX2492 或 ADI ADF4159产生锯齿波调制信号收发前端用单片微波集成电路MMIC例如 Infineon 的 BGT24LTR11 或类似产品内部集成 VCO、混频器和功分器中频部分只需要一级运放加抗混叠滤波器带宽按差拍频率上限设计。各器件配合时的关键参数如下表。器件/模块关键参数推荐取法影响VCO/PLL调频带宽、 chirp 线性度带宽按距离分辨率需求反推线性度优于 0.1%线性度误差会直接变成测距误差发射功率EIRP 与法规限制24 GHz 频段常见 20 dBm EIRP 上限功率越低回波 SNR 越差混频器/MMIC噪声系数、 1/f 拐角噪声系数优于 10 dB 1/f 拐角越低越好决定近距离检测下限低通滤波器截止频率按最大差拍频率的 1.2~1.5 倍设定过高引入噪声过低截掉远距目标ADC采样率、 有效位数采样率 ≥ 2 倍差拍上限有效位数 ≥ 12 bit决定距离分辨能力和动态范围这组参数不是绝对的但它给出了一个可用的起点。实际项目里最强的约束往往来自法规带宽和功耗预算这会反向压缩B和T_chirp的选择空间。3. FMCW 波形参数的六个约束关系与性能边界3.1 距离分辨率、最大探测距离和采样率的拉扯FMCW 的距离分辨率由扫频带宽决定ΔR c / (2B)。扫频带宽B 150 MHz时分辨率约为 1 m带宽 1 GHz 时分辨率约 15 cm。这让很多人误以为“带宽越大越好”但带宽增加会带来三个连锁代价PLL 锁定时间变长或需要更复杂的预失真校准、中频带宽变宽导致 ADC 采样率上升、法规频段占用变宽。所以“分辨率”需先定义清楚——是不加窗的理论分辨率还是加窗后的半功率宽度后者通常要放大 1.3~1.5 倍。实际做液位计用 150 MHz 带宽是合理的做近距离高精度成像再考虑 4 GHz 以上的超宽带方案。最大探测距离由差拍频率上限和 ADC 采样率共同决定。ADC 采样率f_s确定后可分析的差拍频率最高为f_s/2对应的最大距离为R_max f_s * c * T_chirp / (4 * B)假设f_s 10 MHzT_chirp 60 μsB 150 MHz则R_max 10e6 * 3e8 * 60e-6 / (4 * 150e6) 3 m。想测 30 m 就得把采样率提到 100 MHz或者拉长T_chirp。拉长 chirp 会让帧率下降也让 VCO 的相位噪声在长时间扫频中积累。所以这三个参数f_s、T_chirp、B是在一个三维空间里互相挤占的。3.2 最大不模糊速度由 chirp 间隔决定而不是采样率锯齿波 FMCW 测速的思路是发射一帧包含N个完全相同的 chirp对每个 chirp 的回波做距离维 FFT 后在同一个距离门内沿 chirp 索引方向再做一次慢时间 FFT得到多普勒频率。这里的速度不模糊范围取决于慢时间采样区间——也就是 chirp 之间的起始间隔T_priv_max λ / (4 * T_pri)对于 24 GHz 载频λ ≈ 12.5 mm若T_pri 100 μs则v_max 0.0125 / (4 * 100e-6) 31.25 m/s。这个值对于双向通行的车载场景是需要警惕的相向而行 20 m/s 加对向 20 m/s 就是 40 m/s 的相对速度已经超过不模糊范围。解决办法是缩短T_pri但T_pri不能小于T_chirp加上 PLL 回扫时间。另一个工程技巧是使用参差 chirp 间隔即不同 chirp 间隔交替出现来扩展测速范围代价是慢时间 FFT 的谱不再是等间隔采样需要用非均匀 FFT 或 MUSIC 类算法处理。3.3 距离与速度的耦合三角波的互补斜率解算锯齿波有距离-速度耦合问题差拍频率f_b S * 2R/c f_d你测到的谱峰位置是距离频率和多普勒频率的代数和单凭一个f_b无法分离R和v。三角波是经典解法——上扫频和下扫频各得一个差拍频率f_up S * 2R/c - f_d f_down S * 2R/c f_d于是R (f_up f_down) * c / (4S) v (f_down - f_up) * λ / 4多目标场景下这个方案会遇到匹配问题——N个目标产生2N个差拍峰值正确配对需要额外约束幅度一致性、跟踪连续性等组合爆炸会带来计算压力。所以现代 FMCW 雷达更多采用锯齿波加慢时间 FFT 的方案在二维 FFT 平面里直接分离距离和多普勒天然解决配对问题。三角波只用在低成本的单目标场景或者作为二重确认与锯齿波方案互为校验。如果论文或招标文件里强调“同时多目标测速”那基本会指向锯齿波帧结构。3.4 相位噪声和 VCO 非线性对测距精度的实际影响FMCW 系统的测距精度由差拍频率估计精度决定。理想情况下 FFT 频率分辨率是1/T_chirp但实际限制来自两个物理因素一是 VCO 调谐曲线的非线性频率-电压关系不是理想直线导致瞬时调频斜率S(t)不等于设计值S映射公式R f_b * c / (2S)在S随时间是变量时产生系统性偏差二是 VCO 近载波相位噪声通过“发射-接收延迟”转化为幅度噪声延迟越大相位噪声的影响越大。后者的机制是相位噪声在延迟τ后在差拍频率处以近似L(f) * (2π*τ)²的形式混入中频带内近距离目标由于τ小受影响小远距离目标会被近距强目标的相位噪声尾巴抬高本底。处理非线性有两个层面。PLL 闭环方式下集成 VCO 的 PLL 本身会做频率校正但仍残留微小的非线性开环 FMCW 或使用 DDS 驱动 VCO 的方案需要预失真查表。工程上最简单的做法是测一段 VCO 特性曲线然后用逆函数对调谐电压做预补偿剩余残差再用系统标定修正。具体操作后文会给出。4. 用 Python 复现 FMCW 数据采集到点云输出的完整流程4.1 生成 FMCW 中频信号仿真参数先于硬件定义先写一个生成差拍信号的 Python 脚本目的是在接触真实硬件前验证算法链路。设定载频fc 24e9带宽B 150e6chirp 周期T_chirp 60e-6ADC 采样率fs 1e6这里的采样率针对基带差拍信号不必按载频采样这正是 FMCW 的优势。设备在R 5.2 m处以v 3 m/s径向速度运动。代码如下import numpy as np fc 24e9 B 150e6 T_chirp 60e-6 fs 1e6 N int(T_chirp * fs) # 每个 chirp 的采样点数 S B / T_chirp # 调频斜率 c 3e8 lam c / fc R0 5.2 v 3.0 t np.arange(N) / fs # 快时间采样点 delay 2 * (R0 v * t) / c # 回波延迟随时间变化 f_b S * delay # 差拍频率瞬时值 phase 2 * np.pi * np.cumsum(f_b) / fs # 积分还原相位 sig np.exp(1j * 2 * np.pi * fc * delay) # 混频后的复信号实际为复数基带 # 实数基带信号保留 I 路便于理解 sig_real np.cos(2 * np.pi * fc * delay)代码里用cumsum对瞬时差拍频率做积分再除以采样率是因为差拍相位是频率对时间的积分直接使用2 * np.pi * f_b * t会在f_b随时间变化时产生误差。实测数据里的相位本来就携带这种积分关系仿真保持同样的数学结构才能验证后续处理的有效性。对静止目标f_b是常数这种做法与直接2 * np.pi * f_b * t一致对运动目标delay内包含v*t项f_b本身还有距离走动效应cumsum模型更精确。参数说明R0 5.2对应差拍频率约S * 2*R0/c 2.5e12 * 34.67e-9 ≈ 86.7 kHzv 3 m/s对应的多普勒频移约2*v/λ 480 Hz。这两个频率分量叠加在同一个 chirp 内单 chirp FFT 无法分离。4.2 距离维 FFT 加窗频谱泄漏抑制和旁瓣取舍对单个 chirp 的采样点做 FFT得到距离谱。这一步骤的要点是加窗。如果不加窗矩形窗的旁瓣仅比主瓣低 13 dB强目标旁瓣会掩盖弱目标。Hamming 窗旁瓣约 -43 dB代价是主瓣展宽约 1.3 倍距离分辨率下降。实际工程里切比雪夫窗更常用因为它允许你直接指定旁瓣电平比如 -60 dB再自动计算对应的主瓣宽度。代码如下# 对第一个 chirp 做距离 FFT复信号 win np.blackman(N) spec np.fft.fft(sig * win) freq np.fft.fftfreq(N, 1/fs) # 正频率部分转换为距离 pos_mask freq 0 range_axis freq[pos_mask] * c / (2 * S) spec_pos np.abs(spec[pos_mask]) # 峰值搜索简化取最大值 peak_idx np.argmax(spec_pos) print(peak range: %.2f m % range_axis[peak_idx])win是窗函数序列sig * win是对时域信号逐点相乘。窗口会降低信噪比约 1~2 dB但能换来更干净的谱。距离轴的计算是freq * c / (2*S)注意这里的freq单位是 HzS单位是 Hz/s结果单位是米。Blackman 窗旁瓣约 -58 dB是通用处理里比较稳的选择。峰值搜索只取最大值真实系统中这一步会替换成 CFAR 检测器后文会讲。实测硬件读取的数据通常是实数中频信号这时直接做np.fft.fft会得到关于 DC 对称的谱只需取一半频率。如果硬件是 I/Q 复数中频输出直接用复数 FFT距离轴不会出现镜像动态范围能多出约 3 dB。这属于前端架构的选择在算法侧的直接体现。4.3 复数混频与慢时间 FFT 的二维测速测距处理运动目标需要发射多个 chirp 形成帧。帧内有M个 chirp每个 chirp 的采样点数N不变。对帧数据做二维 FFT 是标准做法。先对每个 chirp 做距离维 FFT加窗得到[M, N]的复数矩阵再沿第 0 维chirp 索引做慢时间 FFTdef range_doppler_fft(frame, win_r, win_d, S, fs, fc, T_pri): M, N frame.shape # 距离维加窗 FFT spec_r np.fft.fft(frame * win_r, axis1) # 慢时间维加窗 FFT对复数距离谱 spec_rd np.fft.fft(spec_r * win_d, axis0) # 频率轴 freq_r np.fft.fftfreq(N, 1/fs) freq_d np.fft.fftfreq(M, T_pri) # 距离轴 dist_axis freq_r * c / (2 * S) # 速度轴 vel_axis freq_d * lam / 2 return spec_rd, dist_axis, vel_axis M 128 # 一帧内 128 个 chirp T_pri 100e-6 # chirp 间隔 frame_sig np.zeros((M, N), dtypecomplex) for m in range(M): t_fast np.arange(N) / fs delay_m 2 * (R0 v * (m * T_pri t_fast)) / c frame_sig[m, :] np.exp(1j * 2 * np.pi * fc * delay_m) win_r np.blackman(N) win_d np.hanning(M) spec_rd, dist_axis, vel_axis range_doppler_fft( frame_sig, win_r, win_d, S, fs, fc, T_pri )range_doppler_fft里的两个 FFT 各司其职axis1的 FFT 把快时间维度的差拍频率变换为距离axis0的 FFT 把不同 chirp 之间由多普勒引起的相位旋转变换为速度。距离-多普勒图Range-Doppler Map, RD Map就是np.abs(spec_rd)它的峰值坐标直接对应目标的距离, 速度。这个二维平面是 FMCW 信号处理的中心产物后续的检测和跟踪都在这张图上做。关于慢时间 FFT 的窗函数距离维窗影响距离旁瓣速度维窗影响速度旁瓣两者独立。速度维加窗后速度分辨率约λ / (2 * M * T_pri)M128、T_pri100μs时速度分辨率约0.0125 / 0.0256 ≈ 0.49 m/s。4.4 用 CFAR 做局部峰值检测避免固定阈值误报距离-多普勒图上有杂波和噪声固定阈值在近距强反射和远距弱目标并存的场景里必然失效。单元平均恒虚警CA-CFAR是最常用的自适应检测方法。原理是在待检测单元周围取保护单元防止目标能量泄漏进参考窗和参考单元用参考单元的平均功率估计噪声水平再乘以一个系数得到检测门限def ca_cfar_2d(rd_map, guard, ref, pfa1e-3): 2D CFAR 检测返回检测点索引 rows, cols rd_map.shape out np.zeros((rows, cols), dtypebool) # 计算门限系数参考单元数决定 num_ref 4 * ref * (ref guard 1) alpha num_ref * (pfa ** (-1 / num_ref) - 1) for i in range(ref guard, rows - ref - guard): for j in range(ref guard, cols - ref - guard): # 取 (2*ref1) x (2*ref1) 窗口排除保护单元和待测单元 patch rd_map[i-ref:iref1, j-ref:jref1] mask np.ones_like(patch) cx, cy ref guard, ref guard # 待测单元 mask[cx-guard:cxguard1, cy-guard:cyguard1] 0 noise patch[mask 1].mean() thresh alpha * noise out[i, j] rd_map[i, j] thresh return out代码里的num_ref是参与噪声估计的总单元数。CFAR 门限系数alpha的推导来自P_fa (1 alpha/N_ref)^(-N_ref)它保证在均匀噪声背景下虚警率恒定。实际使用时ref和guard的取值取决于目标尺寸目标在 RD 图上占几个单元保护单元就要比目标尺寸大。通常guard取 2~3 个单元可以留足护边。这段双重循环是教学用的清晰版处理大量数据时一般用滑窗卷积或专用硬件加速。CFAR 没有“最佳”参数需要从物理世界反推。距离维上金属角反射器在 RD 图上会占多个距离单元速度维上行人微多普勒扩展明显参考窗会被扩展的旁瓣抬高导致弱目标漏检。经验值是速度维的参考窗取 16~32 个单元距离维取 8~16 个单元配合 2~4 个保护单元然后在实测数据上微调。4.5 从检测点到目标点云多普勒速度解算和边界处理CFAR 检测出的峰值集合还不是目标列表。因为 FFT 是离散变换谱峰落在两个频率格点之间时需要做插值获得亚格点精度。常用的抛物线插值公式def parabolic_interp(power, idx): if idx 0 or idx len(power) - 1: return idx a, b, c power[idx-1], power[idx], power[idx1] frac 0.5 * (a - c) / (a - 2*b c) frac np.clip(frac, -0.5, 0.5) # 防止越界 return idx fracfrac是峰值位置相对格点的偏移量。抛物线插值假设谱峰附近形状接近抛物线这对加窗后的 FFT 谱是个不错的近似。插值后的距离和速度精度会比 FFT 分辨率高一个数量级——这也是 FMCW 能做毫米级液位测量的窍门之一。实际使用中还需将插值后的距离、速度配对输出并做多普勒解模糊。CFAR 输出坐标在距离维和速度维的相对位置经插值后得到连续值再换算为物理单位。多目标场景下还有一个反直觉的问题速度维 FFT 后如果两个目标距离相同、速度相近它们的峰值可能会合并成单个展宽峰。解决思路是减小T_pri提高速度分辨率或使用更窄的窗牺牲旁瓣。如果目标是扩展目标如卡车峰值本身就有展宽这时应该做质心聚类而不是找单峰。5. FMCW 系统的相位校准、VCO 线性度补偿与实测排错5.1 用角反射器做距离标定修正系统固定延迟FMCW 链路中的滤波器群延迟、混频器延迟、天线线缆长度会叠加一个固定距离偏移单靠公式算距离必然存在系统误差。做法是在空旷场地放置一个已知散射截面的角反射器测量它在不同距离下的频谱峰值位置做一个一次线性拟合同样内容# 标定数据真值距离和 FFT 估计距离 true_r np.array([2.0, 4.0, 6.0, 8.0, 10.0]) est_r np.array([2.11, 4.09, 6.06, 8.04, 10.02]) A np.vstack([est_r, np.ones_like(est_r)]).T k, b np.linalg.lstsq(A, true_r, rcondNone)[0] print(scale:{:.4f}, offset:{:.3f} m.format(k, b)) # 应用标定 calibrated_r k * est_r bk接近 1b是固定延迟对应的距离偏移。这个偏移通常来自带通滤波器和 PLL 锁定残留。标定后残差一般能控制在距离分辨率的 5%~10% 以内。注意标定场景里要避免地面多径——多径会让频谱出现错误的峰值你需要用宽带吸收材料铺在地面或者把角反射器架高到足以使地面反射路径与直射路径在距离维上分开。这个防多径细节决定了标定数据的质量。5.2 VCO 非线性引起的测距偏差用相位残差法校准VCO 的实际调谐曲线偏离理想线性时距离谱峰会展宽或偏移。工程上先采集 VCO 的调谐特性用 PLL 锁定一系列频点记录对应的调谐电压得到电压-频率曲线f(V)。然后求逆函数V(f)作为预失真表。更精细的做法是测量瞬时频率残差——将鉴频器输出与理想斜坡比较得到相位误差序列再利用锁相环的环路滤波器做校正。这个方法的优势在于不需要额外仪器直接利用雷达自身的混频输出就能观察非线性对一个强静止目标频谱主瓣旁边出现的对称小峰就是调频非线性所致。相位残差法校准的流程是测出中频信号的瞬时相位减去由理想斜坡推导的相位剩下的残差即为 VCO 非线性误差。将这个残差预失真到调谐电压上再重复测试直到残差小于目标值。实际操作中做两轮迭代通常足够。需要注意温度对 VCO 特性的影响——VCO 的调谐斜率随温度漂移可达 10%~20%因此预失真表最好按温度区间分段存储或者用闭环 PLL 持续跟踪校正。这是 FMCW 雷达里最难调试的部分也是决定产品良率的关键。5.3 目标丢失和测距跳变的排查步骤实测中最常见的问题不是算法不工作而是信号链路上某个环节的隐性故障。排查顺序可以按信号流向推进确认中频输出有信号且幅度在 ADC 满量程的 20%~80%若幅度过低检查接收链路增益和发射功率若削顶降低增益或调整 ADC 参考电压。观察距离维 FFT 的底噪水平。底噪高于理论值由增益、噪声系数和带宽算出约 3 dB 以上时多半是外部干扰或电源噪声耦合。用频谱仪看中频输出的基底下是否有梳状谱有则检查开关电源的开关频率。RD 图上出现整条距离门持续高亮的“速度维亮线”通常是直流偏置或发射泄露未被完全抑制。这类信号在慢时间维度是恒定相位解法是数字域减去慢时间均值——这是零中频架构里常见的修正手段。测距值跳变且周期性地呈现 5 m 或 10 m 的台阶往往是 CFAR 保护单元设置过小目标旁瓣进入了参考窗口门限被抬高检测点跳到旁瓣位置。增大保护单元即可缓解。振荡器失锁也是一个隐蔽故障。若 PLL 失锁差拍频率会大幅偏离设计值距离谱峰出现在完全错误的位置。遇到这种情况用示波器观察 PLL 的锁定指示引脚或在中频信号里检查是否出现远高于预期频率的能量。5.4 用零速目标的相位稳定性评估系统测速下限雷达标定好距离之后测速性能评估可以用一个静止目标完成不用真的搭运动平台。放置一个角反射器在 3~5 m 处连续采集 100 帧数据对同一个距离门的慢时间信号计算相位标准差。如果该标准差对应的速度噪声低于应用需求例如 0.05 m/s 0.05 Hz 多普勒测速链路就算达标。相位标准差的单位是弧度弧度的变化率除以2π乘以λ/2就换算成速度。这个指标综合反映了 VCO 相位噪声、PLL 稳定性和 ADC 采样时钟的抖动。做生命体征检测时尤其关注这个参数——呼吸引起的胸壁位移只有毫米量级对应相位变化约4π*ΔR/λ在 24 GHz 下 1 mm 位移约 1 弧度相位变化这要求相位噪声极低。此时应检查参考时钟的相位抖动展频时钟SSC驱动的系统不会有好的测速效果必须换成低抖动 TCXO。本文还有配套的精品资源点击获取