☰
线性调频脉冲压缩雷达Matlab仿真:从信号生成到工程实现
2026/10/14 17:38:49 网站建设 项目流程

简介:一套面向雷达信号处理的线性调频脉冲压缩Matlab仿真资源,包含完整源码、运行结果与说明文档。包内共21个文件,以.m程序、Word文档和jpg/png图片为主,chirp_signal.m、LFM_radar.m覆盖LFM脉冲生成、回波模拟与匹配滤波核心流程,图片直观展示时域波形、压缩输出和分辨率仿真效果,配套Word则逐步讲解原理与代码逻辑。压缩包仅331KB,轻量易用,已有2312人学习下载。通过运行源码和对照文档,读者可以完整理解LFM信号的匹配滤波处理、距离分辨力与信噪比改善的仿真验证方法,掌握从信号生成到参数分析的标准实验流程,非常适合课程设计或自学入门。

1. 线性调频脉冲压缩雷达仿真:从一道课程题到可信的Matlab工程

接手过雷达信号处理的人,十有八九碰过这套仿真:要你用线性调频(LFM)信号做脉冲压缩,给出一份Matlab程序、一份Word说明和一组运行结果。很多人照着教材把代码敲完,出了图,却说不清匹配滤波输出为什么长那样,距离分辨率怎么算,加窗之后主瓣展宽又意味着什么。这套仿真不是画两张波形图交差,而是验证你对手中信号的相位结构、滤波器设计和指标换算是否真的理解。这篇文章沿着「LFM信号生成 → 匹配滤波 → 完整项目组织 → 常见坑 → 进阶验证」的路径,把你需要知道的判据、参数和容易翻车的地方一次性讲透。适合刚接触雷达仿真的学生,也适合想快速搭一个脉冲压缩验证环境的工程师。

2. LFM信号模型与生成:先把时宽带宽积这个账算清楚

2.1 为什么雷达选线性调频而不是普通单频脉冲

雷达要同时追求两个指标:作用距离和距离分辨率。作用距离要求脉冲能量大,直观做法是拉长脉冲宽度 T;距离分辨率 δR 又要求带宽 B 大,而普通单频脉冲的带宽近似等于 1/T,两者互相锁死——脉宽拉长,带宽变小,分辨率变差。线性调频打破了这对矛盾:它在脉宽 T 内让瞬时频率从 f0 - B/2 线性扫到 f0 + B/2,信号带宽 B 由扫频范围决定,不再受限于 1/T。于是可以在长脉冲里塞进大带宽,发射平均功率高、分辨率也好。

线性调频基带信号的复数形式为:

s(t) = exp(j·π·K·t²),|t| ≤ T/2

其中 K = B/T 称为调频斜率。瞬时频率是相位的导数:f(t) = (1/2π)·d(φ)/dt = K·t,确实是线性变化的。时宽带宽积 D = T·B 是 LFM 最核心的指标,匹配滤波后信号被压缩成主瓣宽度约 1/B 的脉冲,压缩比正好等于 D。这意味着 D 越大,发射脉冲和压缩后脉冲的宽度差越大,脉压增益越可观。

做仿真前一定要先把 T、B、fs 三个量定下来。T 和 B 决定 D,fs 决定你能不能无失真地表示瞬时频率的最高点。基带 LFM 的瞬时频率范围是 [-B/2, B/2],所以带通采样理论要求 fs ≥ B,工程上我习惯取 fs ≥ 2B,让频谱在数字域里留足余量,后期做加窗、滤波也更从容。

2.2 生成LFM基带信号:最小可运行代码

下面这段代码生成一个时宽 50 微秒、带宽 10 MHz 的 LFM 基带信号,是整个仿真链条的第一步。

% 参数定义 fs = 10e6; % 采样率,单位 Hz,取带宽的 2 倍 T = 50e-6; % 脉冲宽度,单位 s B = 10e6; % 信号带宽,单位 Hz K = B / T; % 调频斜率,单位 Hz/s % 时间轴:以脉冲中心为 0,左右各 T/2 t = -T/2 : 1/fs : T/2 - 1/fs; N = length(t); % 采样点数 % 生成复数基带 LFM 信号 phase = pi * K * t.^2; % 相位轨迹 s = exp(1j * phase); % 复数信号,实部为余弦分量,虚部为正弦分量 % 绘制实部波形和幅度谱 figure; subplot(2,1,1); plot(t*1e6, real(s), 'b', 'LineWidth', 0.8); xlabel('时间 / us'); ylabel('幅度'); title('LFM 信号实部波形'); grid on; subplot(2,1,2); f_axis = (-N/2 : N/2-1) * fs / N; plot(f_axis/1e6, abs(fftshift(fft(s)))); xlabel('频率 / MHz'); ylabel('幅度谱'); title('LFM 信号幅度谱'); grid on;

