要说通信系统仿真里最让人头疼的不是调制解调本身而是干扰一来整个链路就崩掉。最近帮人调试一个AM和FM通信系统中的干扰分析与缓解项目仿真代码本身不复杂但真正把干扰建模、量化、滤波、解调优化串起来还是有不少细节值得记一笔。这篇文章就把整个思路和实操过程展开讲讲包括Matlab里怎么生成干扰、怎么评价干扰影响、怎么针对性缓解以及调试中踩过的坑。适合正在做通信课程设计、毕业设计或者刚入门软件无线电仿真的朋友参考。1. 先把干扰这事拆明白AM/FM的调制原理与干扰来源1.1 AM和FM的天然差异抗干扰能力的来源先说一个最基本的问题为什么AM和FM系统对干扰的反应完全不同答案藏在调制方式里。AM是把信息调制在载波的幅度上表达式写出来就是s_AM(t) [A0 m(t)]·cos(2π·fc·t)其中A0是直流偏置m(t)是调制信号fc是载波频率。因为信息在幅度上任何叠加在信号上的噪声都会直接改变包络的形状。你可以把AM想象成用笔在纸上画波形噪声就像一滴墨水滴在哪就脏在哪根本躲不掉。FM则把信息调制在瞬时频率上s_FM(t) A·cos(2π·fc·t 2π·kf·∫m(τ)dτ)幅度A是恒定的信息藏在频率变化里。所以加性噪声就算让接收信号的幅度上下起伏只要能在解调前把幅度波动削平信息依然完好。这就是为什么FM广播听起来比AM干净得多——收音机里的限幅器把幅度干扰削掉鉴频器只关心频率变化。理解这个差异是后续所有干扰分析的基础。简单说AM怕幅度型干扰FM更怕频率型干扰。这里的“频率型干扰”指的是同频干扰或邻近频道干扰导致的频偏混叠而不是单纯的白噪声。白噪声对FM的影响主要是相位扰动可以通过提高信噪比或优化鉴频方式来缓解但一个强的单频干扰落在FM信号带宽内可能直接让鉴频输出出现拍频这种情况即使限幅也无济于事。1.2 干扰到底从哪里来加性、乘性与系统内生问题做仿真时很多人习惯把所有干扰混在一起扔进信号里结果出问题都不知道该往哪查。我的建议是先按三类把干扰分好再逐个测试。第一类是加性干扰也是最常见的。高斯白噪声是无线电接收机里最基础的噪声模型热噪声、器件噪声都可以用它近似。脉冲噪声则模拟雷电、开关设备引起的瞬时尖峰特点是时域上稀疏分布的大幅值跳变。单频正弦干扰则是其他电台、电力线谐波这类窄带干扰在频谱上表现为一根脉冲谱线能量集中。第二类是乘性干扰典型代表是多径衰落。信号经过多条路径到达接收机彼此叠加后幅度和相位都随频率变化相当于信号在频域被乘上了一个不理想的响应函数。严格说多径信道是卷积模型但在窄带条件下可以简化成频域上的乘性失真。第三类是系统内生的干扰这些最容易忽略但真实项目里几乎一定会遇到。比如接收端本地载波与发送端频偏导致解调后的频谱整体移位再比如滤波器群延迟不均匀让信号波形发生畸变。这类干扰不是外部加进来的而是系统自己产生的。在Matlab里生成这三类干扰其实都很简单。高斯白噪声直接用randn脉冲噪声可以用稀疏矩阵或逻辑索引单频干扰就是一个正弦波fs 200e3; % 采样率 t (0:fs*0.1-1)/fs; % 100ms时间向量 fc 25e3; % AM载频 % 高斯白噪声功率可控 n_gauss 0.1 * randn(size(t)); % 脉冲噪声随机位置出现尖峰 n_impulse zeros(size(t)); impulse_pos randi(length(t), 1, 20); n_impulse(impulse_pos) 2 * randn(1, 20); % 单频正弦干扰频率设为20kHz f_interf 20e3; n_sine 0.3 * sin(2*pi*f_interf*t);做仿真时我习惯把三种干扰分开关先单独看一种干扰对解调结果的影响再组合叠加这样排查问题才有依据。2. 干扰的量化分析用Matlab把“干扰有多大”算明白2.1 四个核心指标SNR、SINAD、BER和频谱纯净度光说“干扰很大”没有意义得用指标量化。我在这个项目里主要看四个指标。信噪比SNR是最基础的信号功率与噪声功率的比值单位dB。计算公式是SNR_dB 10·log10(Ps / Pn)这里有个容易出错的点如果用awgn函数加噪声它的第三个参数默认是信噪比但计算基准是输入信号的整体功率。很多人不知道awgn默认会先测量信号功率再加噪声所以你传进去的信号如果幅度特别大加同样SNR的噪声实际噪声功率也会相应变大。信纳比SINAD比SNR更贴近模拟通信的真实场景它把信号、噪声、失真一起纳入考量定义是SINAD 10·log10((Ps Pn Pd) / (Pn Pd))其中Pd是失真功率。对于解调后的语音信号SINAD更能反映人耳实际听到的清晰度。而BER误码率只用于数字通信链路AM/FM虽然是模拟调制但项目里如果后续接了数字基带处理就会用到。频谱纯净度是个观察性指标定量上可以用带外辐射功率比或者频谱中杂散分量与主信号分量的功率差。它用来判断滤波器是否选对了、调制器有没有产生预期之外的谐波。Matlab里计算SNR可以这样写Ps rms(s_tx)^2; % 信号功率 Pn rms(noise)^2; % 噪声功率 SNR_dB 10*log10(Ps/Pn); % 或者直接用内置函数 SNR_dB snr(s_tx noise, noise);这里有个细节snr函数要求第二个参数是噪声信号本身而不是带噪信号。传错参数算出来的结果会完全不可信。2.2 时频域观察方法spectrogram一眼看出干扰形态频域分析用periodogram或pwelch看功率谱密度这大家都熟。但我建议务必加上时频图spectrogram尤其是分析FM信号和脉冲干扰时时频图的表现力比普通频谱强一个量级。AM信号在时频图上表现为载波频率处一条水平能量线调制边带分布在载波两侧。FM信号则不同单音调制时频率会随时间呈现正弦形摆动。干扰加入后白色噪声会让整个时频面噪底抬升单频干扰会形成一条恒定频率的亮线脉冲干扰则表现为短促的纵向亮纹多径导致的频率选择性衰落在图上能看到特定频段出现凹陷。spectrogram(r_t, hann(256), 128, 512, fs, yaxis);观察时频图时注意调整窗函数和重叠比例。窗长256个采样点在200kHz采样率下约1.28ms的频率分辨率足以分辨绝大多数仿真中的调制特征。窗太短则频率分辨率差窗太长则时间分辨率差需要根据信号特征权衡。3. 干扰缓解的完整方案与Matlab实现3.1 前端滤波先让有用信号“干净”地进入解调器很多人在解调前不加任何滤波器直接用带噪信号解调这等于让解调器在一个很差的信噪比环境下工作。前端带通滤波的目的很简单滤掉带外噪声和干扰提高进入解调器的信噪比。AM系统的带通滤波器中心频率等于载频带宽取调制信号最高频率的两倍。比如载频25kHz语音带宽5kHz那么带宽就是10kHz滤波器通带范围20~30kHz。FM系统不能用这么窄的带宽因为FM信号带宽由卡森公式决定B 2·(Δf fm_max)Δf是最大频偏比如5kHzfm_max是调制信号最高频率比如1kHz。那么理论带宽约12kHz实际工程中我习惯留20%~30%的余量取15kHz比较稳妥。用designfilt设计带通滤波器fs 200e3; fc 25e3; bw_am 10e3; bpFilt_am designfilt(bandpassfir, ... FilterOrder, 128, ... CutoffFrequency1, fc - bw_am/2, ... CutoffFrequency2, fc bw_am/2, ... SampleRate, fs); r_filt filter(bpFilt_am, r_t);滤波器阶数这里我要多啰嗦两句。FIR滤波器阶数越高过渡带越窄频响越接近理想但群延迟也越大。128阶在200kHz采样率下延迟约0.32ms对仿真影响不大。如果做实时系统必须考虑延迟补偿否则解调波形与原始调制信号对比时会有可见的时移。3.2 解调端抗干扰优化包络检波、相干解调和锁相环的取舍AM解调最简单的方案是包络检波Matlab里就是取绝对值再加低通滤波env abs(r_filt); lpFilt designfilt(lowpassfir, ... FilterOrder, 64, CutoffFrequency, 5e3, SampleRate, fs); m_est filter(lpFilt, env);包络检波的优点是结构简单、不依赖载波同步但缺点是抗窄带干扰能力弱。如果干扰频率落在AM信号带宽内包络会被干扰直接污染。这时用相干解调效果更好原理是接收端乘上一个同频同相的本地载波把频谱搬到基带和2倍载频处再用低通滤掉高频分量r_mix r_filt .* cos(2*pi*fc*t); m_est 2 * filter(lpFilt, r_mix); % 乘以2补偿幅度损耗相干解调要求本地载波与发送载波同步如果频偏没消除解调出来的信号会有明显的低频“嗡嗡”声。在仿真中我习惯假设理想同步但工程上必须加锁相环。FM解调的核心是鉴频。最朴素的实现是用相位差分近似瞬时频率hilb hilbert(r_filt); % 解析信号 inst_phase unwrap(angle(hilb)); % 瞬时相位 inst_freq diff(inst_phase) * fs / (2*pi); % 瞬时频率 m_est inst_freq;这里有个关键的前置步骤限幅。正因为FM信息在频率上所以幅度干扰和噪声可以通过限幅器削掉。做法很简单把每个采样点的幅度归一化到单位圆上r_hard exp(1j * angle(hilb)); % 等效于限幅器限幅对于脉冲噪声的抑制效果极好因为脉冲噪声往往表现为幅度突变限幅后其影响大幅减弱。建议先限幅再进鉴频器效果立竿见影。还有一种方案是锁相环解调用comm.PLL或者自己写环路滤波器。锁相环的带宽设计直接影响抗噪性能环路带宽窄抗噪好但动态响应慢环路带宽宽响应快但噪声大。仿真中这个平衡需要根据调制信号的最高频率来调。3.3 自动增益控制AGC为什么必不可少我见过很多同学在仿真里忽略AGC结果遇到幅度随距离变化或者强脉冲干扰时解调输出忽大忽小他们第一反应是“滤波器设计错了”其实只是缺少增益控制。AGC的作用是让进入解调器的信号保持在一个合适的幅度范围。仿真中最简单的实现是基于滑动窗口的RMS归一化windowLen round(fs * 0.01); % 10ms窗口约2000个采样点 rms_win sqrt(movmean(r_t.^2, windowLen)); r_agc r_t ./ (rms_win eps);加eps是为了防止窗口内信号功率为0时出现除零错误。滑动窗口的长度需要权衡太短会把调制信号本身的幅度变化也归一化掉导致解调不出信息太长则对突发干扰的响应太慢。经验值是取几个调制信号周期比如调制信号1kHz周期1ms那么10ms窗口就包含了10个周期既能跟上平均功率变化又不会把调制细节抹掉。AGC对AM系统尤其重要因为AM的包络就是信息如果AGC响应太快包络变化被压缩解调出来的音频会失真。我通常把AGC的时间常数设为调制信号周期的5~10倍。3.4 窄带强干扰的陷波处理窄带干扰单频正弦在频谱上就是一根尖峰。用带通滤波往往解决不了因为如果干扰正好落在信号带宽内滤波会连同信号一起滤掉。这时候用陷波器最合适只把某个频点附近很窄的频段衰减掉。f_interf 20e3; % 干扰频率 wo f_interf / (fs/2); % 归一化频率 bw 100 / (fs/2); % 陷波带宽100Hz [num, den] iirnotch(wo, bw); r_notch filter(num, den, r_filt);iirnotch是Matlab内置的陷波器设计函数带宽参数决定陷波的Q值。带宽越窄陷波对信号的损伤越小但干扰抑制能力也越弱而且IIR陷波器的相位响应在陷波点附近会剧烈变化。如果干扰源离信号很近陷波器引入的相位失真可能比干扰本身更麻烦。一个重要经验陷波器要放在解调之前但要在AGC之后。因为AGC先让信号幅度标准化陷波器再处理窄带干扰顺序不能颠倒。如果窄带干扰频率未知可以用频谱峰值搜索自动定位再用自适应的陷波器去跟踪这就涉及自适应滤波了。对这个项目来说固定频率的干扰用iirnotch就够用。4. 仿真调试经验与问题速查表4.1 我在这个项目里踩过的5个坑先说第一个坑SNR设置错误。awgn函数的SNR参数基准是当前信号的功率而不是1伏或其他的固定值。如果你前面做了幅度归一化信号功率是1后面忘了归一化信号功率变成100同样的SNR参数加出来的噪声功率完全不一样。解决方法是自己写加噪声的代码而不是依赖awgn的黑盒逻辑。第二个坑是滤波器阶数太高导致的延迟问题。我一开始用512阶的带通滤波器频谱确实很干净但解调出来的波形和原始调制信号对比总是差一截怎么都查不出原因。后来发现是滤波器群延迟导致的换成128阶之后问题消失。做仿真对比波形时要么选合适阶数要么用grpdelay把延迟算出来对齐信号。第三个坑是包络检波后忘了隔直流。AM信号包络的均值是A0不是0直接做频谱分析会看到一个巨大的直流分量严重影响后续处理。正确做法是包络检波后先减去均值或者用交流耦合m_est_ac m_est - mean(m_est);第四个坑是FM解调时unwrap用错。unwrap是为了消除相位跳变的但如果输入信号噪声太大相邻采样点的相位差可能超过πunwrap会把真实频率变化也一起修正掉导致瞬时频率出现错误跳变。解决方法是先限幅再用宽带滤波器提升信噪比让相位差分在噪声下依然可靠。第五个坑是没有分阶段加干扰。一上来就全部干扰叠加系统崩了根本不知道是谁干的。我后来养成一个习惯先在无干扰条件下确认链路工作正常再逐个加入白噪声、窄带干扰、脉冲干扰每加一种就重新评估指标和时频图。这个习惯能省下大量调试时间。4.2 信号参数的推荐配置表对不同调制方式和干扰场景我整理了一份参数配置参考适合做课程设计或毕业设计时的初始值参数AM系统参考值FM系统参考值备注采样率 fs200 kHz200 kHz至少10倍载波频率载波频率 fc25 kHz50 kHz方便观察边带或频谱调制信号频率1 kHz1 kHz常见单音测试调制深度/频偏0.55 kHzAM不宜超过0.8FM频偏视带宽定带通滤波带宽10 kHz15 kHzFM按卡森公式加余量噪声信噪比10~20 dB5~15 dBFM可承受更低SNR窄带干扰功率0.1~0.50.1~0.5相对信号幅度陷波器带宽50~200 Hz100~500 HzFM陷波带宽需更宽避免信号损伤关于FM系统的陷波带宽我特别提醒一下。因为FM信号频谱扩展范围大陷波器太窄时干扰虽然被滤掉了但干扰附近频率上FM信号的边带也被损伤解调后会出现不自然的“嘶啦”声。所以FM场景下陷波器带宽会比AM场景放宽一些牺牲一点干扰抑制能力换取对信号较小的损伤。实际调试时我推荐按这个流程走先生成调制信号完成调制然后过信道加干扰再做前端滤波和AGC接着解调最后对比解调输出与原始调制信号。每个阶段都计算SNR或SINAD记录数值变化这样每级处理提升多少指标一目了然写项目报告时也有数据支撑。这套流程跑通之后你会发现AM/FM抗干扰的核心其实不只是某一个滤波器或者某一种解调器而是“前端滤波、幅度管理、解调方式、针对性陷波”这几个环节协同配合的结果。单独优化任何一环都很难达到整体效果。我个人在实际调试中还留了一个习惯每次改完参数先把频谱图、时频图和解调波形图三张图同时画出来对比着看。频谱图告诉你能量的分布时频图告诉你干扰和信号在时间频率上的重叠关系解调波形图则直接告诉你最终结果是否可用。三个视角一起看分析问题基本不会跑偏。如果你手头正好也在做类似的AM/FM抗干扰仿真不妨从文中的参数表起步先把无干扰链路跑通再按部就班加入干扰、做缓解。做完一轮你对通信系统里的“干扰”这件事会有一个比课本上直观得多的理解。
阅读完成 · 觉得有帮助?