用MATLAB仿真雷达多普勒测距测速:从LFM回波建模到距离-多普勒图
2026/9/11 15:45:00 网站建设 项目流程

简介:面向雷达信号处理与多普勒效应测距测速研究,这份Matlab仿真资源包围绕雷达回波中的多普勒频移展开,通过仿真实现目标的距离和速度联合测量,适合本硕博学生及科研人员用于课程设计、实验验证或原理学习。资源共3个文件,包含可运行的Matlab源码、仿真操作录像和结果截图,压缩包整体仅1015KB,轻量紧凑,便于快速下载与复用。操作录像使用Windows Media Player播放,细致演示了从当前文件夹路径设置到仿真运行、结果观察的完整流程,能有效帮助使用者规避环境配置中的常见问题。配套源码与截图便于对照分析多普勒频移对测距测速结果的影响,将理论公式与仿真现象联系起来,加深对速度估计关键环节的理解。从源码到录屏再到结果图构成完整学习闭环,覆盖“看讲解—跑程序—对结果”的全过程。目前已有714人学习下载,适用于雷达原理、信号处理等方向的教学参考与科研入门。

1. 用多普勒测距测速仿真前,先把“距离维”和“速度维”分开建模

一辆时速 120 km 的车,在 X 波段 9.4 GHz 雷达照射下,多普勒频移只有约 2.1 kHz,相比之下带宽 10 MHz 的线性调频信号本身占着 10 MHz 的频谱。很多做过脉冲压缩仿真的工程师习惯把回波写成一个单纯的时延信号x(t-τ),距离能测出来,但速度信息在这个模型里根本不存在——因为多普勒是载频的偏移,不是包络的移动。做雷达信号多普勒效应测距测速 MATLAB 仿真时,正确做法是把回波拆成两条独立的维:快时间里的包络延迟负责测距,慢时间里的相位旋转负责测速,两条维最后在距离-多普勒图上汇合。这篇博文就是沿着这条链路,把 LFM 回波建模、匹配滤波、CA-CFAR 检测、多普勒 FFT 测速、速度解模糊和仿真录像录制完整走一遍,适合雷达、通信和信号处理方向的研究生,以及需要快速上手雷达仿真的一线工程师。仿真代码基于 MATLAB,全部使用基础函数,工具箱均可选。

2. 雷达回波建模第 1 步:快时间延迟决定距离,慢时间相位旋转决定速度

2.1 回波数学模型:窄带近似下的两个独立信息源

雷达发射线性调频(LFM)脉冲,载频为 (f_c),调频斜率为 (K = B/T_p)。对第 (m) 个脉冲,目标初始距离为 (R_0),径向速度为 (v),回波的复基带信号可以写成:

[ s_m(t) = \exp\left(j\pi K (t - \tau_m)^2\right) \cdot \exp\left(j2\pi f_d \cdot t_m\right) ]

其中 (\tau_m = 2(R_0 + v t_m)/c) 是第 (m) 个脉冲到达目标时的时延,(t_m) 是慢时间,(f_d = 2vf_c/c) 是多普勒频移。这个式子的关键在第二项:它不改变脉冲包络的位置,只改变载波相位随时间(脉冲序号)的旋转速度。

窄带近似的成立条件是信号带宽远小于载频,即 (B/f_c \ll 1)。本仿真实例中 (B=10\text{ MHz})、(f_c=9.4\text{ GHz}),比值约 (10^{-3}),此时可以忽略脉冲内部的时间压缩效应,把多普勒仅作为慢时间维度的相位项处理。如果换成超宽带雷达或声呐仿真,这个近似就不成立了,需要在回波模型里加入尺度变换因子。

2.2 LFM 回波生成:一组能直接跑的 MATLAB 参数

下面这组参数是我做窄带雷达仿真常用的起点:X 波段,带宽 10 MHz,脉宽 10 μs,采样率 20 MHz。距离分辨率由带宽决定,(\Delta R = c/(2B) = 15\text{ m});脉内采样点数为 (T_p \cdot F_s = 200),刚好覆盖一个完整脉冲。