代码逻辑说明:先由 K = B / T 算出调频斜率,时间轴选对称区间 [-T/2, T/2),让瞬时频率在零时刻过零,相位轨迹在 t=0 处最平缓。phase 是相位函数,对时间求导正好得到线性频率。最后用exp(1j*phase)生成解析信号,后续匹配滤波直接基于这个复信号做,不需要单独分离 I/Q 分量。

参数说明:fs 取 10 MHz 正好等于 2 倍带宽,这是最小推荐值;如果你的后端还要加多普勒模拟或频域滤波,建议直接取 20 MHz 以上,否则频谱混叠会干扰你对旁瓣的观察。N 的值由 T 和 fs 决定,这里是 500 个点,点数偏少,但用来验证波形结构足够。实际项目里 T 常取几百微秒、fs 几十 MHz,N 会到数千乃至数万,性能和显示要注意分寸。

到这里信号已经能生成,但你如果直接把它画成实部波形,看到的只是一段频率越来越密的振荡,直觉上"线性调频"不明显。更直观的做法是画瞬时频率理论线或时频图,不过那属于后处理,先按兵不动,下一步直接进匹配滤波,看看 LFM 真正的价值在哪里。

3. 脉冲压缩实现:匹配滤波的三种写法和参数细节

3.1 匹配滤波器的时域与频域原理

脉冲压缩的本质是匹配滤波。发射信号 s(t),回波是它的延时衰减副本,匹配滤波器的冲激响应为 h(t) = s*(-t),即发射信号的共轭倒序。它的输出 r(t) = s(t) * h(t),理论结果是 sinc 形状的窄脉冲,主瓣宽度约 1/B,峰值旁瓣电平约 -13.2 dB(即第一旁瓣比主瓣低 13.2 dB 左右)。

时域实现最直白:直接对回波信号做卷积。但点数多时,时域卷积计算量是 O(N²),非常吃亏。工程上几乎都用频域实现:对回波和滤波器冲激响应分别做 FFT,频域相乘后再 IFFT 回来。这样复杂度降到 O(N·logN)。另一种极端做法是把滤波器系数预先算出来存成向量,用conv或filter函数处理,适合点数小、对实时性不敏感的教学代码。

三种实现各有适用场景。conv写法代码量最小,但要小心输出长度是 N+M-1,距离轴要重新对齐;filter写出来的滤波器是因果的,输出有固定延时偏移;FFT 频域实现最接近工程雷达的处理流程,也是硬件实现的范式,建议作为首选方案。我一般给学生或新同事演示时,三种都跑一遍,对比输出峰值位置差多少,这是最直观理解匹配滤波延时特性的办法。

3.2 频域匹配滤波代码与距离轴换算

下面这段代码实现完整的目标回波仿真和匹配滤波。先放一个点目标在 750 米处,回波表现为发射信号的延时副本,幅度衰减。

% 目标回波仿真 c = 3e8; % 光速 R0 = 750; % 目标距离,单位 m delay = 2 * R0 / c; % 双程延时,单位 s echo = zeros(size(t)); % 回波向量 echo(round(delay*fs)+1) = 1; % 将目标脉冲置于对应时刻(理想点目标) s_echo = s .* exp(-1j*2*pi*0*delay) + 1e-3 * randn(size(t)); % 未用多普勒,加少量噪声

上面的写法是为了对齐索引,真实回波应该是circshift(s, delay_samples)实现整体延时再乘衰减系数。更规范的做法是先计算延时对应的采样点偏移量,把发射信号循环移位并乘以幅度衰减。下面是匹配滤波核心段落:

% 匹配滤波:频域实现 Nfft = 2 * N; % FFT 点数,补零到 2 倍,减少循环卷积混叠 S_echo = fft(s_echo, Nfft); S_ref = fft(conj(fliplr(s)), Nfft); % 匹配滤波器:共轭倒序 y = ifft(S_echo .* S_ref); % 频域相乘后 IFFT 回时域 y = y(1:N); % 只取有效区间对应的部分 % 距离轴:从时间延时换算为距离 t_y = (0 : N-1) / fs; % 匹配滤波输出的时间轴 R_axis = (t_y * c) / 2; % 双程延时对应的单程距离 amp_db = 20*log10(abs(y) / max(abs(y))); % 归一化幅度,单位 dB plot(R_axis, amp_db); xlabel('距离 / m'); ylabel('归一化幅度 / dB'); grid on;

