尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

通信干扰识别指南:用Matlab生成五种典型干扰与时频图

发布时间:2026/9/23 21:48:57

资讯中心
01
ARTICLE

通信干扰识别指南:用Matlab生成五种典型干扰与时频图

通信干扰识别指南:用Matlab生成五种典型干扰与时频图
简介面向通信干扰识别与时频分析学习者的MATLAB仿真资源包系统覆盖单音干扰、多音干扰、射频噪声、线性扫频干扰与梳状干扰等常见类型配套生成脚本可快速输出典型干扰波形便于结合时频图理解各类干扰的频域特征与动态变化规律也可作为干扰抑制算法验证的输入信号。资源共5个文件全部为.m脚本压缩包仅4KB轻量精简适合通信原理、信号处理课程实验或科研预研直接调用。目前已有508人学习下载。代码包含干扰信号生成与部分频带干扰处理示例无需复杂配置即可运行能帮助读者将理论描述与仿真现象对应起来为后续滤波器设计或抗干扰策略验证提供便捷起点。1. 通信干扰与时频图五个脚本看清干扰的来龙去脉通信干扰的判断最直接的工具是时频图。做通信仿真的人大概都经历过这种场景接收端误码率突然恶化频谱仪上却只有一片噪声换成时频图一看一条斜线从低频扫到高频问题立刻定位到线性扫频干扰。单音干扰、多音干扰、射频噪声、线性扫频、梳状谱——这五种最常见的通信干扰各有辨识度极高的时频形态。这份通信干扰 code 资源把五种干扰做成了独立的 Matlab 生成器SinglGen、MultyGen、LfmGen、CombGen、bufenpindai 这五个 .m 文件分别负责一类信号配合短时傅里叶变换STFT即可画出时频图。适合正在做干扰识别、抗干扰仿真或信号处理毕设的人。下面从时频特征开始拆再逐步落到代码和排错。2. 干扰的时频特征先认识五种形态再上手生成2.1 单音干扰与多音干扰横线、点列与频谱泄漏单音干扰是频率单一的正弦干扰数学上可写成 ( x(t) A e^{j(2\pi f_j t \phi)} )。它进入接收机后会在一整段时间内持续占据某一个频点STFT 之后在时频图上表现为一条与时间轴平行的水平亮线亮线的纵坐标就是干扰频率 ( f_j )。由于加窗会引入频谱泄漏实际看到的不是一根无限细线而是一条带一定宽度的亮带干扰功率越大亮带越粗两侧旁瓣也越明显。多音干扰是多个单音的线性叠加时频图上就是多条水平线。这里有一个非常容易误判的细节如果两个频点靠得太近间距小于 STFT 的频率分辨率两条线会融合成一条宽带看起来很像部分频带噪声。判断方法是取时频图某个时刻的竖直截面也就是瞬时频谱离散尖峰对多音平坦抬升对噪声。射频噪声干扰则不同它由随机电磁能量产生在时频图上没有固定频率模式表现为整片或某一片频带内的噪声底色抬升。2.2 线性扫频干扰斜线斜率与瞬时带宽线性扫频干扰的瞬时频率随时间线性变化表达式为 ( f(t) f_0 K t )其中 ( K (f_1 - f_0) / T ) 是调频斜率单位为 Hz/s。在时频图上它表现为一条斜线上扫频时斜率为正下扫频为负。斜线的斜率就是 K扫频范围从 ( f_0 ) 到 ( f_1 )瞬时带宽为 ( B |f_1 - f_0| )。STFT 之所以能画出这条斜线是因为加窗后的一小段信号近似单音频谱峰值恰好落在这一小段时间的瞬时频率附近。窗长越短窗内频率变化越小斜线越平滑窗长越长频率分辨率越高但窗内扫过的频率范围越大反而导致峰值位置偏移斜线变成阶梯甚至锯齿。后面避坑章节会专门讲这个。实际对抗仿真里线性扫频干扰常被用作宽带压制干扰因为它能在短时间内覆盖整个通信带宽。2.3 梳状谱与部分频带等距梳齿与噪声平台梳状干扰通常由混频或频率倍增等非线性效应产生在频域形成一组等间隔的离散频率分量像梳子的齿。时频图上表现为多根等距水平线间距由基频决定。它和多音干扰的区别在于多音的频率点未必等间隔而梳状干扰的间隔是严格均匀的。判断时可以数时频图频率轴上的谱线间距若能找出一个稳定的最小间隔基本就是梳状谱。部分频带噪声是射频噪声干扰的一个变种它把噪声能量限制在某个带内而不是铺满整个频谱。时频图上表现为一条固定的水平噪声带带内噪底明显高于带外带宽和中心频率一眼就能看出来。干扰识别时部分频带容易被误判成多音融合宽带区别还是看瞬时频谱剖面噪声带内部幅值随机起伏、没有稳定离散峰而多音融合至少保留若干可分辨的峰。干扰类型时频图形态最容易被误判为单音干扰一条水平亮线多音干扰的泄漏旁瓣多音干扰多条水平线梳状干扰或部分频带线性扫频一条斜线跳频或阶梯扫频梳状干扰多根等距水平线多音干扰部分频带噪声带内噪声底抬升多音融合宽带3. 五个生成器怎么调用文件分工与关键参数设置这套资源的核心是五个生成器文件。拆开压缩包后顶层并没有统一的入口脚本需要自己写一个调用流程。我重新梳理了一份顶层脚本把五个生成器串起来一次性生成五路干扰信号并保存。文件干扰类型主要输入参数输出SinglGen.m单音干扰fs, fj, T, A固定频率复指数序列MultyGen.m多音干扰fs, fjs, T, A多频点叠加序列LfmGen.m线性扫频干扰fs, f0, f1, T, A线性调频序列CombGen.m梳状谱干扰fs, f0, df, num, T, A等间隔多频序列bufenpindai.m部分频带噪声fs, fc, bw, T带限噪声序列3.1 顶层调用公共采样率与时长的统一编写顶层脚本时第一件事是统一采样率和时长。采样率 fs 决定所有干扰频率的上限时长 T 决定每个序列的长度。如果各生成器内部对 T 的处理不一致后续拼接矩阵会因为长度不同直接报错。%% 顶层调用生成五种干扰并保存 fs 20e6; % 采样率 20 MHz T 200e-6; % 信号时长 200 us x1 SinglGen(fs, 3e6, T, 1.0); % 单音 3 MHz x2 MultyGen(fs, [2e6 4e6 6e6], T, 1.0); % 多音 2/4/6 MHz x3 LfmGen(fs, 1e6, 8e6, T, 1.0); % 线性扫频 1~8 MHz x4 CombGen(fs, 2e6, 0.5e6, 8, T, 1.0); % 梳状 8 根间隔 0.5 MHz x5 bufenpindai(fs, 10e6, 4e6, T); % 部分频带 8~12 MHz save(five_jamming.mat, fs, x1, x2, x3, x4, x5);这里每个生成器内部都用 round(T * fs) 计算样本数避免浮点运算导致小数点后误差。采样率 20 MHz 意味着奈奎斯特频率是 10 MHz所以所有干扰频率必须低于 10 MHz。后面 CombGen 的最后一根齿是 2 7 * 0.5 5.5 MHz没有越界可以放心用。3.2 SinglGen 与 MultyGen单音、多音的频率向量设计单音生成器在资源里的实现思路很直接生成一个长度为 N 的复指数序列。注意这里刻意使用复指数而不是 (\cos)原因后面避坑章节会展开。function x SinglGen(fs, fj, T, A) % 单音干扰固定频率复指数 % fs 采样率, fj 干扰频率, T 时长, A 幅度 N round(T * fs); t (0:N-1). / fs; x A * exp(1j * 2 * pi * fj * t); end参数上最容易出错的是 fj 和 fs 的关系。fj 必须小于 fs/2一旦接近奈奎斯特频率会触发频谱混叠时频图上的水平线会折返到带内。实际工程里我一般把干扰频率控制在 fs/4 以下留出余量。幅度 A 建议用线性幅度而不是 dB因为后续算干噪比 JNR 时要用线性功率dB 转来转去容易乱。多音生成器则是把多个单音做线性叠加。这里的 fjs 是频率向量A 可以是标量也可以是与 fjs 等长的向量。function x MultyGen(fs, fjs, T, A) % 多音干扰多频点叠加 % fjs 频率向量, A 幅度向量或标量 N round(T * fs); t (0:N-1). / fs; x zeros(N, 1); for k 1:length(fjs) x x A(k) * exp(1j * 2 * pi * fjs(k) * t); end end循环写法在数据量不大时完全够用也更容易检查每个频点是否都被正确叠加。如果追求矩阵化可以用sum(A(:) .* exp(1j*2*pi*fjs(:)*t.), 1).但是 t 必须保持列向量、fjs 必须保持列向量维度一旦转置错结果就会出现相位错位。多音频率向量的间距建议大于 STFT 的频率分辨率否则时频图上分不开这点在绘图章节再细算。3.3 LfmGen 与 CombGen相位积分与梳齿间隔线性扫频最容易写错的地方是相位公式。瞬时频率是相位的导数所以相位必须是瞬时频率对时间的积分。从 f0 线性扫到 f1相位表达式是 ( 2\pi(f_0 t \frac{1}{2} K t^2) )不是 ( 2\pi (f_0 Kt)t )。function x LfmGen(fs, f0, f1, T, A) % 线性扫频干扰频率从 f0 线性变化到 f1 N round(T * fs); t (0:N-1). / fs; B f1 - f0; % 扫频带宽 K B / T; % 调频斜率 Hz/s phase 2 * pi * (f0 * t 0.5 * K * t.^2); x A * exp(1j * phase); end如果把相位写成2*pi*(f0 K*t).*t相当于额外乘了一个平方项瞬时频率会变成 ( f0 2Kt )时频图上的斜线斜率翻倍。这种错误在时频图上非常隐蔽因为看起来仍然是斜线但斜率对不上理论值。自己验证时可以先画出 STFT 再计算斜率的数值和 K 对比。梳状生成器和多音生成器结构类似区别在于频率是等间隔排列的且齿数由 num 显式控制。function x CombGen(fs, f0, df, num, T, A) % 梳状谱干扰从 f0 开始等间隔 num 根梳齿 N round(T * fs); t (0:N-1). / fs; x zeros(N, 1); for k 0:num-1 fk f0 k * df; x x A * exp(1j * 2 * pi * fk * t); end end梳齿间隔 df 是识别梳状干扰的关键。如果 df 小于频率分辨率梳齿会在时频图上融成一条宽带齿数完全数不出来。我在做干扰识别算法时经常故意把 df 设成略大于分辨率的值方便肉眼验证。3.4 bufenpindai部分频带噪声的通带控制bufenpindai 从名字看就是部分频带它生成的是带限噪声。由于射频噪声干扰在自然界中往往是宽带的通过带通滤波把噪声限制在某个子带内就能模拟部分频带干扰。function x bufenpindai(fs, fc, bw, T) % 部分频带噪声干扰带通限噪 N round(T * fs); noise randn(N, 1) 1j * randn(N, 1); Fn_low (fc - bw/2) / (fs/2); Fn_high (fc bw/2) / (fs/2); [b, a] butter(6, [Fn_low Fn_high], bandpass); x filtfilt(b, a, noise); % 归一化到单位平均功率 x x / sqrt(mean(abs(x).^2)); end这里用 butter(6) 是常见做法六阶巴特沃斯滤波器过渡带不算太宽也不太容易产生数值不稳定。filtfilt 做零相位滤波避免滤波引入相位失真。要注意巴特沃斯滤波器的 -3 dB 带宽和设定带宽有偏差如果对带宽精度要求高改用等波纹 FIR 滤波器更合适。归一化这步很关键它保证后续叠加干扰时每个干扰源的功率是 1方便用 JNR 精确控制。4. 时频图绘制STFT 窗长、重叠与坐标校准4.1 为什么单张频谱不够用FFT 只能告诉你信号里有哪些频率成分却无法告诉你这些频率什么时候出现。线性扫频干扰从 1 MHz 扫到 8 MHz在整段信号上做 FFT只能看到一个从 1 到 8 MHz 的宽谱无法判断它是扫频干扰、跳频干扰还是宽带噪声。STFT 的思路是把信号切成很多小段每段加窗后做 FFT再把所有小段按时间顺序排成二维矩阵横轴是时间、纵轴是频率、颜色是能量。得到的就是时频图。4.2 spectrogram 参数设置窗长、重叠、NFFT 的配合Matlab 的 spectrogram 函数是画时频图最直接的工具。窗长 nwindow 决定频率分辨率重叠率决定时间方向上的平滑程度nfft 决定频域的插值密度。window_len 256; noverlap 220; nfft 512; [S, F, T] spectrogram(x, hamming(window_len), noverlap, nfft, fs); P 20 * log10(abs(S) eps); imagesc(T * 1e6, F / 1e6, P); % 横轴 us纵轴 MHz axis xy; xlabel(时间 (us)); ylabel(频率 (MHz)); ylim([0 fs/2/1e6]); clim([-60 0]); % 旧版本用 caxis colorbar;参数选择直接影响时频图的判读。以 fs 20 MHz、window_len 256 为例频率分辨率约为 fs / window_len 78.125 kHz。时间分辨率取决于窗长和重叠率的差值(window_len - noverlap) / fs (256 - 220) / 20e6 1.8 us也就是每 1.8 微秒输出一个时间切片。重叠率越高时频图在时间方向上越平滑但计算量也越大nfft 一般取大于等于 window_len 的 2 的幂512 就够了补零只能让频谱看起来更平滑不能提高真实分辨率。参数示例作用对图形的影响window_len256每段窗内样本数越大频率分辨率越高时间分辨率越低noverlap220相邻窗重叠样本数越大时间轴越平滑nfft512FFT 点数频域插值密度clim[-60 0]色标动态范围固定后不同干扰可对比4.3 从时频图反推干扰参数峰值提取与斜率测量时频图不仅能看还能用来定量测量干扰参数。找出每个时间点频谱最大值对应的频率就能画出瞬时频率轨迹。对线性扫频干扰这条轨迹应该是一条直线直线的斜率就是调频斜率 K。[~, idx] max(abs(S), [], 1); % 每个时刻取频谱最大值位置 f_est F(idx); % 去掉首尾不完整的窗 mask 3:length(T)-2; p polyfit(T(mask), f_est(mask), 1); K_est p(1); % 估计的调频斜率 Hz/s f0_est p(2); % 估计的起始频率 Hzpolyfit 拟合时建议把首尾几个点去掉因为 spectrogram 输出的最早和最晚时刻对应的窗通常只有部分数据覆盖峰值位置会有偏移。如果拟合出来的斜率和 LfmGen 里设置的 K 对不上优先检查相位公式是不是写错了。4.4 五种干扰统一绘图动态范围对齐做五种干扰分析时如果把五个信号放在同一张图里对比必须固定动态范围。否则强单音会把色标拉得很宽弱干扰直接变成一片深色看不见。X {x1, x2, x3, x4, x5}; titles {单音, 多音, 线性扫频, 梳状, 部分频带}; for k 1:5 subplot(3, 2, k); [S, F, TT] spectrogram(X{k}, hamming(128), 110, 256, fs); imagesc(TT * 1e6, F / 1e6, 20 * log10(abs(S) eps)); axis xy; clim([-60 0]); title(titles{k}); xlabel(时间 (us)); ylabel(频率 (MHz)); end这里窗长用了 128 而不是 256是为了在五种干扰形态差异大时优先保证时间分辨率。单音和多音是稳态信号窗长短一点、频率分辨率差点问题不大线性扫频如果窗太长斜线会失真。所以统一绘图时取折中值。5. 干扰生成与时频图的五个常见问题排查5.1 单音干扰出现镜像频率多了一条线现象设置单音 3 MHz时频图上除了 3 MHz 横线还在 17 MHz 附近出现一条对称的线。原因生成信号时用了cos(2*pi*fj*t)而不是复指数。实信号的频谱是双边谱3 MHz 的负频率分量 -3 MHz 会被数字系统以 fs20 MHz 为周期搬到 17 MHz 处。这在实信号处理里是正常现象但会干扰时频图判读。解决把 cos 改成exp(1j*2*pi*fj*t)或者画图前对信号做hilbert变换取解析信号再用解析信号做 spectrogram。最省事的办法是绘制时用ylim([0 fs/2])只看正半轴。5.2 线性扫频画出来是阶梯状不是平滑斜线现象LfmGen 设置的扫频范围是 1~8 MHz时频图上的斜线却一段一段的像台阶。原因两种可能。第一相位公式写成了2*pi*(f0K*t).*t瞬时频率值不对第二STFT 窗长太长窗内扫过的频率范围超过一个频率分辨率峰值位置被拉偏。解决先检查相位公式。然后在 spectrogram 中缩短窗长比如从 256 改成 128重叠率保持 0.85 左右。可以用一个经验关系判断窗长内瞬时频率变化 ( K * T_{window} ) 要小于频率分辨率 ( fs / N_{window} )即 ( K \cdot (N_{window}/fs) fs/N_{window} )。5.3 梳状干扰齿数对不上几根齿融成宽线现象设置了 8 根梳齿、间隔 0.5 MHz时频图上只能数出 3~4 根其余都融在一起。原因df0.5 MHz 大于理论频率分辨率 fs/window_len78 kHz按理说能分开。但如果窗长太短、或者 nfft 补零不够频谱峰值之间的谷不够深视觉上就融了。另一种情况是最后一根齿超过 fs/2被混叠回带内和前面的齿重叠。解决先确认最后一根齿频率小于奈奎斯特频率。再看实际频率分辨率把窗长加大到 512 或 1024同时增大 noverlap。补零能改善显示但真正的分辨率由窗长决定窗不够长就补不出分离的齿。5.4 拼接多个干扰序列时报矩阵维度不一致现象顶层脚本执行[x1 x2]时Matlab 报错Dimensions of arrays being concatenated are not consistent。原因各生成器内部都用round(T*fs)计算长度按理说长度一致。但有些脚本可能用了floor(T*fs)或者顶层 t 向量用0:1/fs:T导致长度差 1。差一个点在拼接时就会报错。解决在所有生成器入口统一加一行断言或者在顶层加检查。assert(length(x1) length(x2), 干扰序列长度不一致);这个习惯能省很多事。我一般还会用numel而不是length避免序列是行向量或列向量混用带来的隐患。5.5 时频图整体一片红或一片蓝弱干扰看不见现象宽带噪声和单音叠加后时频图色标被噪声功率主导单音所在位置颜色和周围几乎一样。原因色标动态范围没有固定。spectrogram 输出的功率范围可能从 -80 dB 到 20 dB默认 colorbar 会把 100 dB 范围均匀映射单音的峰值淹没在大动态里视觉对比度不足。解决把动态范围固定在一个较窄的窗口例如clim([-60 0])。如果干扰功率本身差异太大先对每个信号做单位功率归一化再画图并保留归一化系数方便后续算绝对功率。6. 进阶组合干扰与双窗检查的实战习惯6.1 干噪比 JNR 的定义与叠加实现单个干扰看懂之后实际仿真里更需要的是有用信号 多种干扰 噪声的混合场景。干噪比 JNR 定义为 ( JNR 10 \log_{10}(P_j / P_s) )其中 Pj 是干扰功率Ps 是有用信号功率。叠加时先把干扰功率归一到 1再按目标 JNR 缩放。signal ...; % 有用信号 jam x2 x3; % 多音 线性扫频先任意幅度相加 jam jam / sqrt(mean(abs(jam).^2)); % 归一化干扰总功率 Ps mean(abs(signal).^2); jam jam * sqrt(Ps * 10^(JNR_dB/10)); % 按 JNR 缩放 rx signal jam noise; % 最终接收信号组合干扰时要特别注意多种干扰先混合再归一化而不是每个干扰各自按 JNR 缩放。否则总干扰功率会比设定的 JNR 高 10*log10(N) dB准确率评估全部跑偏。我刚开始做组合干扰时就在这上面翻过车后来一律把混合和归一化放到同一步。6.2 双窗检查法短窗看瞬态、长窗看谱线最后一个技巧叫双窗检查法同一段信号用短窗和长窗各画一张 STFT。短窗用 128 点时间分辨率高盯住线性扫频的斜线是否连续、有没有跳变长窗用 1024 点频率分辨率高盯住单音、梳齿这些稳态成分的频率是否精确。两张图对照就不会把扫频干扰误判成多音干扰。这个习惯是我从一次实际排查里养成的。当时做一个干扰识别算法验证只用了 256 点窗扫频速率较快的结果在时频图上看起来像几根离散横线我差点把 LFM 当成多音干扰整个识别流程的方向都要重来。从那以后我每次做干扰仿真都强制走一遍双窗检查先短窗看瞬态再长窗看谱线确认形态和参数都对得上才进入后续处理。这套脚本配合双窗检查法基本能覆盖从干扰生成到时频图验证的全过程希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。