参数符号取值说明
载频(f_c)9.4 GHzX 波段,波长约 3.2 cm
带宽(B)10 MHz距离分辨率 15 m
脉宽(T_p)10 μs时宽带宽积 (B \cdot T_p = 100)
调频斜率(K)(B/T_p = 10^{13}) Hz/sLFM 斜率
采样率(F_s)20 MHz2 倍过采样
脉冲重复频率PRF4 kHz最大不模糊距离 37.5 km
初始距离(R_0)600 m回波时延 4 μs,落在接收窗内
径向速度(v)25 m/s对应多普勒 1566 Hz

生成回波的 MATLAB 代码如下:

% 参数设置 c = 3e8; fc = 9.4e9; B = 10e6; Tp = 10e-6; K = B / Tp; Fs = 20e6; Ts = 1 / Fs; N = fix(Tp * Fs); % 脉内采样点数:200 t_fast = (0:N-1) * Ts; % 快时间轴 % 发射 LFM 复基带信号 s_tx = exp(1j * pi * K * t_fast.^2); % 目标参数 R0 = 600; % 初始距离 600 m v = 25; % 径向速度 25 m/s tau = 2 * R0 / c; % 时延 4 us fd = 2 * v * fc / c; % 多普勒频移 1566 Hz % 回波:包络延迟 + 多普勒相位 snr_pre = -10; % 脉压前信噪比,脉压增益约 20 dB amp = sqrt(10^(snr_pre / 10)); noise = (randn(1, N) + 1j * randn(1, N)) / sqrt(2); s_rx = amp * exp(1j * pi * K * (t_fast - tau).^2) .* exp(1j * 2 * pi * fd * t_fast) + noise;

这段代码里,exp(1j*pi*K*(t_fast-tau).^2)负责距离信息,时延 (\tau) 会让匹配滤波后的峰值出现在对应位置;exp(1j*2*pi*fd*t_fast)是脉内的多普勒项,它会让峰值幅度略微下降并产生小距离偏移,单脉冲测速时无法从这一项直接读出速度。真正的多普勒测量要靠多个脉冲之间的相位积累,下一节会说明为什么要构造快-慢时间矩阵。

不熟悉的读者可以把t_fast理解为"同一个脉冲内部的时间刻度",它从 0 走到 10 μs 就结束;而慢时间则是一个脉冲接一个脉冲地往前走。两者必须分开建模,混在一起写会让后续 FFT 测速无从下手。

2.3 从单脉冲回波到快-慢时间数据矩阵

常见做法是把多次脉冲回波存入一个 (N \times M) 的矩阵,行是快时间采样点(距离维),列是脉冲序号(速度维)。MATLAB 里这么做:

M = 64; % 相参积累脉冲数 X = zeros(N, M); % 快-慢时间矩阵 for m = 1:M tm = (m - 1) / PRF; % 当前脉冲的慢时间 s_m = exp(1j * pi * K * (t_fast - tau).^2); s_m = s_m .* exp(1j * 2 * pi * fd * tm); % 多普勒相位随脉冲序号旋转 s_m = s_m .* exp(-1j * pi * K * t_fast.^2); % 如需去斜可以去掉这行 X(:, m) = amp * s_m + (randn(1, N) + 1j * randn(1, N)) / sqrt(2); end

这里exp(1j*2*pi*fd*tm)是关键:第 (m) 个脉冲的相位比第 (m-1) 个脉冲多旋转了 (2\pi f_d / \text{PRF}) 弧度,沿列方向做 FFT 时,这个相位旋转率就会转化为频谱上的峰值位置。注意没有这个相位项时,64 个脉冲完全相同,FFT 结果只在零频有能量,速度信息为零——这是新手最容易忽略的地方。

需要提醒的是:脉冲之间目标距离可能发生变化,导致峰值位置在快时间维移动,这就是距离徙动。当前参数下 64 个脉冲积累 16 ms,目标移动 0.4 m,远小于 15 m 距离分辨率,可忽略。

3. 匹配滤波与 CA-CFAR 测距:峰值位置换算成距离的完整实现

3.1 匹配滤波的本质是相关,不是滤波

匹配滤波对 LFM 信号来说,输出是一个主瓣宽度约为 (1/B) 的 sinc 形峰值,峰值出现的位置对应回波时延。MATLAB 中最直接的实现是用xcorr而不是filterfilter有群延迟,需要额外校准延迟偏移;xcorr的输出天然带lags轴,零时延在中心点,省去一组容易出错的修正。

