☰
通信干扰仿真代码实战:五类干扰生成与时频分析
2026/10/26 22:28:53 网站建设 项目流程

简介:这份资源围绕通信干扰的识别与时频分析展开,面向通信工程、信号处理方向的学习者与工程师,帮助理解单音、多音、射频噪声、线性扫频及梳状干扰的成因与特征。压缩包内共5个文件,均为m脚本文件,整体约4KB,涵盖单音干扰、多音干扰、线性扫频干扰、部分频带干扰及梳状干扰等生成代码,便于在MATLAB环境中直接运行并观察各类干扰的时频表现。资源已有510人学习下载,适合作为通信抗干扰课程实验、毕业设计或科研仿真的参考素材。通过运行这些脚本,读者可快速复现不同干扰的时频图,直观对比能量分布差异,进而加深对短时傅立叶变换、小波变换等时频分析方法的理解,为滤波器设计、自适应均衡与干扰对消等抗干扰策略的验证提供可复用的代码基础。

1. 从五张时频图说起:这套通信干扰代码到底能跑出什么

做通信抗干扰的兄弟多半有过这种经历:论文里把单音、多音、噪声、扫频、梳状干扰讲得头头是道,真到自己搭仿真环境,却连一张像样的时频图都画不出来。频谱图只能看个大概,干扰随时间怎么变、频率怎么跳,全是一笔糊涂账。这套通信干扰code.rar就是冲着这个痛点来的——它把五类常见干扰的生成脚本和时频分析流程打包在一起,解压后是MultyGen.m、CombGen.m、SinglGen.m、LfmGen.m、bufenpindai.m这几个 MATLAB 文件,分别对应多音、梳状、单音、线性扫频和部分频带干扰的仿真生成。你不需要从零推导公式,改几个参数就能得到带干扰的基带信号,再套上 STFT 或小波变换,时频图直接出。适合正在做干扰识别、抗干扰算法验证、或者要给论文补仿真图的人。下面我按实际拆包顺序,把每个脚本干什么、参数怎么调、时频图怎么读,一层层说清楚。

2. 五个生成脚本拆开看:参数、波形与调用关系

2.1 单音与多音干扰:从SinglGen.m到MultyGen.m

单音干扰是最干净的干扰模型,一个正弦波砸进接收带内,时频图上就是一个不随时间移动的亮点。SinglGen.m干的就是这件事:给定采样率、干扰频率、干信比,输出一段复基带干扰信号。我一般会先打开这个脚本,因为它结构最简单,适合确认整个仿真链路通不通。

% SinglGen.m 核心参数区(常见写法) fs = 10e6; % 采样率,按你的基带带宽来定 fc = 1e6; % 干扰中心频率,落在信号带内才有意义 JSR = 10; % 干信比 dB,控制干扰强度 N = 4096; % 采样点数,影响时频图的时间分辨率 t = (0:N-1)/fs; jam = sqrt(10^(JSR/10)) * exp(1j*2*pi*fc*t);

逻辑说明:fs决定时频图纵轴能看到的频率范围,fc必须小于fs/2,否则会混叠到负频率去,时频图上出现镜像亮点,新手常在这里翻车。JSR是干信比,不是绝对功率,后面和信号相加时要注意功率归一化。N越大,STFT 的时间窗越多,时频图越细,但计算量也上去。

多音干扰就是把多个单音叠加,MultyGen.m里通常用一个循环或者矩阵乘法搞定。关键参数是音调个数和频率间隔。频率间隔如果小于 STFT 的频率分辨率,时频图上几个点会糊成一片,看起来像宽带噪声,这时候你要么加大窗长,要么调整音调间隔。

% MultyGen.m 多音生成片段 freqs = [0.5e6, 1.2e6, 2.0e6, 3.1e6]; % 各音调频率 jam = zeros(1, N); for k = 1:length(freqs) jam = jam + exp(1j*2*pi*freqs(k)*t); end jam = jam / max(abs(jam)) * sqrt(10^(JSR/10));