这段代码的要害有三处。其一是匹配滤波器构造用了conj(fliplr(s)),等价于 s*(-t),而不是直接把 s 做共轭,很多初学翻车就是把fliplr丢掉。其二是 Nfft 取 2 倍补零,目的是让线性卷积的结果在圆周卷积里不产生时域混叠,否则输出尾部会出现一层伪峰。其三是距离轴换算公式 R = c·t/2,这个 1/2 对应雷达信号的双程传播。

参数说明:FFT 点数 Nfft 并不是越大越好,补零只能提升插值密度,让波形看起来更光滑,并不能提高真实的分辨率,分辨率由 B 决定。如果你的目标回波带了多普勒频移,匹配滤波会出现失配损失,峰值下降,这个问题留在第 5 章集中讲。这里的噪声功率 1e-3 是相对发射信号幅度定的,属于"干净环境",方便你看清脉压输出的结构。

运行后你会看到:主瓣出现在 750 米附近,主瓣宽度约 c/(2B) = 15 米,第一旁瓣比主瓣低约 13 dB。旁瓣旁边还有一层更低的裙边,那是 LFM 信号匹配滤波输出的典型形状——教科书上的 sinc。画图时把纵轴设成 dB,线性幅值下旁瓣几乎是贴着零轴的,只会让你误以为旁瓣不存在。

3.3 加窗抑制旁瓣:参数怎么调

sinc 输出最大的问题是第一旁瓣只比主瓣低 13 dB。如果有两个不同强度的目标靠在一起,强目标的旁瓣完全可能把弱目标的主瓣盖掉。解决办法是加窗而非改发射波形。常见的做法是在匹配滤波器上乘一个窗函数,代价是主瓣展宽约 1.3~1.5 倍,旁瓣降到 -40 dB 以下。

% 在滤波器上叠加海明窗 win = hamming(N).'; % 与 signal 等长的一维窗 h = conj(fliplr(s)) .* win; % 加窗后的匹配滤波器 y_win = ifft(fft(s_echo, Nfft) .* fft(h, Nfft)); y_win = y_win(1:N);

参数说明:Hamming 窗在脉冲压缩里的定位是"均衡解",第一旁瓣约 -43 dB,主瓣展宽 1.5 倍左右,适合大多数教学和工程验证;Hanning 窗旁瓣衰减快但主瓣更宽;Taylor 窗可以通过参数控制近旁瓣电平,常用于低旁瓣雷达设计中最严格的场景。窗函数加在时域滤波器系数上属于常规操作,如果你在频域直接乘窗也可以,但效果分布会略有差异,建议固定一种做法方便横向对比。

加窗后的输出主瓣变胖,这就是分辨率与旁瓣的权衡——天上不会掉馅饼,你牺牲了距离分辨能力换取对小目标的检测能力。仿真里要做的不是背结论,而是把win用不用、用哪种,各跑一遍,把主瓣宽度和旁瓣电平记录成表,这份数据写进 Word 说明几乎是"必杀材料"。

4. 把仿真整理成完整项目:主脚本组织、Word说明与结果判读

4.1 仿真主脚本的分节组织

写脉冲压缩仿真,最忌讳一段脚本从头写到尾,改一个参数要满文件翻找。我一般的组织方式是按"参数定义 → 信号生成 → 回波与噪声 → 脉压处理 → 结果绘图 → 指标计算"六个区块划分,每个区块用分隔注释隔开,并保证每个区块独立可执行。仿真参数全部集中放在脚本最前面的参数区,用变量定义,不要出现魔数。

区块关键内容常见错误
参数定义fs、T、B、R0、SNR、窗类型全局变量散落,改值要翻几处
信号生成时间轴、相位、LFM 信号时间轴起点不一致,距离轴对不上
回波生成延时、衰减、噪声、多普勒延时直接写数字而非由 R 算
脉压处理Nfft、滤波器构造、频域相乘丢 fliplr 或丢共轭
结果绘图波形、频谱、距离域fftshift 与坐标刻度对齐错误
指标计算主瓣宽度、旁瓣电平、分辨率只看图,不输出数值