% 匹配滤波(互相关实现) [y, lags] = xcorr(s_rx, s_tx); % y 长度 2N-1,lags 对应时延索引 [~, peak_idx] = max(abs(y)); tau_est = lags(peak_idx) / Fs; % 估计时延,单位秒 R_est = c * tau_est / 2; fprintf('真实距离: %.1f m\n', R0); fprintf('估计距离: %.1f m\n', R_est); fprintf('测距误差: %.2f m\n', R_est - R0);

max的索引对应回波时延。因为目标在 600 m 处,时延 4 μs,在采样率 20 MHz 下是 80 个采样点,lags中的位置是 (N - 1 + 80) 附近。逻辑上,xcorr 的峰值索引与目标距离的换算依赖采样率:一个采样间隔对应距离 (\Delta R_{sample} = c/(2F_s) = 7.5\text{ m}),所以估计误差来自采样量化,最多半个采样间隔。想要更精确,可以在峰值附近做抛物线插值:

% 抛物线插值细化时延估计 p = polyfit(lags(peak_idx-1:peak_idx+1), abs(y(peak_idx-1:peak_idx+1)), 2); frac = -p(2) / (2 * p(1)); % 抛物线顶点位置 tau_est = (lags(peak_idx) + frac) / Fs;

polyfit对峰值附近三个点拟合二次曲线,顶点位置就是插值后的峰值时延。通常这套操作能扣到亚采样级精度,对 600 m 的目标,误差在 1 m 以内才有可能。

3.2 CA-CFAR 检测:门限怎么选才不误报

匹配滤波后直接取最大值在单目标下没问题,但雷达仿真要考虑多目标和噪声起伏。单元格平均恒虚警(CA-CFAR)是工程上最常见的检测器:在待检测单元两侧取参考窗,估计背景噪声功率,门限等于噪声功率乘一个由虚警概率确定的系数。

% CA-CFAR 检测,按距离维对脉压输出扫描 x_abs = abs(y); num_cells = length(x_abs); guard = 4; % 保护单元,覆盖主瓣宽度 train = 20; % 参考单元数 pfa = 1e-6; % 虚警概率 alpha = train * (pfa^(-1/train) - 1); % CA-CFAR 门限系数 detections = []; for k = train + guard + 1 : num_cells - train - guard idx = [k-train-guard : k-guard-1, k+guard+1 : k+train+guard]; noise_pow = mean(x_abs(idx)); % 参考单元平均背景功率 threshold = alpha * noise_pow; if x_abs(k) > threshold detections = [detections, k]; % 记录超过门限的单元 end end

参数选择上有两条经验:保护单元的数量至少要覆盖匹配滤波主瓣的一半宽度,LFM 脉压主瓣第一零点宽度是 (2/B),在采样率 20 MHz 下对应 2~3 个采样点,所以保护单元取 4 是安全的;参考单元太少会导致门限抖动大,太多则会跨越杂波边界,20~32 个是常见范围。alpha公式把虚警概率映射为门限系数,参考单元数越多,门限越接近理论值,这就是为什么工程上宁可多用一些训练单元。

使用 Phased Array System Toolbox 的读者可以替换为phased.CFARDetector,参数一一对应:

cfar = phased.CFARDetector(... 'Method', 'CA', ... 'NumGuardCells', 4, ... 'NumTrainingCells', 20, ... 'ProbabilityFalseAlarm', 1e-6, ... 'ThresholdOutputPort', true);

工具箱自动处理边界条件,输出门限向量,代码更简洁。两种实现都要求参考单元里只有噪声而没有目标,多目标场景下 CA-CFAR 会把强目标旁边的弱目标遮蔽,这时换成 GO-CFAR 或 OS-CFAR 能缓解。

3.3 距离-多普勒耦合:LFM 测距的固有偏置

LFM 信号存在距离-多普勒耦合,匹配滤波峰值位置会随多普勒频率偏移一个量:

[ \Delta R = \frac{c \cdot f_d}{2K} = \frac{c \cdot f_d \cdot T_p}{2B} ]

代入本例 (f_d = 1566\text{ Hz})、(K=10^{13}),(\Delta R) 约 2.3 cm,远小于距离分辨率,可以忽略。但把带宽降到 1 MHz、脉宽拉到 100 μs(时宽带宽积不变)时,同样多普勒产生的偏差会放大到 23 m,超过一个距离分辨单元,此时必须在测距结果里扣除这一项:

