
简介面向通信工程专业学生与科研人员的 MATLAB 噪声干扰仿真小工具聚焦噪声调幅NAM与噪声调频NFM两类常见干扰解决信号传输中信噪比下降、解调错误等问题。压缩包内共2个文件均为 .m 脚本整体约1KB分别实现噪声调幅和噪声调频的建模、调制、加噪与频谱分析流程。已有356人学习下载。脚本以载波生成、调幅/调频调制、高斯白噪声添加为基本链路可观察调幅信号的幅度随机波动如何拉低信噪比以及调频信号因频率扰动引发的解调错误并支持进一步结合误码率统计或频谱对比开展干扰抑制实验。无论是做通信原理课程设计、对抗干扰仿真入门还是相关课题预研这份资源都能帮助使用者快速建立对两类干扰机制的直观认知同时提供可扩展的 MATLAB 仿真框架。对于需要分析噪声影响或验证抗干扰算法的工程师也能从中获得实用的实验基座。1. 噪声调频FM与噪声调幅干扰先想清楚谱型再写matlab做雷达对抗仿真的第一天我一般不会急着调参数而是先问这个噪声调幅干扰到底是给接收机“罩”一片宽频带还是只想压制某个特定载频。很多人把噪声调频FM和噪声调幅干扰放在一块学却忽略了一个反直觉的事实调幅干扰代码最简单输出里却带着一根很强的载波谱线真正当连续波压制用时效率并不高噪声调频FM干扰频谱更接近矩形的遮盖特性才是工程仿真里更容易量化压制效果的那一个。这篇文章把两个模型从公式推到位给出可以直接复制到matlab里跑通的最小生成器再讲清楚调幅系数、调频斜率、调制噪声带宽这些参数在离散仿真里怎么才会不翻车。适合正在做雷达信号级仿真、电子对抗课题研究或者想快速验证“某种干扰能不能压住我现有检测算法”的工程师和学生。2. 两种干扰的数学模型噪声调幅和噪声调频FM的带宽差在哪2.1 噪声调幅干扰的表达式载波分量决定了窄带属性噪声调幅干扰的连续时间表达式很简洁$$ J_{AM}(t) A_0\left[1 m_{AM},u_n(t)\right]\cos\left(2\pi f_j t \varphi_0\right) $$其中 $u_n(t)$ 是零均值的平稳高斯噪声带宽记为 $\Delta f_n$$m_{AM}$ 是调幅系数$f_j$ 是干扰载频。注意这个式子里 $1 m_{AM}u_n(t)$ 永远围绕直流“1”波动所以输出功率谱在 $f_j$ 处保留一根载波谱线两侧再各伸展一段由 $u_n(t)$ 平移过来的噪声边带。工程估算时双边带主瓣宽度大约为 $2\Delta f_n$但载波里挤着相当大一部分功率边带实际分到的功率占比取决于 $m_{AM}$ 和噪声概率分布。这个特性直接决定了噪声调幅干扰适合的工作场景它对带宽内的噪声功率利用率不高但实现简单、包络特征清楚常用来做瞄准式窄带压制或者给后续欺骗干扰打掩护。仿真时容易犯的第一个错误是直接丢掉 $A_0$ 这一项只写m_am * u_n .* cos(...)那得到的是抑制载波调幅频谱里没有载波分量和真实调幅干扰完全不是一回事。2.2 噪声调频FM干扰的相位积分模型宽带遮盖的关键噪声调频FM干扰的表达式是$$ J_{FM}(t) A_j \cos\left(2\pi f_j t 2\pi K_{FM}\int_0^t u_n(\tau),d\tau \varphi_0\right) $$这里 $K_{FM}$ 是调频斜率单位是 Hz/V。瞬时频率 $f(t) f_j K_{FM}u_n(t)$而相位必须是瞬时频率对时间的积分所以表达式里出现了 $\int u_n(\tau)d\tau$。这行文字是后面写matlab最容易踩坑的地方很多人直接写cos(2*pi*(fc k_fm*u).*t)这在数学上把相位错误地当成了频率与时间的直接乘积频谱会被人工展宽仿真结论不可信。如果 $u_n(t)$ 是方差为 $\sigma_n^2$ 的高斯噪声定义有效频偏 $\Delta f_e K_{FM}\sigma_n$。输出带宽的经验公式为$$ \Delta f_j^{FM} \approx 2\left(\Delta f_e \Delta f_n\right) $$当 $\Delta f_e \ll \Delta f_n$ 时干扰近似窄带调频带宽趋近 $2\Delta f_n$当调频指数较大时带宽主要被 $2\Delta f_e$ 撑开频谱顶部趋向平坦这就是宽带压制干扰想要的形态。2.3 噪声调频与噪声调幅干扰的关键参数对照表对比项噪声调幅干扰噪声调频FM干扰频谱形态载波谱线 对称噪声边带整体被展宽的类矩形谱峰值功率与平均功率关系载波集中大量功率边带利用率低功率近似均匀分配在干扰带宽内带宽主要控制参数调制噪声带宽 $\Delta f_n$调频斜率 $K_{FM}$、$\sigma_n$ 与 $\Delta f_n$典型用途瞄准式压制、与欺骗干扰叠加宽带遮盖、对跳频或多目标覆盖matlab里最容易错的地方漏掉直流分量写成了抑制载波调幅相位没有积分直接拿频率乘时间这张表可以在写仿真前先过一遍确定你需要的干扰带宽后往右栏倒推参数比写完再改频谱要快得多。教材里常说的“调频干扰是宽带、调幅干扰是窄带”并不严格成立窄带调频同样存在带宽到底多宽要看调制噪声带宽和有效频偏的比值。2.4 用matlab的pwelch快速验证两种噪声干扰频谱形态纸上推公式容易但频谱长什么样最好一眼看到。下面这段脚本生成同一份基带噪声分别做噪声调幅和噪声调频FM然后用pwelch画功率谱fs 10e6; % 采样率 10 MHz T 1e-3; % 时长 1 ms fc 2e6; % 载波频率 2 MHz noise_bw 200e3; % 调制噪声带宽 200 kHz N round(fs * T); t (0:N-1). / fs; rng(1); u randn(N, 1); [b, a] butter(1, noise_bw/(fs/2), low); % 一阶低通限制噪声带宽 u_lp filter(b, a, u); u_lp u_lp - mean(u_lp); u_lp u_lp / std(u_lp); % 单位方差方便后面统一对比 m_am 0.8; % 调幅系数 y_am (1 m_am * u_lp) .* cos(2*pi*fc*t); % 噪声调幅干扰 k_fm 200e3; % 调频斜率对应有效频偏 200 kHz y_fm cos(2*pi*fc*t 2*pi*k_fm*cumsum(u_lp)/fs); % 噪声调频FM干扰 subplot(2,1,1); pwelch(y_am, hann(1024), 512, 4096, fs); title(噪声调幅干扰频谱); subplot(2,1,2); pwelch(y_fm, hann(1024), 512, 4096, fs); title(噪声调频FM干扰频谱);这段代码里cumsum实现了对调制噪声的积分除fs是把离散和转换成时间积分。调幅干扰那张图会看到中间一根明显高出噪声基底约十多个dB的载波谱线调频干扰那张图的谱峰相对平坦载波处没有孤立尖峰。noise_bw和k_fm是两个最容易改的参数把noise_bw从 200 kHz 调到 1 MHz对比两幅图的展宽程度就能直观理解 2.1 和 2.2 里的带宽估算式这比死记公式有用得多。3. 用matlab生成噪声调频与噪声调幅干扰信号的最小代码3.1 调制噪声源带宽从哪来两种干扰共用同一个基带噪声源区别只在调制方式。仿真时一般用randn生成白噪声再经过一阶或二阶低通滤波器把带宽压到设定值。滤波器的阶数决定噪声频谱滚降快慢一阶滚降慢噪声边带拖得长二阶滚降快频谱更接近矩形。宽带遮盖干扰仿真我习惯用二阶巴特沃斯瞄准式干扰用一阶反而更接近真实模拟电路。注意这里noise_bw是调制噪声带宽不是最终输出的干扰带宽。噪声调幅干扰的输出带宽大约是2*noise_bw噪声调频FM干扰还要叠加上有效频偏项。做参数设计时先定输出带宽再反推noise_bw不要直接拿输出带宽去设noise_bw。3.2 噪声调幅干扰生成函数SILICON 直流偏置不能省function y gen_noise_am_jammer(fs, T, fc, noise_bw, m_am) % GEN_NOISE_AM_JAMMER 生成噪声调幅干扰 % fs : 采样率, Hz % T : 干扰时长, s % fc : 载波频率, Hz % noise_bw: 调制噪声带宽, Hz % m_am : 调幅系数, 建议 0.3~0.9 N round(fs * T); t (0:N-1). / fs; % 零均值高斯白噪声 u randn(N, 1); % 低通滤波得到带限噪声 [b, a] butter(2, noise_bw/(fs/2), low); u_lp filter(b, a, u); u_lp u_lp - mean(u_lp); u_lp u_lp / std(u_lp); % 归一化到单位方差 % 幅度调制1 是直流偏置对应载波分量 y (1 m_am * u_lp) .* cos(2*pi*fc*t); end调用y gen_noise_am_jammer(10e6, 1e-3, 2e6, 200e3, 0.8)就能得到 1 ms 的噪声调幅干扰序列。代码里最关键的是(1 m_am*u_lp)这个括号直流“1”就是 2.1 节说的载波分量来源。std归一化让调幅系数成为一个有统计意义的量$m_{AM}\sigma_n$ 决定边带功率而不是临时拍脑袋的峰值比。3.3 噪声调频FM干扰生成函数相位必须积分function y gen_noise_fm_jammer(fs, T, fc, noise_bw, k_fm) % GEN_NOISE_FM_JAMMER 生成噪声调频FM干扰 % fs : 采样率, Hz % T : 干扰时长, s % fc : 载波频率, Hz % noise_bw: 调制噪声带宽, Hz % k_fm : 调频斜率, Hz/V % % 瞬时频率 fc k_fm * u(t)相位由频率积分得到 N round(fs * T); t (0:N-1). / fs; u randn(N, 1); [b, a] butter(2, noise_bw/(fs/2), low); u_lp filter(b, a, u); u_lp u_lp - mean(u_lp); % 不再归一化方差让 k_fm 直接参与控制频偏 % 频率误差项积分 - 相位 phase_noise 2 * pi * k_fm * cumsum(u_lp) / fs; % 载波相位 噪声积分相位 phase 2 * pi * fc * t phase_noise; y cos(phase); end这里调频斜率k_fm的单位是 Hz/V而u_lp是随机噪声“电压”所以瞬时频率偏移是k_fm * u_lp。cumsum(u_lp) / fs把离散样本累加成时间积分外面再乘2*pi*k_fm才得到弧度。如果漏掉cumsum输出信号的频谱会出现漫反射式的伪宽带分量频偏越大偏差越明显。3.4 生成后的带宽验算用3dB带宽核对参数表函数写完不能只看时域图必须在频域验算一次。下面的代码用pwelch估计频谱再找峰值下降3dB的范围[pxx, f] pwelch(y_fm, hann(1024), 512, 4096, fs); pxx_dB 10*log10(pxx); peak_dB max(pxx_dB); idx find(pxx_dB peak_dB - 3); bw_fm (f(idx(end)) - f(idx(1))) / 1e3; fprintf(FM干扰 3dB 带宽约 %.1f kHz\n, bw_fm);这个算法是粗估频谱有凹陷时find会把不连续的区域也算进来但对常见高斯调制噪声来说已经够用。运行后把结果和 $2(\Delta f_e \Delta f_n)$ 的估算值对比偏差在 20% 以内说明参数设计合理偏差过大就回头检查noise_bw是否设置正确或者k_fm是否超过了采样率允许的范围。4. 噪声调频干扰与噪声调幅干扰仿真中的三类参数坑4.1 调幅系数超过1过调幅会让带宽预测失效调幅系数m_am大于 1 时1 m_am*u_lp在某些噪声采样点上变成负数包络过零后发生相位翻转。连续波雷达干扰中偶尔有人故意这样来获得更宽的边带但如果仿真目标是评估接收机检测性能这种“人为过调幅”会引入额外谐波导致输出频谱里出现超出 $2\Delta f_n$ 预测的旁瓣分量。我一般把m_am限制在 0.3 到 0.9 之间。若必须模拟大深度调制就在调制通路里加限幅u_clip max(min(u_lp, 1), -1); % 先把噪声峰值限在 ±1 y (1 m_am * u_clip) .* cos(2*pi*fc*t);注意这样做的代价是边带功率被压缩实际干扰带宽内的功率谱密度会下降。仿真报告里要写清楚用的是线性区还是限幅区否则同一个m_am在不同随机种子下得到的频谱差异会很大。4.2 调频斜率过大相位溢出与奈奎斯特折叠FM干扰的瞬时频率是fc k_fm*u_lp。当k_fm设得太大瞬时频率可能超过fs/2输出频谱会出现折叠看起来好像带宽变宽了其实是混叠假象。生成信号前先做一次断言max_dev k_fm * max(abs(u_lp)); assert((fc max_dev) fs/2, 瞬时频率超出 Nyquist 边界请降低 k_fm 或提高 fs);另一个隐蔽问题是相位累积值变大。phase 2*pi*fc*t 2*pi*k_fm*cumsum(u_lp)/fs里的cumsum会随着时长线性增长对 1 秒的信号来说相位可以到 $10^6$ 量级浮点精度开始损失。cos对模 $2\pi$ 的相位周期重复所以可以安全折叠phase mod(phase pi, 2*pi) - pi; % 折叠到 [-pi, pi)不影响 cos 结果这个操作不会改变信号但能让数值误差小一个数量级。4.3 采样率不足频谱底噪抬高是典型信号采样率只会影响频谱混叠不会影响载波位置。常见现象是调幅干扰在远离载波的地方出现一片不该有的底噪调频干扰的频谱边缘出现对称的“卷边”。检查方法很简单直接看fs是否满足$$ f_s \gg 2\left(f_c K_{FM}\max|u_n(t)|\right) $$对调幅干扰条件变为 $f_s \gg 2(f_c \Delta f_n)$。写脚本时把这两条放进参数检查函数比盯着频谱找原因快得多。实操中我还会把干信比设成 0 dB对比不同采样率下同一参数干扰的频谱底噪底噪差 1 dB 以上就说明采样率不够。4.4 噪声调频干扰与噪声调幅干扰仿真的常见错误对照表错误写法或错误认知真实后果正确处理调幅干扰漏写直流偏置“1”变成抑制载波调幅载波谱线消失保留1 m*u的直流项FM干扰直接用cos(2*pi*(fckfm*u).*t)相位未积分频谱被人工展宽用cumsum先积分再乘2*pi*kfm把调制噪声带宽当作干扰带宽输出带宽被低估一倍甚至更多按 AM 用2Δfn、FM 用2(ΔfeΔfn)估算对所有干扰都用同一随机种子不同干扰参数对比时噪声基底不一致每次仿真记录rng种子可复现时固定它只看时域包络不看频域谱型无法发现过调幅和混叠生成后必跑一次pwelch验算带宽固定时长太短频谱分辨率不足看到锯齿状缺口让T*fs至少覆盖 4 个噪声带宽周期这张表是排错的第一站。如果频谱长得和理论不符逐行对照找原因比漫无目的地改k_fm和m_am高效很多。5. 把噪声调频FM干扰接到雷达检测链路里做压制评估5.1 最小检测链路回波、干扰、噪声叠加后看检测概率生成干扰只是第一步真正要回答的问题是“这个干扰参数能不能压住检测”。我常用一个极简单脉冲模型做相对评估信号是一个持续 $T_p$ 的矩形脉冲回波接收机用峰值包络检波加固定门限然后统计检测概率。fs 10e6; fc 2e6; T 1e-4; t (0:fs*T-1). / fs; sig cos(2*pi*fc*t); % 幅度为 1 的回波脉冲 threshold 0.35; % 固定门限工程中应由恒虚警决定 jsr_list -5:5:20; % 干信比扫描单位 dB n_trials 500; pd zeros(size(jsr_list)); for m 1:numel(jsr_list) jsr jsr_list(m); amp_j 10^(jsr/20); % 干扰幅度相对信号幅度 hit 0; for k 1:n_trials jam amp_j * gen_noise_fm_jammer(fs, T, fc, 200e3, 100e3); noise 0.1 * randn(fs*T, 1); r sig jam noise; hit hit (max(abs(r)) threshold); end pd(m) hit / n_trials; end plot(jsr_list, pd, o-); xlabel(干信比 JSR (dB)); ylabel(检测概率);这个模型把匹配滤波简化成了峰值检波只用来横向对比干扰样式不能用来标定绝对灵敏度。关键看两点一是曲线随jsr_list下降的斜率二是检测概率降到 50% 时所需的 JSR。把gen_noise_fm_jammer换成gen_noise_am_jammer在相同noise_bw下重复一次两条曲线在 50% 检测概率处的横坐标差就是调频干扰相对调幅干扰的压制优势这个数值随k_fm和m_am变化正好用来校验 2.2 节的带宽估算。5.2 用压制系数反推干扰参数并顺手跑参数扫描固定接收机门限后把 5.1 的循环包成一个函数输入是干扰类型、noise_bw、k_fm或m_am输出是 50% 检测概率对应的 JSR。接着用二分法在一个参数区间里找最小k_fm让压制效果达标。这类参数扫描循环很适合让 matlab 批量跑最近也有人问 Codex 是不是能像执行 Python 那样直接执行 MATLAB 任务至少在写这种多层 for 加pwelch验算的脚本时AI 能省不少敲键盘的时间但接收机判据和干扰参数表还是得人把关。跑完扫描后把gen_noise_fm_jammer的k_fm和noise_bw设成几组不同组合分别记录 50% 检测概率对应的 JSR填到 4.4 那张对照表里你的仿真报告就同时有了理论估算和信号级仿真两组数据后续换采样率或换接收机结构只需要重跑一遍扫描脚本。本文还有配套的精品资源点击获取