
简介这份资源围绕雷达通信一体化中的CPM-LFM信号系统分析射频噪声、移频、噪声调频与噪声卷积等典型干扰对信号检测和解码性能的影响。内容面向从事雷达通信一体化、波形设计与抗干扰研究的工程师和研究生既梳理各类干扰的产生机理与作用特点也给出仿真验证和量化评估思路有助于在系统设计阶段优选抗干扰策略。资源包共18个文件以11个Matlab脚本.m为主配合7个波形/频谱图.fig覆盖CPM调制、LFM波形生成、干扰注入以及Viterbi解调等关键环节包体仅2.5MB轻量易用。已有181人学习下载适合需要快速复现干扰场景、对比不同干扰强度下CPM-LFM信号性能的研究人员。通过运行源码和查看Fig图可直观理解移频、调频及卷积干扰对相位连续性和距离估计精度的影响为优化发射功率、滤波结构或解调算法提供参考。1. CPM-LFM 信号干扰效果分析为什么值得单独立题CPM-LFM 信号干扰效果分析第一步就是把压制式干扰、欺骗式干扰拉通做一遍对比而不是单独看某一种干扰。CPM-LFM 名字看着唬人其实拆开就两件事LFM 给了它大时宽带宽积和距离分辨力CPM 给了它恒包络和低旁瓣两者叠起来的好处是抗截获、抗宽带压制干扰都变强代价是很多传统干扰结论在它身上不成立。这篇笔记按雷达数据链和探测波形仿真常用的路子来写先确定评估指标再讲噪声调幅、噪声调频、噪声调相三类压制干扰的建模然后处理移频、灵巧噪声、密集假目标这类欺骗干扰最后把我在仿真里踩过的坑和参数边界说清楚。适合正在做雷达波形设计、电子对抗仿真或者通信一体化干扰评估的工程师跟着复现。2. 干扰效果度量的坐标系从干扰因子到脉压增益损失2.1 先建立基准无干扰时的 CPM-LFM 接收处理链路做干扰效果分析最怕基准飘。CPM-LFM 不是把 LFM 和 CPM 拼一起就完事接收端怎么处理会直接决定干扰好不好使。我一般先假定接收端知道波形的全部调制参数和当前脉冲的数据符号用理想匹配滤波做脉压。这样得到的干扰损失是“纯干扰段”造成的而不是接收机失配造成的。实际工程里也可以用 LFM-only 匹配滤波器但那种情况必须单独标注“失配接收”否则结论没法横向比较。基带仿真参数我会固定成一组常用配置这样多个干扰样式才有共同横坐标。下面这组参数来自我做过的一体化波形评估项目带宽、脉宽、调制指数都按常见雷达数据链场景取参数数值说明脉冲宽度 T100 us大时宽带宽积的典型值LFM 带宽 B10 MHz距离分辨力约 15 m采样率 fs80 MHz至少 4 倍过采样CPM 调制指数 h0.5对应 MSK 类连续相位符号速率 Rb1 Msps一个脉冲内 100 个符号热噪声 SNR20 dB无干扰时输出 SINR 基线需要说明的是CPM-LFM 信号在复基带里写成s(t) exp(j*pi*mu*t^2) * exp(j*phi_cpm(t))其中mu B/T是 LFM 调频斜率phi_cpm(t)是 CPM 附加相位。脉冲压缩参考信号直接取h_ref(t) conj(s(-t))也就是把带 CPM 相位的完整波形时域反转取共轭。此时 LFM 部分对白噪声的处理增益接近B*T也就是 30 dB 左右CPM 部分如果不参与匹配主瓣会变宽、旁瓣抬高这一点在避坑章节再展开。2.2 干扰效果的三类度量指标时域、脉压域、解调域干扰效果评价不是一句“看起来被压住了”就行。我习惯把指标分成三层干扰注入前的时域功率、脉压后的输出信干比、解调后的误码率或假目标分布。三层指标对应不同读者射频工程师看干信比算法工程师看脉压输出系统工程师看最终检测和误码。常用指标如下指标定义用途JSR干信比干扰带内功率 / 信号带内功率统一横坐标输出 SINR脉压主峰功率 / 旁瓣区平均功率判定检测是否失效SINR 损失无干扰输出 SINR - 有干扰输出 SINR干扰样式排序假目标偏移量脉压峰值位置相对真实目标的时延欺骗干扰判定BER解调误码率数据链载荷评估实际仿真里我先把输出 SINR 作为首要指标因为它不依赖某个具体解调器的实现不同干扰样式之间可比。对雷达检测输出 SINR 低于 13 dB 通常意味着单脉冲检测已经不靠谱对通信模式还要看 BER 是否超过 FEC 修正门限。后面所有章节的对比默认都用“SINR 损失”作为主指标。3. 噪声干扰的建模与 CPM-LFM 响应调幅/调频/调相三件套3.1 调幅、调频、调相干扰的建模差异先看频谱三种压制式干扰的基带复包络差别非常大直接决定了脉压后的残留功率。噪声调幅干扰的复包络是(U0 U_n(t)) * exp(j*2*pi*fj*t)其中 U_n 是带限高斯噪声频谱里有一段残留下边带和一条载波谱线。噪声调频干扰是恒包络、相位对噪声积分exp(j*(2*pi*fj*t 2*pi*kf*integral(n)))瞬时频率跟随噪声走等效带宽主要由调频灵敏度 kf 决定。噪声调相干扰同样恒包络但相位直接跟噪声走exp(j*kp*n(t))它在带宽外的谱衰减比调频慢所以对匹配滤波的影响方式又不一样。对一个 LFM 信号做匹配滤波相当于把干扰的频谱和信号频谱做相关积分。调幅干扰的载波谱线只要落在 LFM 扫频范围内就会获得接近相参的压缩增益调频干扰因为瞬时频率变化太快落在匹配滤波相关带宽内的能量很少脉压后往往被压得很低调相干扰介于两者之间。CPM 附加相位会让这种相关积分进一步打散尤其是峰值旁瓣区域很多用普通 LFM 仿真得出的“调频干扰效果好”结论到 CPM-LFM 上可能完全反转。3.2 三类干扰注入 CPM-LFM 的最小代码下面这套代码不依赖平台装好 numpy 和 scipy 就能跑。先产生一个 CPM-LFM 脉冲再分别生成三种噪声干扰最后通过匹配滤波输出 SINR 损失来比较。import numpy as np from scipy.signal import butter, lfilter, fftconvolve def cpm_lfm_pulse(T100e-6, B10e6, fs80e6, h0.5, Rb1e6, seed42): 生成 CPM-LFM 复基带脉冲1REC 矩形频率脉冲 N int(T * fs) t np.arange(N) / fs mu B / T s_lfm np.exp(1j * np.pi * mu * t ** 2) rng np.random.default_rng(seed) n_sym int(np.ceil(T * Rb)) syms 2 * rng.integers(0, 2, n_sym) - 1.0 # 双极性符号 sps int(round(fs / Rb)) # 每符号采样点数 freq np.repeat(syms, sps) if len(freq) N: freq freq[:N] else: freq np.concatenate([freq, np.zeros(N - len(freq))]) phi_cpm np.pi * h * np.cumsum(freq) / fs # 相位累加 return t, s_lfm * np.exp(1j * phi_cpm) def bandlimited_noise(N, fs, bw, seed0): 生成单位功率带限复高斯噪声 rng np.random.default_rng(seed) w rng.standard_normal(N) 1j * rng.standard_normal(N) w / np.sqrt(np.mean(np.abs(w) ** 2)) if bw 0.5 * fs: return w b, a butter(4, bw / (0.5 * fs), btypelow) out lfilter(b, a, w) return out / np.sqrt(np.mean(np.abs(out) ** 2)) def scale_jsr(s, j, jsr_db): 把干扰功率缩放到指定干信比 ps np.mean(np.abs(s) ** 2) pj np.mean(np.abs(j) ** 2) return j * np.sqrt(ps * 10 ** (jsr_db / 10) / pj) def add_noise(s, snr_db, seed0): 叠加全频带热噪声 rng np.random.default_rng(seed) n rng.standard_normal(len(s)) 1j * rng.standard_normal(len(s)) n / np.sqrt(np.mean(np.abs(n) ** 2)) ps np.mean(np.abs(s) ** 2) return s n * np.sqrt(ps * 10 ** (-snr_db / 10)) def make_am_jammer(t, fs80e6, m0.3, fj0.0, seed1): n bandlimited_noise(len(t), fs, 10e6, seedseed) return (1.0 m * n) * np.exp(1j * 2 * np.pi * fj * t) def make_fm_jammer(t, fs80e6, bw_noise10e6, kf10e6, seed2): n bandlimited_noise(len(t), fs, bw_noise, seedseed) phase 2 * np.pi * kf * np.cumsum(n) / fs return np.exp(1j * phase) def make_pm_jammer(t, fs80e6, kp2.0, bw10e6, seed3): n bandlimited_noise(len(t), fs, bw, seedseed) return np.exp(1j * kp * n) def output_sinr(s, x, fs, guard_s1e-6): 脉压后主峰功率与旁瓣区平均功率之比 h_ref np.conj(s[::-1]) y fftconvolve(x, h_ref) peak_idx np.argmax(np.abs(y)) guard int(guard_s * fs * 2) mask np.ones(len(y), dtypebool) mask[max(0, peak_idx - guard):peak_idx guard] False peak np.abs(y[peak_idx]) ** 2 floor np.mean(np.abs(y[mask]) ** 2) return 10 * np.log10(peak / floor)代码里phi_cpm用cumsum实现积分已经是 1REC CPM 的精确表达换成 GMSK 只需把频率脉冲从矩形改成高斯型评估流程不变。scale_jsr按信号功率和干扰功率算归一化系数保证不同干扰样式在同一 JSR 下可比。跑对比的主循环很短t, s cpm_lfm_pulse() x0 add_noise(s, 20.0, seed100) sinr_base output_sinr(s, x0, 80e6) for name, jam in [ (AM, make_am_jammer(t)), (FM, make_fm_jammer(t)), (PM, make_pm_jammer(t)), ]: x x0 scale_jsr(s, jam, 15.0) # JSR 15 dB loss sinr_base - output_sinr(s, x, 80e6) print(name, f{loss:.1f} dB)这段逻辑看起来简单但有两个参数值得反复调一个是调幅深度 mm 太大时1m*n会过调制包络出现反相干扰模型失真另一个是调频灵敏度 kf它直接决定干扰谱位置同一个 JSR 下 kf 差两倍输出 SINR 损失可能差 6 dB 以上。3.3 结果判读为什么调相干扰往往更“划算”按上面参数跑完常见的结果趋势是同带宽同 JSR 下噪声调相干扰造成的 SINR 损失通常大于调幅而调频干扰表现最温和。原因是 CPM-LFM 的相位连续特性会把调频干扰的随机相位进一步“抹平”匹配滤波对这种纯随机相位干扰的抑制接近理论下限调相干扰虽然也随机但它的相位调制指数 kp 控制着谱形状适度增大 kp 可以让干扰能量更贴近信号带宽又不至于像调频那样被快速扫出相关窗口。这个结论反过来用更值钱评估宽带噪声干扰在 CPM-LFM 上的效能时不要只报一个 JSR。把 kf 或 kp 从 2 MHz 扫到 20 MHz你会发现最佳干扰带宽往往不是越宽越好而是和 LFM 带宽的 1.2 到 2 倍之间。过宽的干扰会被脉压增益稀释过窄的干扰又覆盖不了 CPM 附加边带。4. 灵巧干扰与假目标干扰参数敏感性和仿真实现4.1 移频干扰一个频率参数决定假目标落点移频干扰对普通 LFM 几乎是标准操作截获信号后做一个频移再原样转发脉压输出就会在真实目标前后挪出一个假峰。对 CPM-LFM同样的方法有效但效果打了折扣。def make_shift_jammer(s, t, fs, df, delay_s0.0): 转发式移频干扰支持时延 n len(t) d int(round(delay_s * fs)) if d 0: s_d np.concatenate([np.zeros(d), s[: n - d]]) elif d 0: s_d np.concatenate([s[-d:], np.zeros(-d)]) else: s_d s.copy() return s_d * np.exp(1j * 2 * np.pi * df * t)看输出峰值位置时记住 LFM 的时移-频移耦合关系上调频信号频移 Δf匹配滤波峰值会提前 Δf/μ 秒换算成采样点就是-df / mu * fs。其中mu B/T按前面的参数mu 1e11所以 1 MHz 的频移对应 10 us 的时间偏移在 80 MHz 采样率下正好 800 个采样点。如果用普通 LFM这个假峰几乎不损失但 CPM-LFM 的附加相位和移频后的载波相位混在一起假设干扰机转发的也是同一个数据脉冲频移后 CPM 相位没有跟着变相关峰会出现主瓣分裂和旁瓣不对称。工程上观察到的现象是真实目标旁边出现一个偏小 3~8 dB 的假目标而不是干净的单峰。4.2 灵巧噪声干扰为什么它能穿透匹配滤波灵巧噪声本质上是把截获信号的频谱当作基底把噪声调制上去再转发。它不像普通噪声干扰那样被 LFM 脉压增益惩罚因为干扰里每一段谱都和信号谱“贴着走”。def make_smart_noise(s, t, fs, bw5e6, delay_s10e-6, seed4): n len(t) d int(round(delay_s * fs)) if d 0: s_d np.concatenate([np.zeros(d), s[: n - d]]) else: s_d s.copy() noise bandlimited_noise(n, fs, bw, seedseed) return s_d * noise关键在bw这个参数噪声带宽越小干扰和信号的相关性越强脉压输出里会出现一个抬高的大平台噪声带宽越大平台越宽但每个距离单元上的功率密度越低。对 CPM-LFM由于信号本身带 CPM 数据相位灵巧噪声里的“信号基底”是当前脉冲的一段复制所以它对当前脉冲的脉压响应最强对下一脉冲大概率因为数据符号不同而失配。实际评估中不能只注入一个脉冲就下结论至少要把 50 到 100 个不同数据序列跑一遍看干扰平台的平均抬升量。4.3 密集假目标干扰参数扫描与效果判定密集假目标干扰是把多路移频、延迟版本叠加转发产生的输出在距离轴上一串假峰用来饱和检测器和后续跟踪器。和普通 LFM 相比CPM-LFM 的假峰幅度随数据符号起伏导致每个假目标高度不一。仿真时最方便的做法是把前面make_shift_jammer放进循环def make_dense_false_targets(s, t, fs, df_list[-4e6, -2e6, 0.5e6, 2e6], delay_list[10e-6, 20e-6, 30e-6, 40e-6], amp_listNone, seed5): rng np.random.default_rng(seed) jam np.zeros_like(s) for i, (df, delay) in enumerate(zip(df_list, delay_list)): amp amp_list[i] if amp_list else 1.0 jam amp * make_shift_jammer(s, t, fs, dfdf, delay_sdelay) return jam这组参数里每个假目标在脉压输出中的位置是t_k delay_k - df_k / mu。注意这个关系是线性的所以参数扫描特别适合用均匀网格df 从 -5 MHz 扫到 5 MHzdelay 从 0 扫到 50 us每个组合跑一次脉压把峰值超过 CFAR 门限的坐标画出来。对 CPM-LFM 的特殊提示是由于 CPM 相位随数据变化假目标峰值不是稳定值这时要看的是“假目标出现的概率”而不是单次峰值。我一般用 100 个脉冲统计某个距离单元出现超门限峰值的次数超过 80%才认定那里被成功欺骗。5. CPM-LFM 干扰分析避坑5 个高频翻车点与对策5.1 匹配滤波器照抄 LFM忘了 CPM 相位现象无干扰时脉压输出主瓣变宽旁瓣比理论值高 3 dB 以上干扰效果分析跟着全错。 原因直接把exp(j*pi*mu*t^2)当参考信号做匹配滤波把 CPM 附加相位丢掉了。CPM 相位虽然是缓变低幅值但它在长脉冲里会累计到几十甚至上百弧度和 LFM 的二次相位叠加后参考不匹配。 解决参考信号必须包含完整 CPM 相位即h_ref np.conj(s[::-1])。如果需要做失配分析单独保留一个 LFM-only 参考并明确标注“失配损失”是多少不要混进干扰损失里。我最早吃这个亏时把失配损失当成干扰效果结果报告完全失真。5.2 采样率不够干扰带宽混叠现象把噪声调频干扰的 kf 调大输出 SINR 损失急剧上升甚至超过 JSR 上限看起来不合常理。 原因仿真只看了干扰“总功率”没看频谱。kf 调大后调频干扰瞬时频率超过 fs/2高频分量折叠回带内等效于在信号带宽里额外灌了一倍功率。 解决生成噪声干扰前先带限bandlimited_noise的 bw 不要超过 0.4*fs并且每次报告 JSR 时注明“带内 JSR”还是“总 JSR”。对 CPM-LFM 这类带宽本身较宽的波形我一般把干扰带宽限制在 fs/2 的 60% 以内混叠的影响压到 0.1 dB 以下。5.3 干信比定义不统一结果无法横向比较现象两种干扰样式单独跑都有 10 dB 的 SINR 损失但拆开看一个干扰带宽 2 MHz另一个 20 MHzJSR 完全不可比。 原因功率归一化时一个按信号带内功率一个按干扰总功率干扰功率在带外白白浪费了。 解决定义JSR 干扰带内功率 / 信号带内功率这里的“带内”指的是 CPM-LFM 的 99% 能量带宽。干扰生成后先滤波到该带宽再缩放后面所有曲线才能放在同一张图上。我项目里的惯例是同时记录“总 JSR”和“带内 JSR”两个值表格里优先用带内值。5.4 把随机噪声的尾巴峰值当成假目标现象带 20 dB 热噪声跑脉压输出尾部总有几个明显凸起的峰被自动峰值检测识别成假目标。 原因匹配滤波输出对白噪声也会产生随机峰值序列越长出现超出门限的峰值概率越高这是纯统计现象不是干扰样式导致的。 解决评估假目标干扰前先用无干扰热噪声跑 100 次统计尾部峰值分布把 CFAR 门限系数校准到虚警概率可接受的水平。之后再注入欺骗式干扰凡是没有超过这个校准门限的峰一律不算假目标。对 CPM-LFM 尤其重要因为数据随机性带来的旁瓣抬升会改变峰值基底门限必须随不同数据序列重新校准。5.5 只报误码率不报同步状态现象通信模式下某个干扰样式 BER 曲线很好看但接收端载波同步早已失锁BER 是解调器“瞎猜”的结果。 原因CPM-LFM 的相位连续特性对同步环影响很大干扰让同步环失锁后BER 失去统计意义。 解决评估通信载荷时至少同时给出“符号同步是否锁定”和“载波相位差是否收敛”两个状态位。只有同步正常时统计 BER失锁时直接把该点标为“中断”不参与曲线拟合。我发现很多报告里“抗干扰性能很好”的结论其实掩盖了同步早已崩溃的事实。6. 进阶批量参数扫描与干扰效能曲面验证与工程落地技巧单点对比只能告诉你“哪个干扰在某个 JSR 下更强”落到工程上不够。我会把评估脚本改成一个二维扫描横轴是 JSR纵轴是干扰参数输出是一张 SINR 损失热力图。对噪声调频干扰扫描 kf 和 JSR对移频干扰扫描 Δf 和延迟对灵巧噪声扫描带宽和 JSR。代码结构非常固定就是两层循环jsr_list np.arange(-5, 31, 5) kf_list np.arange(2e6, 21e6, 2e6) loss_map np.zeros((len(jsr_list), len(kf_list))) for i, jsr in enumerate(jsr_list): for j, kf in enumerate(kf_list): jam make_fm_jammer(t, kfkf) x x0 scale_jsr(s, jam, jsr) loss_map[i, j] output_sinr(s, x, 80e6) - sinr_base把loss_map存成矩阵后面画热力图或者直接找“损失超过 10 dB”的参数区这才是能写进报告的干扰效能包络。跑这个扫描时一个重要习惯是固定随机种子所有干扰样式和所有数据序列用同一个 seed保证对比差异完全来自干扰本身而不是仿真噪声的偶然性。另一个更关键的验证技巧是跑理论基线对纯白噪声干扰匹配滤波输出 SINR 损失应该约等于JSR - 10*log10(B*T)。用前面参数就是JSR - 30 dB如果实测和这条理论线偏差超过 1 dB先回头查参考信号和功率归一化别急着分析曲线。我早期吃过亏只在两三个干信比下比较干扰样式还被随机种子带偏结论翻转了好几次。后来把扫描、固定种子、理论基线校验做成固定流程才敢把结论往报告里写。如果你要从头搭一套 CPM-LFM 干扰评估我建议先把这套流程立住再去堆干扰花样希望帮到你。本文还有配套的精品资源点击获取