脚本里每个区块结束后用disp打印当前关键状态,比如"目标延时 5.0 us,对应采样点 50",复盘定位问题会快得多。还有一点经验:把随机噪声的种子固定下来,rng(42),这样每次运行结果可复现,Word 里贴的图不会因为某次随机扰动而前后不一致。雷达仿真里噪声引入的随机性会让旁瓣电平有几 dB 的浮动,固定种子也是工程交付的常识。

4.2 Word说明的内容框架与图表编号

Word 说明文档不是把代码贴一遍了事,它的目的是让一个没看过你代码的人,能根据文档独立复现仿真并理解结果。我的模板固定为五节:仿真目的与指标要求、LFM 信号与脉冲压缩原理概述、参数设计与仿真环境、仿真结果及分析、结论与改进方向。

章节必含内容篇幅建议
仿真目的一句话说明验证什么指标半页
原理概述公式推导链、关键定义1~2 页
参数设计参数表、选择依据1 页
结果分析3~5 张图、每图 3 行分析2~3 页
结论改进与理论值对比误差半页

原理概述部分,我建议把公式全部用公式编辑器写,不要截图。参数表用三线表,参数名、符号、取值、单位、选择依据五个维度列全。结果分析里坚持"一图一析":每张图后写至少三句分析,第一句是图里看到什么现象,第二句是和理论值对比差多少,第三句是说明为什么有差异。这套结构评阅人或导师看到的第一印象就是"这是个做完不是赶完的项目"。

图表编号也有讲究。图 1 放 LFM 实部波形,图 2 放幅度谱,图 3 放脉冲压缩时域输出,图 4 放加窗对比。图题写在图下方,表题写在上方,目录自动生成,页码更新。很多人 Word 说明翻车不是内容不行,而是图题表题混乱、交叉引用全部断链,交付前花二十分钟把自动编号做完整。

4.3 运行结果的判读标准:什么算"对"了

仿真跑完不能只看图画得漂亮,要对着数值指标验证。脉冲压缩后第一旁瓣电平理论值是 -13.2 dB,你的仿真输出应该在 -13±0.5 dB 范围;加 Hamming 窗后应在 -43 dB 附近,主瓣宽度约从完全脉压输出的 1/B 展宽 1.5 倍。主瓣峰值位置对应目标距离,与实际设置的 R0 偏差应在距离分辨率 δR = c/(2B) 的 10% 以内。

把这些数值通过findpeaks函数从输出中直接提取:

[pks, locs] = findpeaks(amp_db, 'SortStr', 'descend', 'NPeaks', 2); first_sidelobe = pks(2); % 第二高峰即第一旁瓣 mainlobe_3dB = ... % 用主峰下降 3 dB 处两侧索引差计算

逻辑说明:findpeaks能自动找到局部极大值并按幅度排序,第一高峰是主瓣,第二高峰是旁瓣。主瓣 3 dB 宽度需要你自行写循环找左右两个下降 3 dB 的交点索引,做差值后再除以采样率换算成时间,再乘 c/2 得到距离宽度。这套指标提取代码建议单独存一个脚本,和主仿真脚本分离,方便多个参数配置下批量导数据。

判读标准并不苛刻,但能一次通过的人不多。最常见的问题是距离轴波形整体平移了几十米,原因是时间轴零点没对齐;或者是旁瓣电平比理论值高 3~5 dB,噪声底没做平均。所以先看主瓣位置对不对,再看旁瓣电平差多少,最后看分辨率是否吻合,按这三个顺序排查,基本能定位 90% 的问题。

5. 脉冲压缩仿真避坑指南:从波形错位到指标虚标

5.1 现象一:距离轴仿佛"平移",目标不在设定的距离上

回波仿真的延时计算用的是双程距离,但匹配滤波输出里还存在一个由滤波器固有延时带来的偏移。很多初学在生成时间轴时从 0 开始到 T,而不是以脉冲中心为 0,导致目标的等效延时起点错误,最终波形整体左移或右移几十米。原因就是时间轴定义不统一:发射信号的时间原点和回波的时间原点不是同一个。解决方法是固定一个约定:发射信号时间轴用 [-T/2, T/2),回波时间轴用 [0, 2Rmax/c],目标延时统一按 delay = 2R0/c 计算。验证时把理论峰值距离 R0 和提取出的峰值距离打印出来做差。

5.2 现象二:脉冲压缩输出尾部出现"鬼峰"

