☰
AM/FM通信系统干扰分析与缓解的Matlab仿真实践
2026/10/17 9:43:22 网站建设 项目流程

要说通信系统仿真里最让人头疼的,不是调制解调本身,而是干扰一来整个链路就崩掉。最近帮人调试一个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是最大频偏,比如5kHz;fm_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.8,FM频偏视带宽定
带通滤波带宽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抗干扰仿真,不妨从文中的参数表起步,先把无干扰链路跑通,再按部就班加入干扰、做缓解。做完一轮,你对通信系统里的“干扰”这件事,会有一个比课本上直观得多的理解。

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

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

立即咨询