这里freqs的选取有讲究:如果等间隔,时频图上会出现类似梳状的结构,但和真正的梳状干扰不同——多音是有限个离散点,梳状是等间隔的谱线群。很多论文把这两个搞混,审稿人一眼就能看出来。我一般会在MultyGen.m里把频率间隔设成 STFT 频率分辨率的整数倍,这样每个音调在时频图上都能独立分辨。

2.2 线性扫频与部分频带:LfmGen.m和bufenpindai.m

线性扫频干扰在时频图上的标志是一条斜线,斜率由扫频带宽和扫频周期决定。LfmGen.m生成的就是这个。核心参数是起始频率、终止频率和扫频时间。

% LfmGen.m 线性扫频 f_start = 0.2e6; f_end = 4.8e6; T_sweep = 1e-3; % 扫频周期 1ms k = (f_end - f_start) / T_sweep; % 调频斜率 jam = exp(1j*2*pi*(f_start*t + 0.5*k*t.^2));

注意t的长度要覆盖至少一个完整扫频周期,否则时频图上只能看到半截斜线,分析扫频周期时会出错。另外,如果f_end超过fs/2,同样会混叠,斜线会在边界处折返,看起来像 V 形,这是典型的参数设置错误。

bufenpindai.m是部分频带干扰,通常用带通噪声实现:先生成高斯白噪声,再通过一个带通滤波器,只保留某一段频率。时频图上表现为一条水平方向的噪声带,带宽和中心频率由滤波器决定。这个脚本里一般会用到fir1或butter设计滤波器,阶数太高会导致时频图上的瞬态响应拖尾,看起来像干扰在时间上扩散,实际是你的滤波器振铃。

2.3 梳状干扰:CombGen.m的等间隔谱线怎么调

梳状干扰的时频图是一组等间距的垂直线,每条线对应一个频率分量,间隔固定。CombGen.m通常用多个单音按等间隔频率叠加,或者用 comb 函数生成。关键参数是梳齿间隔和梳齿数量。

% CombGen.m 梳状干扰 comb_spacing = 0.4e6; % 齿间隔 num_teeth = 8; % 齿数 f0 = 0.6e6; % 起始频率 freqs = f0 + (0:num_teeth-1)*comb_spacing; jam = zeros(1, N); for k = 1:num_teeth jam = jam + exp(1j*2*pi*freqs(k)*t); end

这里comb_spacing如果小于 STFT 的频率分辨率,垂直线会糊在一起,看起来像一块矩形噪声带。我一般会把comb_spacing设成频率分辨率的 2 到 3 倍,保证每条齿都能在时频图上分开。另外,梳状干扰的齿数不要超过fs/2 / comb_spacing,否则高频齿会混叠到低频,时频图上出现不该有的线。

2.4 时频分析怎么接:STFT 参数与图怎么读

生成完干扰信号,下一步是时频分析。MATLAB 里最直接的是spectrogram或者自己写 STFT。我一般用spectrogram,因为参数直观,返回的矩阵直接能画图。

% 时频分析示例 window = 256; % 窗长,决定频率分辨率 noverlap = 200; % 重叠点数,影响时间平滑度 nfft = 512; % FFT 点数,补零到 512 [s, f, t_stft] = spectrogram(jam, window, noverlap, nfft, fs, 'centered'); imagesc(t_stft, f, 20*log10(abs(s))); axis xy; xlabel('时间 (s)'); ylabel('频率 (Hz)'); colorbar;

参数说明:window越大,频率分辨率越高,但时间分辨率越差,扫频干扰的斜线会变粗;noverlap越大,时频图越平滑,但计算量增加;nfft影响频率轴的插值密度,不改变实际分辨率。读图时注意:单音是一个点,多音是多个点,噪声是弥散云,扫频是斜线,梳状是等间距竖线。如果图里出现对称的镜像,检查fs和信号频率范围;如果斜线在边界折返,检查扫频范围是否超过奈奎斯特频率。

3. 避坑与排查:五个脚本跑不通时先看这里

3.1 时频图出现镜像频率