FFT 频域相乘实现的是圆周卷积,当 Nfft 小于 N + M - 1(两个序列长度之和减一),圆周卷积会把线性卷积尾部的数据卷回到头部,表现为输出两端出现对称的伪峰,幅度还不低。原因是对 Nfft 的理解不到位,以为只要大于 N 就行。解决方法是 Nfft 取不小于 N + length(h) - 1 的值,最省事的写法是Nfft = 2^nextpow2(N + length(s) - 1),这段代码能一直用下去。排查时把输入信号末尾补零,看鬼峰有没有消失,就知道是不是这个问题。

5.3 现象三:旁瓣电平比理论值高,弱目标被淹没

仿真里加噪声后,匹配滤波输出的旁瓣会被噪声底抬高,第一旁瓣电平从 -13.2 dB 恶化到 -8 dB 甚至更高。另一个更容易被忽略的原因是采样率不足,fs 太接近 B,导致匹配滤波器的频谱在边缘处衰减不完整,旁瓣昭示变差。解决方法是先固定高信噪比,比如 SNR = 30 dB,确认旁瓣是否恢复到理论值;如果仍然偏高,把 fs 提高到 4 倍带宽再测。这属于"环境先做干净,再做极限"的仿真方法论,不要一上来就在低 SNR 下混合调试。

5.4 现象四:加窗后主瓣宽度对不上理论值

Hamming 窗使主瓣从 1/B 展宽到约 1.5/B,但很多人在仿真里测出来是 1.8 甚至 2 倍,仔细一看是测量方式错误——他们量的是零点到零点宽度,而理论值指的是 3 dB 宽度。另一个因素是 Nfft 补零带来的插值密度不够,峰值附近采样点少,3 dB 交点定位不准确。解决方法是只要对比不同窗函数之间的相对展宽,统一用 3 dB 判据并用interp1做一次密采,不要让点数的疏密影响指标读数。这个坑踩过的人几乎每个小组都会有,属于典型的"测量方法比仿真本身更易翻车"。

5.5 现象五:加多普勒频移后输出峰值掉得离谱

LFM 的匹配滤波对多普勒敏感,目标径向速度一高,回波频率整体偏移,和匹配滤波器失配,输出峰值下降,同时主峰位置还会产生固定时移。很多人第一次做这个实验,看到峰值掉了 10 dB 以为代码错了。原因不是代码,而是 LFM 脉冲压缩本身的特性:速度越大,失配越严重。解决方法有两种路径:一是限制仿真场景的速度范围,把多普勒频移控制在 1/T 量级内,观察失配规律;二是改用 Dechirp 处理或分段匹配滤波。把这个失配曲线画出来,量化到什么速度峰值衰减一半,这段分析写进 Word 说明是加分项。

6. 进阶验证:用双目标实验测试最小可分辨距离

距离分辨率的仿真验证,最直接的方法是放两个等强度目标,间隔从远到近逐步缩小,观察脉压输出什么时候从两个峰变成一个大平顶,这个临界间隔就是系统在该参数下的最小可分辨距离。操作上先把第 4 章的脚本参数化成函数pulse_compress(T, B, fs, R_list, win_type),让两个目标的距离可配置,然后在一个循环里批量跑不同间隔。

R_targets = [750, 765]; % 双目标,间隔 15 m,等于 δR delays = 2 * R_targets / c; s_echo = zeros(1, N); for k = 1:2 d = round(delays(k) * fs); s_echo(d+1:d+N) = s_echo(d+1:d+N) + s; % 叠加两个回波 end % 后续匹配滤波处理同第 3 章代码

逻辑说明:间隔 15 米正好等于 c/(2B),理论上两个目标刚好落在彼此主瓣峰值上,仿真结果应当看到两个相邻峰之间有一个明显凹口,凹口深度约 2~3 dB。当间隔缩到 7 米时,两个主瓣融合成单峰,这就是"不可分辨"的判据。注意凹口深度的测量要基于 dB 纵轴,线性坐标下几乎看不出来。

这个实验的价值是把纸上公式变成你亲眼验证的工程直觉。做完双目标,你再去做四目标、不同幅度比目标,会发现旁瓣掩盖效应、窗函数作用、SNR 影响全部串起来了。我的习惯是把这套参数化脚本留下来,后面每次接手新雷达项目第一件事就是用它跑一遍分辨率预算,有改动时不用重新造轮子。LFM 脉冲压缩仿真的最大坑其实是"以为跑通等于会了",双目标实验能逼你把概念落实到波形判读上。希望帮到你。

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

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

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

立即咨询