R_corrected = R_est - c * fd * Tp / (2 * B);

工程上的常见做法是把这条修正公式保留在代码里,默认不启用,等换大时宽积信号时再打开。它不需要额外计算,只需要知道多普勒估计值。

4. 多脉冲相参积累与 MTD 多普勒滤波器组:把速度测出来

4.1 为什么对慢时间做 FFT 就是测速

沿快-慢时间矩阵的每一行(同一距离单元)取 M 个脉冲做 M 点 FFT,相当于用 M 个窄带滤波器把多普勒频率分开,这就是动目标显示(MTD)中最核心的操作。FFT 的频率分辨率是 (\Delta f = \text{PRF}/M),对应速度分辨率:

[ \Delta v = \frac{\lambda \cdot \Delta f}{2} = \frac{c \cdot \text{PRF}}{2 f_c M} ]

本例 (\lambda = 0.0319\text{ m}),PRF = 4 kHz,M = 64,(\Delta v \approx 1.0\text{ m/s})。FFT 同时带来相参积累增益,理想情况下信噪比提升 (10\log_{10}M = 18\text{ dB}),这就是为什么微弱目标在单脉冲里看不清,积累 64 个脉冲之后就能从噪声里浮出来。这段代码先把第 2.3 节的矩阵补全,再对慢时间维做 FFT:

% 沿慢时间维做 FFT,得到距离-多普勒图 RD = fftshift(fft(X, M, 2), 2); % X 是 N x M 快-慢时间矩阵 % 频率轴与速度轴 fd_axis = (-M/2 : M/2-1) * PRF / M; v_axis = fd_axis * c / (2 * fc); % 找峰值所在距离单元与多普勒单元 [max_val, lin_idx] = max(abs(RD(:))); [r_peak, d_peak] = ind2sub(size(RD), lin_idx); v_est = v_axis(d_peak); R_est = (lags(r_peak) / Fs) * c / 2; % 距离从快时间维取 fprintf('估计速度: %.2f m/s\n', v_est); fprintf('速度误差: %.2f m/s\n', v_est - v);

fftshift的作用是把零频搬到中心,速度轴从负到正排列;ind2sub将线性索引拆回距离维和速度维索引。真实速度 25 m/s 对应多普勒 1566 Hz,落在第 25 根谱线附近(因为 1566 / 62.5 = 25.06),误差在一根谱线内是正常的——这就是测速精度的上限。想要更高的速度分辨率只能增加积累脉冲数或降低 PRF,两者都会减小不模糊范围,这是雷达信号处理里最经典的取舍。

4.2 速度维的盲速与模糊:PRF 参数必须成对考虑

慢时间 FFT 能测的最大多普勒频率是 (\pm\text{PRF}/2),对应最大不模糊速度 (v_{max} = \lambda \cdot \text{PRF}/4)。PRF 提高可以扩大测速范围,但会让最大不模糊距离 (R_{max} = c/(2\cdot\text{PRF})) 变小。以下表格是一组具体数字:

PRF (kHz)(R_{max}) (km)(v_{max}) (m/s)(v_{max}) (km/h)
275.015.957.3
437.531.9114.8
818.863.8229.7

单靠一个 PRF 无法同时满足远距离和高速测量,雷达工程的标准做法是使用多重 PRF 发射,利用两组模糊测速结果反推真实速度。下面给一个穷举搜索实现,比直接调中国余数定理更直观:

% 假设目标真实速度 60 m/s,分别用 3 kHz 和 4 kHz 测量 lambda = c / fc; PRF1 = 3000; PRF2 = 4000; V1 = lambda * PRF1 / 4; % 23.9 m/s V2 = lambda * PRF2 / 4; % 31.9 m/s v_alias1 = 60 - 2 * floor(60 / (2*V1)) * V1; % 模糊速度 v_alias2 = 60 - 2 * floor(60 / (2*V2)) * V2; % 穷举模糊整数 m1、m2,寻找两组一致的真实速度 best_v = 0; best_err = inf; for m1 = -5 : 5 for m2 = -5 : 5 vt1 = v_alias1 + 2 * m1 * V1; vt2 = v_alias2 + 2 * m2 * V2; if abs(vt1 - vt2) < best_err best_err = abs(vt1 - vt2); best_v = (vt1 + vt2) / 2; end end end fprintf('解模糊速度: %.2f m/s\n', best_v);