现象:单音干扰的时频图上,除了设定的fc处有一个亮点,在fs - fc处还有一个对称亮点。原因:生成干扰时用了实信号,或者exp的符号搞反了,导致负频率分量没有正确抵消。解决:确认用的是复指数exp(1j*2*pi*fc*t),而不是cos(2*pi*fc*t);如果必须用实信号,在时频分析前做希尔伯特变换取解析信号。

3.2 扫频斜线在边界折返

现象:线性扫频的时频图不是一条完整斜线,而是在高频或低频边界处折返,形成 V 形或 W 形。原因:f_end或f_start超过了fs/2,或者扫频时间T_sweep与采样点数不匹配,导致一个周期没走完就截断了。解决:把扫频范围限制在[-fs/2, fs/2]内,并确保N/fs >= T_sweep,让至少一个完整扫频周期落在采样窗口里。

3.3 多音干扰糊成一片

现象:MultyGen.m生成的多音干扰,时频图上不是离散点,而是一条连续的带。原因:音调间隔小于 STFT 的频率分辨率fs/window,或者window设得太小。解决:先算频率分辨率df = fs/window,把freqs的间隔设成至少2*df;如果音调数量多、间隔小,换更长的窗,但注意时间分辨率会下降。

3.4 梳状干扰齿数不对

现象:CombGen.m跑出来的时频图,齿的数量比设定的num_teeth少,或者齿间隔不均匀。原因:高频齿超过了fs/2被混叠,或者f0设得太低,第一个齿落在负频率。解决:检查f0 + (num_teeth-1)*comb_spacing < fs/2,并且f0 > 0;如果需要在全带内均匀分布,把f0设成comb_spacing/2,让齿关于零频对称。

3.5 部分频带干扰的噪声带边缘振铃

现象:bufenpindai.m生成的干扰,时频图上噪声带的边缘不干净,有波纹或拖尾。原因:带通滤波器的阶数太高,群延迟大,时域响应有振铃;或者滤波器设计时过渡带太窄。解决:降低滤波器阶数,或者改用fir1加凯泽窗,过渡带留宽一点;如果只是做时频图展示,可以直接在频域乘一个矩形窗,再反变换回时域,避免滤波器振铃。

4. 进阶用法:把五类干扰拼成一个测试集

单独跑通每个脚本只是第一步,真正有用的是把它们组合成一个带标签的干扰数据集,用来训练分类器或者验证识别算法。我一般会写一个主控脚本,循环调用五个生成函数,每次随机抽干扰类型和参数,生成信号后立刻算 STFT,把时频图矩阵和标签一起存下来。

% 生成混合干扰数据集示例 types = {'single','multi','noise','lfm','comb'}; num_samples = 500; for i = 1:num_samples type = types{randi(5)}; switch type case 'single' jam = SinglGen(fs, N, JSR); case 'multi' jam = MultyGen(fs, N, JSR); case 'noise' jam = bufenpindai(fs, N, JSR); case 'lfm' jam = LfmGen(fs, N, JSR); case 'comb' jam = CombGen(fs, N, JSR); end S = spectrogram(jam, 256, 200, 512, fs, 'centered'); TF = 20*log10(abs(S)); save(sprintf('data/%s_%04d.mat', type, i), 'TF', 'type'); end

这段代码的关键在于:每次生成干扰时,JSR和频率参数都要在合理范围内随机化,否则分类器学到的只是固定参数下的模式,换一组参数就失效。我一般会把JSR在 0 到 20 dB 之间随机,单音频率在带内随机,扫频范围随机但不超过奈奎斯特。存的时候按类型分文件夹,方便后面用imageDatastore或者自定义datastore读取。

验证方法很简单:从生成的数据集里每个类型抽 10 个样本,画成 5×10 的时频图网格,肉眼过一遍,确认没有镜像、折返、糊带这些异常。如果某一类的图明显不对,回去检查对应的生成脚本参数。这个习惯帮我省了很多返工时间——有次CombGen.m的齿间隔设成了fs/4,时频图上只有两根线,差点把整个数据集带偏。

从那以后我每次生成完干扰数据,都强制走一遍可视化抽检,确认五类干扰的时频图特征都清晰可辨,再往下做识别。希望帮到你。

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

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

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

立即咨询