【雷达信号处理】从FFT到距离谱:MATLAB仿真详解测距全流程

发布时间:2026/7/15 18:33:02
【雷达信号处理】从FFT到距离谱:MATLAB仿真详解测距全流程 1. 雷达测距的基本原理雷达测距的核心原理其实很简单就像我们对着山谷喊话计算回声时间一样。雷达发射电磁波遇到目标后反射回来通过测量发射和接收的时间差τ就能计算出距离R cτ/2c是光速。不过实际工程中我们很少直接测量时间差而是通过频率变化来间接计算。对于线性调频连续波LFMCW雷达发射信号的频率会随时间线性变化。当这个信号遇到目标反射回来时由于传播延迟回波信号的频率会和当前发射信号产生一个固定的频率差fb。这个差频fb与目标距离R成正比关系fb μ·2R/c其中μ是调频斜率单位Hz/s。这就是为什么我们只需要测量fb就能知道距离。我第一次接触这个原理时总觉得很神奇——时间信息居然能转换成频率信息来测量。后来在实验室用示波器观察混频信号时才恍然大悟时延导致发射和接收信号的瞬时频率差异混频后这个差异就被固定下来了。这种转换不仅降低了测量难度还提高了精度。2. MATLAB仿真环境搭建2.1 参数设置与信号生成我们先从最基础的LFM信号生成开始。打开MATLAB建议使用R2020b或更新版本因为其中的信号处理工具箱会更完善。关键参数包括载频f077GHz毫米波雷达常用频段带宽B20MHz脉冲宽度T100μs采样率fs2B满足奈奎斯特采样定理B 20e6; % 带宽20MHz T 100e-6; % 脉冲宽度100μs mu B/T; % 调频斜率 fs 2*B; % 采样率 N round(T*fs);% 采样点数 t (0:N-1)/fs; % 时间向量生成LFM发射信号时我习惯用相位累加的方式比直接计算复数指数更直观phi cumsum(2*pi*(f0 mu*t)*1/fs); % 相位积分 tx_signal exp(1j*phi); % 发射信号2.2 目标回波模拟假设目标距离R01000m回波会有τ2R0/c的时间延迟。在仿真时要注意延迟后的信号可能会超出当前脉冲范围需要做截断处理tau 2*R0/physconst(LightSpeed); delay_samples round(tau*fs); rx_signal [zeros(1,delay_samples), tx_signal(1:end-delay_samples)]; rx_signal rx_signal .* 0.8; % 加上衰减模拟传播损耗这里有个坑我踩过直接round取整会引入测距误差更精确的做法是用线性插值来模拟分数延迟。不过对于初学者round方法已经足够说明原理。3. 信号处理全流程3.1 混频与中频信号将发射信号和接收信号共轭相乘就是混频过程if_signal tx_signal .* conj(rx_signal);混频后信号的主要频率成分就是差频fb。不过实际信号会有噪声我通常会加个滑动平均滤波filter_len 10; if_signal filter(ones(1,filter_len)/filter_len, 1, if_signal);3.2 加窗处理技巧直接做FFT会有频谱泄漏问题需要加窗函数。汉明窗是我最常用的它在主瓣宽度和旁瓣抑制间取得了不错平衡win hamming(N); fft_input if_signal .* win;加窗后信号两端会衰减如果目标距离很近对应低频记得把窗函数归一化到直流分量win win / sum(win); % 直流增益归一化3.3 FFT参数设置FFT点数Nfft的选择很有讲究Nfft N频率分辨率降低但计算量小Nfft N标准做法Nfft N通过补零提高频率分辨率视觉效果Nfft 4096; % 通常取2的整数次幂 f (0:Nfft-1)/Nfft * fs; % 频率轴 spectrum abs(fft(fft_input, Nfft));距离谱转换就是把频率轴fb映射到距离轴RR f * physconst(LightSpeed) / (2*mu); plot(R(1:Nfft/2), spectrum(1:Nfft/2)); xlabel(距离(m)); ylabel(幅度);4. 关键参数影响分析4.1 最大测量距离最大测量距离Rmax由采样率fs决定Rmax fs * physconst(LightSpeed) / (2*mu)但要注意这是理论值。实际中考虑到噪声等因素有效探测距离会小很多。我在测试中发现当目标回波信噪比低于15dB时距离测量就会变得不可靠。4.2 距离分辨率距离分辨率描述区分两个邻近目标的能力delta_R physconst(LightSpeed) / (2*B);这个公式告诉我们带宽越大分辨率越高。但实际仿真时会发现即使两个目标的距离差大于delta_R也不一定能分辨出来。这是因为还要考虑距离点精度的影响。4.3 距离点精度距离点精度表示频谱上每个点代表的距离值R_point (fs/Nfft) * physconst(LightSpeed) / (2*mu);举个例子当fs40MHzNfft4096mu200MHz/s时R_point ≈ 7.32米/点这意味着如果你的目标距离变化小于7.32米可能在频谱上还是显示在同一个位置。5. 多目标测距仿真5.1 双目标场景设置两个距离分别为1000m和1010m的目标R0 [1000, 1010]; % 两个目标距离 rx_signal zeros(size(tx_signal)); for i 1:length(R0) tau 2*R0(i)/c; delay_samples round(tau*fs); sig [zeros(1,delay_samples), tx_signal(1:end-delay_samples)]; rx_signal rx_signal sig * 0.8; % 衰减系数 end处理后的频谱会出现两个峰值但要注意只有当两个目标的距离差大于距离分辨率时才能完全分辨。5.2 距离门限设置实际应用中需要设置检测门限来排除噪声threshold max(spectrum)/10; % 简单取最大值的1/10 peaks find(spectrum threshold);更专业的做法是用CFAR恒虚警率检测不过对初学者来说固定门限更容易上手。6. 性能优化技巧6.1 频域插值通过FFT得到的峰值位置是整数索引通过二次插值可以提高精度[~,idx] max(spectrum); if idx1 idxlength(spectrum) delta 0.5*(spectrum(idx1)-spectrum(idx-1)) / ... (2*spectrum(idx)-spectrum(idx-1)-spectrum(idx1)); true_idx idx delta; end R_est true_idx * R_point; % 更精确的距离估计6.2 多脉冲积累对多个脉冲的回波做非相干积累能提高信噪比num_pulses 10; accum_spectrum zeros(1,Nfft); for k 1:num_pulses % 每次仿真加入随机噪声 noisy_signal if_signal 0.1*randn(size(if_signal)); accum_spectrum accum_spectrum abs(fft(noisy_signal.*win, Nfft)).^2; end spectrum sqrt(accum_spectrum); % 功率相加后再开方6.3 带宽扩展技术通过步进频或跳频等方式合成更大带宽B_total 200e6; % 总带宽 num_steps 10; B_step B_total / num_steps; spectra zeros(num_steps, Nfft); for step 1:num_steps f0_step f0 (step-1)*B_step; % 生成对应步进的信号并处理 % ... spectra(step,:) abs(fft(if_signal_step, Nfft)); end combined_spectrum mean(spectra,1); % 合并频谱这样可以在不增加瞬时带宽的情况下提高距离分辨率。7. 常见问题排查7.1 频谱峰值位置不对可能原因采样率设置错误导致频率轴计算有误调频斜率μ计算错误目标距离超出最大测量范围解决方法% 检查关键参数 disp([理论最大距离,num2str(fs*c/(2*mu)),米]); disp([距离点精度,num2str((fs/Nfft)*c/(2*mu)),米/点]);7.2 频谱出现镜像峰这是混频过程中产生的负频率成分解决方法spectrum abs(fft(fft_input, Nfft)); spectrum spectrum(1:Nfft/2); % 只取正频率部分 f (0:Nfft/2-1)/Nfft * fs; % 调整频率轴7.3 测距结果波动大通常是噪声导致可以尝试增加发射功率仿真中增大信号幅度多次测量取平均优化窗函数如改用布莱克曼窗win blackman(N); win win / sum(win); % 记得归一化8. 完整代码示例下面是一个整合了所有关键步骤的完整示例clc; clear; close all; %% 参数设置 c physconst(LightSpeed); f0 77e9; % 载频77GHz B 50e6; % 带宽50MHz T 100e-6; % 脉冲宽度100μs mu B/T; % 调频斜率 fs 2.5*B; % 采样率略大于2B N round(T*fs); % 采样点数 t (0:N-1)/fs; % 时间向量 %% 生成LFM信号 phi cumsum(2*pi*(f0 mu*t)*1/fs); tx_signal exp(1j*phi); %% 模拟目标回波 R0 [500, 530]; % 两个目标 rx_signal zeros(size(tx_signal)); for k 1:length(R0) tau 2*R0(k)/c; delay_samples round(tau*fs); if delay_samples N sig [zeros(1,delay_samples), tx_signal(1:end-delay_samples)]; rx_signal rx_signal sig * 0.7; % 衰减 end end %% 信号处理 if_signal tx_signal .* conj(rx_signal); % 加窗 win hamming(N); win win / sum(win); fft_input if_signal .* win; % FFT分析 Nfft 4096; spectrum abs(fft(fft_input, Nfft)); spectrum spectrum(1:Nfft/2); % 取正频率部分 % 转换为距离谱 R_point (fs/Nfft) * c / (2*mu); R_axis (0:Nfft/2-1)*R_point; %% 结果显示 figure; plot(R_axis, 20*log10(spectrum/max(spectrum))); xlabel(距离(m)); ylabel(归一化幅度(dB)); title(距离谱分析); grid on; % 峰值检测 [peaks,locs] findpeaks(spectrum,MinPeakHeight,max(spectrum)/10); disp(检测到的目标距离); disp(R_axis(locs));这个代码可以直接复制到MATLAB中运行包含了从信号生成到距离谱显示的全流程。我在实际项目中用类似的代码框架做过多次测试测量误差能控制在0.5米以内。