思路是:模糊速度加上整数倍的速度周期 (2V) 就是可能的真实速度,两组 PRF 下能对上的候选值就是真实速度。搜索范围 (m \in [-5,5]) 对应最多 5 个模糊周期,对绝大多数车辆目标够用。实际工程中用三个 PRF 做两两校验来剔除错误解,奇数个 PRF 还能用多数表决抗噪声。

4.3 距离徙动的边界:什么速度开始需要补偿

相参积累假设目标在一个距离单元内不动,但速度快到一定程度后,积累时间内目标会跨过距离单元,导致慢时间 FFT 的增益下降。判断公式是积累时间内走动小于四分之一距离分辨率:

[ v \cdot \frac{M}{\text{PRF}} < \frac{c}{8B} ]

代入本例参数得到 (v < 234\text{ m/s})。普通汽车、无人机都在安全范围,但民航客机(约 250 m/s)和高超音速目标就突破了这条线,此时需要做 Keystone 变换或速度搜索补偿。写仿真时把这个阈值打印出来,可以避免将来换高速目标场景时莫名出现积累增益下降的问题。

5. 仿真录像录制与多普勒测量验证的 3 个实用技巧

5.1 用 VideoWriter 把距离-多普勒图录制成 AVI

MATLAB 的VideoWriter可以把动态图逐帧写入视频文件,适合生成演示录像。关键点有两个:getframe必须从可见 figure 取帧,figure('Visible','off')会抓到黑屏;writeVideo的帧数据来自getframe(gcf),注意先让图刷新drawnow

vw = VideoWriter('doppler_RD.avi'); vw.FrameRate = 10; open(vw); h = figure('Position', [100 100 900 600]); for m = 1 : M imagesc(v_axis, R_axis, abs(RD(:, m))); xlabel('速度 (m/s)'); ylabel('距离 (m)'); title(sprintf('脉冲 %d/%d,目标速度 %.1f m/s', m, M, v)); colorbar; drawnow; writeVideo(vw, getframe(h)); end close(vw);

录制时建议把速度轴范围固定在 ([-v_{max}, v_{max}]),距离轴固定在目标附近 ±2 个距离单元,否则imagesc自动缩放会让移动看起来很夸张。录像的作用不是展示,而是复现:把一组参数和对应的距离-多普勒录像放在一起,后续改代码时能快速确认结果没有被无意破坏。

5.2 仿真验证自检表

跑完仿真后,逐项核对下面这张表,能覆盖多普勒测距测速仿真里最常见的错误来源。

检查项验证方法预期结果
测距偏差对比R_estR0误差 < 一个采样间隔对应的 7.5 m
测速偏差对比v_estv误差 < 1 条多普勒谱线对应的 1 m/s
相参积累增益对比单脉冲与 64 脉冲输出的 SNR增益约 18 dB
速度轴方向目标远离雷达时 v > 0,接近时 v < 0正负号与设定一致
模糊速度范围把 v 设为 60 m/s 重新仿真4 kHz PRF 下出现模糊,3 kHz 解模糊后复原

自检里最容易翻车的是速度轴方向。MATLAB 的fftshift后速度轴从负到正排列,对应目标接近雷达时应为负多普勒,远离时为正多普勒,这个约定跟不同教材可能相反,务必在代码注释里写死。

5.3 快速定位模型错误:三个替换实验

当仿真结果对不上理论值时,我通常按顺序做三个快速实验。把v设为 0 重新跑一遍,如果测速结果不是 0,说明慢时间相位项写错或者 FFT 轴对错;把 LFM 换成单频脉冲exp(1j*2*pi*fc*t),此时测速理论上直接等于 (2vf_c/c),可以用来隔离 LFM 特有的距离-多普勒耦合问题;把 SNR 降到 -20 dB 再跑,如果目标还能检测到,说明积累增益逻辑正确,检测不到则问题出在 CFAR 门限或保护单元设置上。这三个实验每次 5 分钟内能完成,比逐行断点调试更高效。

最后留一个长期有效的习惯:在仿真脚本里加一个measurement_log变量,把每次仿真的R_estv_estfd、SNR 全部追加记录成表格。多普勒效应对相位最敏感,参数稍有变化,谱线位置就会移动,有历史记录才能确认改动方向对不对。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询