简介:这是一份面向雷达系统设计与信号处理学习的MATLAB源码包,围绕雷达发射信号、回波信号与脉冲压缩核心技术,提供了从信号生成、目标回波构建到匹配滤波处理的完整示例。压缩包共6个文件,全部为.m脚本,整体仅8KB,包含主程序、发射信号生成、目标回波构造、匹配滤波及辅助函数等模块,结构紧凑清晰,便于按功能对照学习。目前已有296人浏览学习,适合正在学习雷达原理、脉冲压缩或数字信号处理的本科生及工程技术人员作为课程设计参考。读者可直接运行各脚本,观察发射脉冲、回波延迟与脉压输出之间的对应关系,理解回波中目标距离、位置等信息的提取方法;通过修改信号参数,还能直观体会距离分辨率与探测距离的权衡以及匹配滤波对信噪比的改善。脉冲压缩环节的完整实现,能帮助读者掌握宽带短脉冲如何通过匹配滤波器获得窄带长脉冲的探测优势,为后续雷达系统仿真与性能优化打下基础。
1. 先说结论:脉冲压缩为什么能让雷达“又远又清楚”
雷达一直有个两难:要想探测得远,就得发宽脉冲、提高平均功率;但脉冲一宽,距离分辨率就变差,两个靠得近的目标在回波里会糊成一团。脉冲压缩做的就是把这个矛盾拆掉——发射时用宽脉冲把能量打出去,接收后用匹配滤波把回波“压”成窄脉冲,让分辨率回到宽带信号的水平。这套逻辑听起来很绕,但 rader2 这个源码包里的 6 个 MATLAB 文件,恰好把发射、回波、脉冲压缩整条链路拆开摆在了桌面上。它不是一个完整的雷达系统仿真工程,而是一套专门讲清“雷达发射信号长什么样、回波怎么构造、匹配滤波怎么把回波压窄”的教学级代码。适合正在学雷达信号处理的学生,也适合刚接手雷达仿真项目、想快速验证算法流程的工程师。读完之后你能直接跑通从发射到脉压的一整条仿真流程,并且知道每一步参数该怎么改、波形上看什么。
2. 发射信号生成:从 rect.m 到 signal_tran1101.m 的波形构造与参数设计
2.1 rect.m 是整套代码的地基,矩形包络决定脉冲的“开关”
雷达发射信号在仿真里通常不是直接写一个完整表达式,而是用“包络 × 载频”的方式分层构造。rect.m 这个文件就是干这个的,它生成一个矩形门函数,用来控制脉冲在时间轴上的存在区间。绝大多数线性调频信号的表达式里都有 rect(t/T) 这一项,它的作用很简单:在 -T/2 到 T/2 之间取 1,其余时间取 0。
function y = rect(t, T) % 矩形包络函数 % 输入:t 时间轴向量, T 脉冲宽度 % 输出:y 包络值,脉冲内为 1,脉冲外为 0 y = zeros(size(t)); y(abs(t) <= T/2) = 1; end这段代码的逻辑很直观:先按输入时间轴的长度生成全零向量,然后把时间落在脉冲宽度范围内的位置置 1。参数上只有 T 一个关键量,它的单位是秒,与后面的采样率 fs 直接关联。比如 T = 10e-6 表示 10 微秒脉宽,在 fs = 100 MHz 下,对应 1000 个采样点。这个值不是随便定的——脉宽决定了雷达发射信号的平均功率,脉宽越大,平均功率越高,探测距离越远,但脉冲越宽,距离分辨率越差。所以 rect.m 里的 T 要跟后面线性调频信号的带宽一起看,不能单独调。
实际使用中,我一般不会单独调用 rect.m,而是把它嵌进发射信号生成函数里。但验证这个函数对不对有个很简单的办法:直接 plot(t, rect(t, T)),如果矩形前后沿各占一个采样点、中间全程为 1,说明包络没问题。采样率不够时,矩形的前后沿会看着“斜”,这不是代码错误,而是离散采样的正常现象,后面所有波形的边沿都会有这个问题。
2.2 signal_tran1101.m 生成线性调频发射信号:带宽与脉宽如何联动
signal_tran1101.m 是发射信号的核心生成函数,它输出的就是雷达真正“发”出去的波形。现代雷达里用得最多的发射信号是线性调频信号(LFM),它的瞬时频率随时间线性变化,所以也叫 chirp 信号。选择 LFM 而不是单频脉冲,是因为脉冲压缩的效果直接取决于信号带宽——带宽越大,压缩后的主瓣越窄,距离分辨率越高。而 LFM 可以在不缩短脉宽的前提下把带宽做大,这就绕开了“脉宽与分辨率”的死结。
function s_tx = signal_tran1101(t, T, B, fc) % 线性调频发射信号生成 % 输入:t 时间轴, T 脉冲宽度, B 信号带宽, fc 载频 % 输出:s_tx 复基带发射信号(不含载频调制) K = B / T; % 调频斜率 phase = pi * K * t.^2; % 瞬时相位 s_tx = rect(t, T) .* exp(1j * phase); end这里做的是复基带仿真,所以没有在信号上乘 exp(1j2pifct) 的载频项。载频 fc 只是作为参数传入,用来在后续计算波长、多普勒频移时使用,这对回波仿真是有意义的。调频斜率 K = B/T 是 LFM 信号最核心的物理量,它决定了频率随时间变化的快慢。举个例子,T = 10e-6、B = 10 MHz 时,K = 1e12 Hz/s,发射信号在 10 微秒内扫过 10 MHz 的频带。这个 K 值在匹配滤波时要被用到吗?严格说不用显式用到,因为匹配滤波的参考信号直接就是发射信号本身,K 的作用已经隐含在波形里了。
2.3 Signal_transmit.m 与 signal_tran1101.m 的分工与边界
源码包里同时出现了 Signal_transmit.m 和 signal_tran1101.m,乍一看是重复的。我从函数命名和雷达仿真的一般做法看,Signal_transmit.m 更可能是一个封装层:它负责把信号功率、天线增益、发射损耗等因素折算进去,输出一个带功率量纲的发射信号;而 signal_tran1101.m 只负责波形生成,输出的是归一化幅度。实际雷达方程里,发射信号要乘上 sqrt(P_t)(发射功率开方)才变成有物理幅度的信号,但如果你的目的只是验证脉冲压缩算法,归一化信号完全够用。
function s_tx_full = Signal_transmit(t, T, B, fc, Pt) % 带功率信息的发射信号封装 s_tx_norm = signal_tran1101(t, T, B, fc); s_tx_full = sqrt(Pt) * s_tx_norm; end我一般建议初学者在脉冲压缩环节全程用归一化信号,把功率折算放到最后看信噪比时再补。原因很简单:匹配滤波器的输出幅度与输入信号幅度成线性关系,归一化处理不会改变主瓣位置和波形形状,只会让纵轴数值变得“不好看”。如果你在某一步发现脉压后的峰值异常大或者异常小,先检查是不是前面乘了功率系数、后面又在某个地方除了同一个系数。这种问题在仿真链路上排查起来非常费劲,不如从一开始就统一量纲。
参数设计速查表
| 参数 | 符号 | 典型值 | 作用 | 调整影响 |
|---|---|---|---|---|
| 脉冲宽度 | T | 10e-6 s | 决定平均功率与发射能量 | 越大探测越远,但分辨率变差 |
| 信号带宽 | B | 10 MHz | 决定距离分辨率与脉压比 | 越大分辨率越高,但采样率要求越高 |
| 调频斜率 | K | B/T | 频率变化快慢 | 由 T、B 决定,不单独设置 |
| 采样率 | fs | 100 MHz | 离散化精度 | 至少大于 2 倍带宽,工程上取 5-10 倍 |
| 载频 | fc | 10 GHz | 计算波长与多普勒 | 不影响脉压波形,影响目标速度估计 |
这套参数不是死的,你可以把 B 从 10 MHz 改到 50 MHz 再跑一次,观察压缩后主瓣变窄了多少——这是理解“带宽决定分辨率”最直观的方式,后面第 6 章我会给出一套具体的验证方法。
3. 回波信号建模:Signal_echo.m 里的时延、幅度与信噪比设置
3.1 点目标回波的本质:发射信号的延迟副本加噪声
雷达回波信号听起来很玄,但在一阶仿真里,它就是一个被延迟、被衰减、被叠加了噪声的发射信号副本。目标的位置体现为时延,目标的大小和距离体现为幅度衰减,环境复杂性统一用噪声来代表。Signal_echo.m 这个文件干的正是这件事:把发射信号在时间轴上平移一段距离,乘上一个衰减系数,加上高斯白噪声,就得到了回波。
function s_echo = Signal_echo(s_tx, fs, delay_time, amp, SNR_dB) % 点目标回波生成 % 输入:s_tx 发射信号, fs 采样率, delay_time 目标时延(秒) % amp 回波幅度衰减系数, SNR_dB 信噪比(dB) % 输出:s_echo 叠加噪声后的回波信号 delay_samples = round(delay_time * fs); % 时延换算为采样点数 s_delayed = [zeros(1, delay_samples), s_tx]; % 时延通过补零实现 % 加噪:按信噪比生成噪声功率 signal_power = mean(abs(s_delayed).^2); noise_power = signal_power / (10^(SNR_dB/10)); noise = sqrt(noise_power/2) * (randn(size(s_delayed)) + 1j*randn(size(s_delayed))); s_echo = amp * s_delayed + noise; end这段代码里最容易被忽略的是 noise_power/2 这一项。复噪声有实部和虚部两个通道,每个通道的功率各占一半,所以生成噪声时要用 sqrt(noise_power/2) 而不是 sqrt(noise_power)。这是个很典型的“看着对、跑起来信噪比差 3 dB”的坑——如果你直接用 randn 不除以 sqrt(2),最后测出来的实际 SNR 会比设定值整整大 3 dB,因为总噪声功率被加成了两倍。后面第 5 章我会再提一次这个问题。
3.2 时延、幅度和信噪比三个参数怎么配合
时延 delay_time 是回波仿真里最重要的参数,因为它直接对应目标距离。二者换算关系是 R = c * delay_time / 2,除以 2 是因为电磁波要走一个来回。比如 delay_time = 66.7e-6 秒,对应距离 R = 3e8 * 66.7e-6 / 2 ≈ 10000 米。在代码里,这个时延被换算成采样点数 delay_samples = round(delay_time * fs),然后用前补零的方式实现。这里有个精度问题:如果 fs = 100 MHz,一个采样点对应的时间是 10 ns,对应的距离量化步长是 1.5 米。如果你的目标要想放在 10000.5 米,当前采样率下做不到,只能 round 到 10000 米或 10001 米附近。
幅度衰减系数 amp 的作用是模拟目标距离、RCS(雷达散射截面)和传播损耗的综合效果。严格做法是按雷达方程计算:amp = sqrt(G_t * G_r * lambda^2 * sigma / ((4*pi)^3 * R^4)),但教学仿真里通常直接给一个 0.01 到 0.5 之间的数。0.01 表示回波非常弱,接近噪声底;0.5 表示强反射目标。我建议做脉冲压缩实验时先用 0.1 左右,让回波在压缩前勉强能从时域波形里看出轮廓,这样压缩前后的对比效果最直观。
信噪比 SNR_dB 的设置则决定了你是在“理想环境”还是“噪声环境”下验证算法。SNR_dB = 20 时噪声很小,脉压后峰值非常清晰;SNR_dB = 0 时噪声很大,但脉冲压缩的处理增益能把目标从噪声里捞出来。脉冲压缩的处理增益等于时宽带宽积 T*B,以 10 MHz 带宽、10 微秒脉宽为例,增益是 100(20 dB)。这意味着即使输入 SNR 是 -10 dB,脉压后 SNR 也能回到 10 dB 左右。这个“从噪声里捞目标”的过程才是脉冲压缩最值得看的现象,建议把 SNR_dB 从 20 一路调到 -10 再跑几遍。
3.3 回波数组长度陷阱:补零后信号变长了
上面那段代码里,s_delayed = [zeros(1, delay_samples), s_tx] 会让回波数组长度比发射信号长 delay_samples 个点。这不是 bug,而是必须的——目标越远,回波到达时间越晚,数组当然要更长才能装下整个回波。但这个长度变化会传导到后面的匹配滤波环节:如果你用的参考信号 s_tx 长度只有 N,回波长度是 N + delay_samples,两个信号做 FFT 时长度不匹配,就得先做补零对齐。这一步处理不当,脉压结果的峰值位置就会出现偏差,第五章里我会专门展开讲。
4. 脉冲压缩的实现核心:Signal_match.m 匹配滤波器与频域处理
4.1 匹配滤波的理论依据:为什么是“共轭翻转”而不是直接卷积
脉冲压缩的数学本质是让回波信号通过一个匹配滤波器,这个滤波器的冲激响应是发射信号的共轭翻转,即 h(t) = s_tx*(-t)。对应到频域,匹配滤波器的传递函数就是发射信号频谱的共轭,H(f) = S_tx*(f)。所以在数字实现里,脉冲压缩可以一步写成:
y(t) = IFFT( FFT(s_echo) · conj(FFT(s_tx_ref)) )
其中 s_tx_ref 是本地存储的发射信号副本。这里必须用共轭而不是直接乘 S(f),原因在于“匹配”要求的是相位对齐:回波中的每个频率分量经过滤波器后,相位被全部补偿到同相,于是各频率分量在某一时刻相干叠加,形成窄而高的尖峰。如果你直接乘 S(f) 而不是 S*(f),相位不但没对齐反而加倍错乱,输出就是一团没有任何尖峰的噪声。
function y_compressed = Signal_match(s_echo, s_tx_ref) % 匹配滤波脉冲压缩(频域实现) % 输入:s_echo 回波信号, s_tx_ref 本地参考信号(发射信号副本) % 输出:y_compressed 脉压结果 N_echo = length(s_echo); N_ref = length(s_tx_ref); N_fft = N_echo + N_ref - 1; % 线性卷积所需FFT长度 S_echo = fft(s_echo, N_fft); S_ref = fft(s_tx_ref, N_fft); Y = S_echo .* conj(S_ref); % 频域匹配 y_compressed = ifft(Y); end参数说明里最关键的是 N_fft = N_echo + N_ref - 1。这是线性卷积的规矩:两个长度分别为 M 和 N 的序列做线性卷积,结果长度为 M+N-1,FFT 点数必须不小于这个值,否则时域卷积和频域相乘就不等价——会出现“循环卷积混叠”,脉压波形会被前后折叠污染,主瓣旁边莫名其妙多出两个假峰。很多初学雷达仿真的朋友第一次跑脉压发现主瓣两侧出现了对称的异常波纹,八成就是 FFT 长度没设够。
4.2 参考信号必须用发射信号副本,而不是回波本身
匹配滤波里的 s_tx_ref 必须取发射信号的干净副本。有的初学者会把回波信号自己跟自己匹配,也就是用 conj(FFT(s_echo)) 去乘 FFT(s_echo),这等于把回波信号的能量谱全变成实数,得到的是回波的自相关函数,而不是匹配滤波结果。自相关也能出一个峰,但它的主瓣位置不受时延信息控制,只反映回波自身的能量集中性,完全无法用来提取目标距离。判断你有没有用错参考信号,有一个很简单的检测方法:把回波里的目标时延改大或改小,正确的匹配滤波会让输出峰值位置跟着移动,而错误的自相关匹配峰值基本原地不动。
4.3 主程序 main1105.m 怎么把四个环节串起来
main1105.m 是整个源码包的总控脚本,它的作用是按顺序调用前面几个函数,把“发射 → 回波 → 匹配滤波 → 画图”这条流水线跑通。一个典型的调用顺序如下:
%% 参数设置 fs = 100e6; % 采样率 100 MHz T = 10e-6; % 脉冲宽度 10 微秒 B = 10e6; % 带宽 10 MHz fc = 10e9; % 载频 10 GHz c = 3e8; % 光速 %% 时间轴 t = -T/2 : 1/fs : T/2 - 1/fs; % 发射信号时长内的采样点 %% 发射信号 s_tx = signal_tran1101(t, T, B, fc); %% 回波信号:目标距离 10km,时延约 66.7 微秒 R_target = 10000; % 米 delay_time = 2 * R_target / c; s_echo = Signal_echo(s_tx, fs, delay_time, 0.1, 10); %% 脉冲压缩 y = Signal_match(s_echo, s_tx); %% 画图 range_axis = (0 : length(y)-1) * c / (2 * fs); % 时间轴换算为距离轴 figure; subplot(2,1,1); plot(abs(s_echo)); title('回波信号时域幅度'); subplot(2,1,2); plot(range_axis, 20*log10(abs(y)/max(abs(y)))); title('脉冲压缩输出'); xlabel('距离 (m)');这段主程序的逻辑说明:时间轴 t 使用了 -T/2 到 T/2 的对称区间,这是因为 LFM 信号的相位表达式 piKt.^2 以 t=0 为对称中心。如果你用 0 到 T 的非对称时间轴,LFM 信号的频率变化起点和终点会偏移,脉压后的主瓣位置也会有固定的偏移量。回波的 delay_time 用 2R/c 计算,对应的是双程时延。最后画图的距离轴换算也要用 2fs 做分母,这里除以 2 的原因和时延计算一致——一个采样点对应的时间是 1/fs,但对应的是半米距离的往返。
这段代码跑通后,你应该能在第二个子图里看到一个尖锐的峰值,它出现在约 10000 米的位置,而且峰值周围有一些对称的旁瓣起伏。旁瓣是 LFM 信号经过匹配滤波后的固有现象——理论上是 sinc 函数形状的包络,第一旁瓣比主瓣低约 13.2 dB。如果你看到第一旁瓣只比主瓣低 10 dB 甚至更低,先检查是不是 FFT 长度不对,或者参考信号长度与回波长度不一致但没做对齐。
5. 参数与波形决策的避坑指南:四种常见翻车现场与排查路径
5.1 翻车现场一:脉压后主瓣两侧出现对称的“鬼影”波纹
现象:脉冲压缩输出的主瓣确实在目标位置,但主瓣两侧各多出一串对称的波纹,而且这些波纹不随目标距离变化而消失,幅度只比主瓣低 20 dB 左右。把信噪比调到很高后依然存在。
原因:FFT 点数不够,频域相乘发生了循环卷积混叠。回波长度等于发射信号长度加时延点数,FFT 点数如果只取 length(s_echo) 而不是 length(s_echo) + length(s_tx) - 1,回波尾部被“卷”回到头部,与主瓣发生干涉。
解决:把 N_fft 强制设定为不小于 length(s_echo) + length(s_ref) - 1 的 2 的幂,比如 N_fft = 2^nextpow2(N_echo + N_ref - 1),再跑一次。波形上的鬼影会消失得干干净净。这是匹配滤波实现里最常见的坑,几乎每个从频域直接做 FFTP 的初学者都会踩一次。
5.2 翻车现场二:脉压输出峰值位置跟目标距离对不上,总是差几百米
现象:目标设在 10000 米,但脉压峰值出现在 9800 米或 10200 米左右。信噪比正常、波形也正常,就是位置有偏差。
原因:大概率出在时间轴构造或时延计算上。如果你用 0 到 T 的时间轴而不是 -T/2 到 T/2,LFM 信号的能量中心不在 t=0,匹配滤波输出峰值会跟着偏移半个脉宽对应的距离——10 微秒脉宽对应 1500 米,半个脉宽就是 750 米。另一个常见原因是时延计算用了 R/c 而不是 2*R/c,这是单程和双程的区别,差整整一倍距离。
解决:先确认时间轴是否以 0 为中心对称;再检查 delay_time = 2*R_target/c 是否带上了系数 2。如果两个都正确但仍有几米到几十米的偏差,多看下一个问题——距离量化误差。
5.3 翻车现场三:峰值位置总是落在“半个采样点”附近的整数偏移上
现象:目标距离换算成时延后再换算成采样点数,发现 delay_time * fs 是 6667.5 这种带小数的值。round 之后目标被归到最近的整数采样点,脉压峰值与理论位置差了约 0.5 个采样点,对应距离误差约 0.75 米(fs=100MHz 时)。如果你设的目标距离刻意取在量化边界附近,误差会更明显。
原因:这是离散采样系统的固有限制。任何时延在采样时刻之间的目标,都只能被分配到最近的采样点上,0.5 个采样点的最大误差是物理规律,不是代码 bug。
解决:接受量化误差,或者提高采样率。采样率提高到 200 MHz 时,距离量化误差减半到约 0.375 米。工程里如果要求亚米级精度,就要用插值或过采样。还有一种 trick:在回波生成时不做取整,而是用更细的时间网格生成信号再重采样,但这在教学仿真里没必要。一般够用就好,重点是把量化误差控制在可接受范围。
5.4 翻车现场四:脉压输出的旁瓣高得像主瓣,弱目标完全被淹没
现象:两个目标,一个强一个弱,距离相隔约 300 米。脉压后强目标的旁瓣幅度比弱目标的主瓣还高,弱目标根本看不出来。这在实际雷达里叫“掩蔽效应”,但很多仿真是因为没加窗造成的。
原因:LFM 匹配滤波的固有旁瓣是 sinc 型,第一旁瓣只比主瓣低 13.2 dB。如果弱目标比强目标弱 20 dB,它就会被埋在第一旁瓣里。
解决:在匹配滤波前对回波信号加窗——海明窗、汉宁窗或布莱克曼窗都可以。加窗后旁瓣能压到 -40 dB 以下,但主瓣会变宽约 1.5 倍,距离分辨率略有牺牲。雷达工程里常说“时域加窗是旁瓣与分辨率之间的权衡”,没有免费的午餐。代码如下:
N_echo = length(s_echo); win = hamming(N_echo).'; s_echo_win = s_echo .* win; y_win = Signal_match(s_echo_win, s_tx);加窗后你会发现旁瓣确实被压下去了,但主瓣宽度展宽了。如果你同时要求低旁瓣和窄主瓣,那就得用更复杂的失配滤波设计(比如在频域设计加权系数),那是另一个层面的工程问题了。仿真阶段先用窗函数,理解“加窗改变脉压结果”这个现象即可。
5.5 翻车现场五:复数噪声的信噪比永远比设定值高 3 dB
现象:设定 SNR = 10 dB,但用脉压前回波信号实测信噪比总是 13 dB。
原因:复噪声由实部噪声和虚部噪声构成,randn 函数生成的实部噪声功率已经是总噪声功率的一半。代码里如果写成 sqrt(noise_power) * randn(size(s_delayed)) 而不是 sqrt(noise_power/2) * (randn + 1jrandn),实际生成的总噪声功率是 2noise_power,比设定值大一倍,导致实测 SNR 比设定值低 3 dB。反过来,如果你用的是单通道实数噪声,又会出现 SNR 比设定高 3 dB 的情况。
解决:统一用复数噪声模型,噪声总功率 = 实部功率 + 虚部功率,每个通道分配 noise_power/2。确认方法是在加噪前后分别计算 signal_power / noise_power,对比实测值与设定值,应该严格一致。这是我自己的血泪经验,曾经在一个项目里排查了整两天才发现是复噪声功率分配的问题。
6. 进阶验证法:用脉压前后对比和距离分辨率实验验证仿真链路
主程序跑通之后,别急着改参数到处玩,先做一件最有价值的验证:定量检验“距离分辨率 = c/(2B)”这条公式在你的仿真链路里是否成立。这能同时验证发射信号带宽设置、匹配滤波实现、距离轴换算三段代码的正确性,比看十个波形图都管用。
做法是设置两个幅度相同的目标,一强一弱无所谓,关键是距离间隔从 100 米开始,逐步增大,每次跑完记录脉压后两个峰值的分辨情况。理论上 B = 10 MHz 时,距离分辨率是 c/(2B) = 3e8/(2*10e6) = 15 米。也就是说,两个目标相距 15 米以上时,脉压后应该能看到两个独立的峰值;小于 15 米时,两个峰合成一个,只表现为主瓣变宽。
具体操作:把 Signal_echo.m 改成能同时生成两个回波的版本,比如调用两次 Signal_echo 再叠加,或者在一个函数内部生成两个不同时延的目标回波相加。两个目标的幅度建议都设成 0.1,信噪比设成 20 dB,避免噪声干扰判断。
R1 = 10000; % 目标1距离 R2 = 10015; % 目标2距离,间隔15米 delay1 = 2*R1/c; delay2 = 2*R2/c; s_echo1 = Signal_echo(s_tx, fs, delay1, 0.1, 20); s_echo2 = Signal_echo(s_tx, fs, delay2, 0.1, 20); s_echo = s_echo1 + s_echo2; % 两个回波叠加 y = Signal_match(s_echo, s_tx);跑完这个实验你会看到两个有意思的现象。第一,当目标间隔正好等于 15 米时,脉压输出中部的凹陷刚好降到两个峰值连线的底部附近——这个位置就是分辨率的极限特征,在雷达里叫 Rayleigh 判据。第二,如果把距离间隔改成 10 米,两个峰会逐渐合并,很难判断是一个目标还是两个目标。
这个现象建议你多做几组数据,形成一张“目标间隔 vs 峰值分离度”的对照表:
| 目标间隔(米) | 是否可分 | 主瓣观察特征 |
|---|---|---|
| 30 | 明显可分 | 两个独立尖峰,中间有清晰低谷 |
| 15 | 临界可分 | 两峰相邻,中间凹陷接近等高点 |
| 10 | 不可分 | 合并为单峰,峰顶略微变平 |
| 5 | 完全不可分 | 单峰,包络与单目标几乎一致 |
做完这组实验,你对脉冲压缩的理解就从“好像懂了原理”升级到“我知道参数怎么影响结果”了。原理是死的,公式是抽象的,但你在图上亲眼看到 15 米间隔从双峰变单峰的临界过程之后,这个知识点就真正长在你身上了。
另一个我常用的验证技巧:把带宽 B 从 10 MHz 改成 20 MHz,重复上面的 15 米间隔实验。理论上分辨率提高到 7.5 米,之前不可分的 10 米间隔现在应该能分开了。如果实验结果符合这个判断,那你的整套仿真链路基本可以确定是正确的——发射信号、回波建模、匹配滤波、距离轴换算四个环节之间配合一致,任何一环有错都会在这个实验里暴露。
从那以后,我每次改完波形参数,都会强制走一遍“带宽—主瓣宽度—双目标分离度”的核对流程,先跑定量验证再去看具体波形。这套习惯帮我排掉过至少三次低级错误,也让我对“参数和现象之间是什么关系”有了比公式更踏实的直觉。如果这套代码能帮你把脉冲压缩那条链路真正跑通、看明白几个波形上的关键转折,那这份资源就算没白下。希望帮到你。
本文还有配套的精品资源,点击获取