
简介面向雷达信号处理与MATLAB仿真学习者这份多目标场景下的LFM调频连续波和CW波脉冲压缩程序聚焦多目标识别中的关键算法验证可应用于雷达测距、目标检测等典型场景。程序支持自行设置目标数量默认两个目标LFM脉冲压缩后会出现与目标数对应的波峰每个目标对应一个峰值直观呈现距离分辨与多目标识别原理。资源包共3个文件含2个M源文件与1个PDF文档体积仅104KB轻量便于携带M文件分别实现LFM与CW两种波形的时域、频域脉冲压缩仿真PDF文档补充了原理推导与使用说明。目前已有1431人学习浏览适合刚接触雷达信号处理的学生巩固概念也适合工程师快速搭建仿真基线。运行程序后读者能对比时域与频域两种压缩方法两者回波幅度完全一致进而印证匹配滤波在脉冲压缩中的等效作用为后续多目标检测与抗干扰实验提供可扩展的代码起点。 做雷达信号处理的同学不管你是刚接触MATLAB仿真的研究生还是已经在项目里写雷达波形算法的工程师LFM和CW这两个词应该都不陌生。我最近在做一个多目标检测场景的仿真正好把LFM调频连续波和CW波在时域、频域下的脉冲压缩用MATLAB完整走了一遍。这个仿真解决的是很实际的一类问题目标不止一个有的远有的近有的朝你飞过来有的正在远离怎么通过回波把它们的距离和速度都解析出来。脉冲压缩是其中最核心的一步它决定了你能不能从回波里把弱小的目标从强目标的旁瓣下面捞出来。这篇文章把波形设计、匹配滤波原理、多目标回波建模、时域与频域脉压实现、CW多普勒处理一直到参数调优的坑全部串一遍雷达方向的学生和正在做信号处理仿真的人可以直接拿去参考。1. 方案与整体思路拆解多目标探测为什么绕不开LFM和CW1.1 LFM和CW的定位一个管距离一个管速度先理解这两种波形为什么要放在一起做。CW波就是单频连续波发射信号是一个固定频率的正弦波。目标一运动回波就会产生多普勒频移频移大小正比于目标的径向速度所以CW雷达天生适合测速。但它没有调制信号里没有时间标记回波里也没有办法反映出目标距离测距基本无能为力。说白了就是我能知道目标在靠近还是远离、速度多大但不知道它在多远。LFM也就是线性调频连续波频率随时间线性变化发射时频率从起始频率一路扫到结束频率。这个频率变化规律是已知的回波和发射信号之间就会存在一个与目标距离成正比的频率差。距离信息被“编码”进频率差里LFM才能同时测距和测速。多目标情况下LFM会有距离-速度耦合的问题但通过匹配滤波做脉冲压缩可以先把目标的距离维信息提取出来再结合CW通道的速度谱做联合解算这种组合是经典做法。所以整套仿真把LFM和CW放在一起做逻辑就一句话LFM负责给出目标的距离CW负责给出目标的速度两个维度的信息拼起来就是一个完整的目标运动状态。波形调制方式测距能力测速能力多目标处理复杂程度CW无调制单频无强低LFM频率线性扫描强中中1.2 多目标场景对脉冲压缩的挑战目标一旦多起来回波不只是简单叠加几个波形那么简单。实际会遇到三个麻烦第一强目标的旁瓣会盖住弱目标。脉冲压缩后主瓣旁边会出现旁瓣如果两个目标回波幅度差很大强目标旁瓣的尾巴高度可能比弱目标的主瓣还高这时候弱目标就直接被淹没了。第二两个距离很近的目标会叠加在一起。如果目标的距离差小于距离分辨率脉压后两个主瓣合并成一个宽包络看起来就像一个目标间距再小就分不开了。第三高速目标的多普勒频移会对LFM脉压结果产生影响。回波频率整体偏移会导致匹配滤波失配主瓣幅度下降、位置出现微小偏移在高精度测距场景下不能忽略。脉冲压缩要解决的核心问题就在这里。发射一个宽脉冲来保证发射能量和探测距离接收端用匹配滤波把回波压缩成窄脉冲。压缩后的主瓣越窄距离分辨能力越强而这个窄度取决于信号带宽。压缩比由时宽带宽积决定这部分后面详细算。2. 信号模型与脉冲压缩核心原理精讲2.1 LFM信号模型与关键参数计算LFM基带信号的标准形式是s(t) exp(j*pi*K*t^2), 0 t T其中T是脉冲时宽B是信号带宽K B/T是调频斜率。这三个参数的含义可以这样理解时宽T决定了发射脉冲持续多久持续时间越长发射能量越大探测距离就越远带宽B决定了距离分辨率带宽越大压缩后的主瓣越窄调频斜率K就是把带宽在时宽内展开的速度K越大频率变化越快。距离分辨率的公式是ΔR c / (2*B)拿一个典型参数来算。设B 10MHz那么ΔR 3e8 / (2*10e6) 15米。也就是说两个目标距离差小于15米时脉压后的主瓣就会重叠无法分辨。脉冲压缩比D B * T它同时代表脉压带来的信噪比增益。同样用上面的参数如果T 100μs那么D 10e6 * 100e-6 1000折算下来是30dB的输出信噪比改善这就是为什么大时宽带宽积信号在现代雷达里这么普遍。2.2 匹配滤波与脉冲压缩的本质脉冲压缩在接收端的核心就是匹配滤波。匹配滤波器的理论推导结果是当滤波器冲击响应是发射信号的时域翻转共轭时输出信噪比达到最大。回波可以看作发射信号经过目标反射后的延时、衰减版匹配滤波输出在数学上近似为信号的自相关函数。自相关函数的主瓣宽度约等于1/B这就是为什么脉冲压缩能把宽脉冲变窄。主瓣宽度决定距离分辨率旁瓣则由信号形式决定LFM的自相关旁瓣约-13.2dB这个数字在雷达里是绕不开的坎意味着不加窗时旁瓣只比主瓣低13.2dB强目标很容易盖住弱目标。实际操作中匹配滤波器可以这样构造h conj(st(end:-1:1));把发射信号翻转取共轭就是匹配滤波器。在MATLAB里直接卷积即可但工程上为了效率通常用频域实现。2.3 时域卷积与频域FFT-IFFT实现差异时域脉冲压缩就是直接做线性卷积y conv(sr, h)复杂度是O(N*L)N是回波长度L是滤波器长度。当回波数据量到几百万点的时候MATLAB会跑得非常吃力实时性完全没法看。频域脉冲压缩的公式是Y ifft( fft(sr, Nfft) .* fft(h, Nfft) )整体复杂度降为O(NlogN)这是FFT算法的优势。数据越长优势越明显。但频域方法有个大坑直接采用FFT做的是循环卷积而我们需要的是线性卷积。解决办法是补零让Nfft不小于NL-1否则卷积结果的尾部会折回到头部造成结果污染。这个细节在后面的实现部分会专门演示。3. 多目标仿真MATLAB完整实现3.1 仿真场景设计与多目标回波构建仿真场景设计为三个目标目标1距离750米速度50米/秒回波幅度1.0目标2距离1500米速度-30米/秒回波幅度0.7目标3距离2400米速度15米/秒回波幅度0.5LFM通道参数采用B 10MHzT 100μs载频fc 10GHz采样率fs 40MHz。注意这里采样率为什么选40MHz而不是理论最小值2B 20MHz因为脉压后要看精细的距离位置并且回波中可能混入干扰留出余量更稳妥。发射信号的构建代码clear; close all; clc; c 3e8; fc 10e9; lambda c / fc; % LFM参数 B 10e6; % 带宽 10MHz T 100e-6; % 时宽 100us K B / T; % 调频斜率 fs 40e6; % 采样率 40MHz N round(T * fs); % 单脉冲采样点数 t (0:N-1) / fs; % 发射LFM基带信号 st exp(1j * pi * K * t.^2); % 多目标参数 R [750, 1500, 2400]; % 距离 v [50, -30, 15]; % 速度 A [1.0, 0.7, 0.5]; % 回波幅度 num_targets length(R); % 构建多目标回波 sr zeros(size(t)); for k 1:num_targets tau 2 * R(k) / c; % 回波延时 start_idx round(tau * fs) 1; if start_idx N error(目标距离过远回波超出脉冲窗口); end end_idx min(start_idx N - 1, N); len end_idx - start_idx 1; sr(start_idx:end_idx) sr(start_idx:end_idx) ... A(k) * st(1:len); end % 可加噪声 % sr sr 0.01 * (randn(size(sr)) 1j*randn(size(sr)));回波构建这段代码的核心逻辑就是每个目标产生一个延时后的发射信号副本按目标幅度叠加到接收信号里。目标距离越远回波到达越晚在信号序列里对应越靠后的起始位置。这里要说明一次脉冲观测内目标运动造成的多普勒相位变化很小做单脉冲距离维脉压时可以忽略速度的影响。速度要留到CW通道的长时间积累里去提取这是整个方案的层次划分。3.2 时域脉冲压缩实现与距离换算时域脉压就是简单的卷积。匹配滤波器取发射信号的时域翻转共轭然后convh conj(st(end:-1:1)); % 时域脉压 y_t conv(sr, h); t_conv (0:length(y_t)-1) / fs; R_axis (t_conv - T) * c / 2; % 归一化画图 y_t_norm abs(y_t) / max(abs(y_t)); figure; plot(R_axis/1e3, 20*log10(y_t_norm eps)); xlabel(距离 (km)); ylabel(归一化幅度 (dB)); title(时域脉冲压缩结果多目标); xlim([0, 3]); grid on;这段代码里最容易搞错的就是距离轴的换算。卷积输出长度是N N - 1时间轴从0开始而匹配滤波后的峰值位置对应的是回波延时tau加上发射信号时宽T。所以要得到正确的距离需要用t_conv减去T再乘以c/2。我第一次做这个仿真的时候直接拿t_conv去换算距离三个目标的峰全部偏了多出来的那部分正好是一个脉冲时宽。运行后你会看到三个主峰分别位于0.75km、1.5km、2.4km位置。峰值幅度对应1、0.7、0.5和目标回波强度一致。目标3的幅度低但因为旁边没有强目标干扰还能清晰看到。主峰两侧有约-13dB的旁瓣这就是不加窗时的水平。3.3 频域脉冲压缩实现与循环卷积问题频域脉压实现方式Nfft 2^nextpow2(length(sr) length(h) - 1); Sf fft(sr, Nfft); Hf fft(h, Nfft); y_f real(ifft(Sf .* Hf)); % 截取线性卷积的有效长度 y_f y_f(1:length(sr) length(h) - 1); % 归一化对比时域结果 y_f_norm abs(y_f) / max(abs(y_f)); figure; plot(R_axis/1e3, 20*log10(y_f_norm eps)); xlabel(距离 (km)); ylabel(归一化幅度 (dB)); title(频域脉冲压缩结果多目标); xlim([0, 3]); grid on;Nfft取2的幂是为了FFT运算效率。关键在于Nfft必须大于等于length(sr) length(h) - 1否则会发生循环卷积卷积结果的尾部会翻转叠加到头部。实际表现就是目标的旁瓣结构被破坏甚至在目标前后出现对称的虚假峰。频域结果和时域结果理论上完全等价但频域计算速度快工程上基本都走频域实现。两种方式在MATLAB里跑出来的归一化曲线是重合的调试时可以同时计算两条曲线互相验证。3.4 CW多普勒测速通道实现CW通道独立处理。CW波是单频连续波目标运动导致回波频率偏移多普勒频移公式fd -2 * v / lambda负号对应目标靠近时多普勒频移为正的约定。载频是10GHz时波长lambda c / fc 0.03米。目标速度50m/s对应的多普勒频移大约是3.33kHz-30m/s对应约2kHz的负频移15m/s对应1kHz这些频率差异完全能在速度谱上分辨开。CW通道的仿真参数和代码% CW多普勒测速 fs_cw 100e3; % CW通道采样率 100kHz T_cpi 10e-3; % 相干积累时间 10ms N_cw round(fs_cw * T_cpi); t_cw (0:N_cw-1) / fs_cw; x_cw zeros(1, N_cw); for k 1:num_targets fd -2 * v(k) / lambda; x_cw x_cw A(k) * exp(1j * 2 * pi * fd * t_cw); end Nfft_cw 2^nextpow2(N_cw); X_cw fftshift(fft(x_cw, Nfft_cw)); f_axis (-Nfft_cw/2 : Nfft_cw/2 - 1) * fs_cw / Nfft_cw; v_axis f_axis * lambda / 2; figure; plot(v_axis, 20*log10(abs(X_cw)/max(abs(X_cw)) eps)); xlabel(速度 (m/s)); ylabel(归一化幅度 (dB)); title(CW多普勒测速结果多目标); grid on;CW速度分辨率和相干积累时间直接相关频率分辨率为Δf 1/T_cpi 100Hz换算成速度分辨率Δv λ/2 * Δf 1.5米/秒。三个目标的速度间隔分别是80m/s、45m/s远超分辨率分离很彻底。如果目标速度差小于1.5m/s谱峰就分不开需要增加积累时间。另外要注意采样率和速度测量范围的关系。CW通道采样率100kHz对应可测的最大多普勒频率50kHz换算成最大可测速度是750m/s对上这个场景完全够用。3.5 距离-速度联合信息如何组织LFM通道给出三个目标的距离CW通道给出三个目标的速度联合起来就能得到完整的目标状态目标序号LFM测距结果CW测速结果真实距离真实速度1约750m约50m/s750m50m/s2约1500m约-30m/s1500m-30m/s3约2400m约15m/s2400m15m/s实际工程系统里距离和速度信息可以通过构造距离-多普勒二维图像然后把峰值检测和目标关联算法跑在二维平面上。更常见的是多脉冲积累得到慢时间维做MTD后直接输出距离-速度二维热图。那是另一个话题后面扩展里会提。4. 常见问题与排坑技巧实录4.1 参数调整速查表参数推荐范围对结果的影响注意事项带宽B2~100MHz越大距离分辨率越高B增大后采样率要同步提高时宽T10~500μs越大脉压信噪比增益越高T过长回波窗口和计算量都增大采样率fs≥2B建议2~4倍过低会频谱混叠工程上留余量更稳Nfft≥NL-1取2的幂补零不足会导致循环卷积最好用nextpow2窗函数Hamming/Blackman降低旁瓣但主瓣展宽小目标检测时优先加窗4.2 高频问题与解决思路问题一脉压后峰值对应的距离不对。这个基本就是距离轴换算没算对。匹配滤波输出的峰值时间点是回波延时加上脉冲时宽换算距离前必须减去T。如果你的代码里用t_conv直接乘c/2峰的位置会整体偏一个脉冲时宽对应的距离也就是15km。做这个仿真时一定要先想清楚时间轴原点和匹配滤波的时延关系。问题二频域脉压结果两端出现鼓包波形畸变。这是循环卷积没处理干净。检查Nfft是否小于length(sr) length(h) - 1如果是把Nfft至少补到这个值以上。而且补零后取的截断位置也要对有效卷积长度就是N L - 1后面的全舍掉。问题三弱目标被强目标的旁瓣淹没。在LFM不自加窗的情况下旁瓣只有-13.2dB如果两个目标回波幅度差大于13dB弱目标就基本看不到。解决办法有两个一是脉压前对匹配滤波器加窗Hamming窗可以把旁瓣压到-43dB左右但主瓣会宽约1.5倍二是调整发射波形设计采用非线性调频等低旁瓣波形这个属于进阶玩法。问题四CW速度谱上出现多余峰值。多出来的峰通常是强目标频谱泄漏的旁瓣而不是真实目标。处理方法是加窗后做FFT代价是主瓣变宽。另外要检查目标回波幅度是否相差过大幅度差异20dB以上时频谱泄漏会很严重。4.3 个人调试心得调试这套仿真的过程中有几点体会写出来供参考先单目标后多目标。我一开始直接把三个目标全放进去脉压结果出来三个峰但根本没法判断旁瓣是哪个目标产生的。改成单个目标逐个叠加验证确认每个目标的峰值位置、旁瓣结构都正确了再叠加起来看多目标效果排查效率会高很多。加窗操作的位置很关键。窗函数是乘在匹配滤波器上的不是乘在回波上也不是乘在FFT结果上win hamming(N).; h_win conj(st(end:-1:1)) .* win;加窗后旁瓣降下去了但主瓣从1/B展宽到约1.3/B距离分辨率变差两个相距很近的目标可能分不开。所以加不加窗本质是在“旁瓣抑制”和“距离分辨率”之间做权衡。画图建议用dB纵坐标。线性坐标下主瓣太尖旁瓣根本看不出来换成20*log10归一化幅度旁瓣结构一目了然。这是判断脉压结果好坏的最直观手段。5. 后续扩展与我的体会这套仿真再往前走可以扩展的方向很多加高斯白噪声后统计脉压后的检波概率做CFAR恒虚警检测把一次脉冲扩展到多脉冲做慢时间维FFT得到距离-速度二维MTD谱发射波形换成三角波LFM消除距离-速度耦合的模糊匹配滤波器加窗类型换成Kaiser窗通过调节β参数在旁瓣和主瓣宽度之间做更精细的折中。我个人在这个仿真上投入时间最多的部分其实是参数映射关系。很多初学者会在算法原理上卡住但实际做完一遍就知道最麻烦的是把物理量之间的换算关系搞清楚。回波延时怎么转成距离多普勒频移怎么转成速度FFT点数变化后频率轴怎么更新这些细节如果不在代码注释里写清楚过两天再回头看自己都会懵。最后再分享一个实用小技巧在画图代码里把关键参数直接打印到标题上比如B、T、fs、加窗类型、目标数量和位置。跑完仿真看一眼图所有条件都写在上面后面回看结果或者给别人解释的时候省掉大量口舌。调试数据对比起来也方便参数变了图标题跟着变不会出现拿错结果对错参数的情况。本文还有配套的精品资源点击获取