AM非相干解调仿真:包络检波与关键参数设置
2026/9/13 1:33:23 网站建设 项目流程

简介:面向通信工程初学者的幅度调制(AM)与非相干解调仿真源码现已发布,资源包包含两个M文件,压缩后大小仅2KB,便于快速下载与本地运行。仿真覆盖基带信号生成、高频载波产生与乘法器调制的完整AM调制流程,将低频信息转换为适合传输的高频信号,同时演示不依赖精确载波同步的非相干解调方法,可应用于课堂教学、实验演示或自学练兵。解调部分重点展示包络检波的实现思路,通过波形图与频谱图直观呈现调制前后的信号变化,帮助理解双边带抑制载波(DSB-SC)等常见AM形式的处理逻辑,领会非相干解调如何从已调信号中恢复原始信息。两个脚本分别承担调制模拟与解调模拟功能,读者可对照运行、调整载波频率与基带信号参数,深入掌握模拟通信系统的基础设计环节。目前已有1320人学习下载,是通信工程、电子信息类专业学生以及需要快速搭建通信仿真实验的初学者值得参考的源码资源。

1. AM 调制解调仿真中,非相干解调的“发散”往往不是算法问题

把 AM 调制解调和非相干解调放在同一个仿真环境里,很多人的第一反应是包络检波:取绝对值、低通、去直流,三步完事。但真正在 Simulink 或 MATLAB 脚本里跑起来,经常会看到起始阶段波形跳变、低通输出出现过冲,甚至直接报“仿真发散”。这个现象很容易让人怀疑非相干解调是不是不适合做 AM 调制仿真,实际上多数情况是载波频率、采样率和滤波器截止频率没有形成合理的分离度。这篇内容沿着 AM 调制解调、非相干解调和 AM 调制仿真这条线,把信号模型、包络检波在仿真里的落地方式、关键参数设置和验证方法一次讲透,适合正在做通信系统仿真、课程设计或刚接触调制解调仿真的人参考。

2. AM 信号模型与非相干解调原理:包络检波的适用边界

2.1 AM 信号表达式与调制指数怎么影响包络

AM 调制在时域上的标准形式是:

s(t)=[A0+m(t)]cos(2πfct)

其中 A0 是直流偏置,m(t) 是基带调制信号。为了描述调制的深度,通常会归一化基带信号,写成:

s(t)=A0[1+ma·mn(t)]cos(2πfct)

这里的 mn(t) 是峰值不超过 1 的基带信号,ma 是调制指数,正常范围在 0 到 1 之间。ma 越小,包络起伏越不明显,解调输出幅度也越小;ma 超过 1 就是过调制,包络过零后相位翻转,包络检波会把翻转部分当作正向幅度来恢复,输出波形会出现严重的“塌陷”失真。所以仿真开始前,最好先用一个简单脚本确认调制指数在 0.3~0.8 之间。

% 检查 AM 调制指数是否在安全范围 fs = 2e6; % 采样率 2 MHz fc = 100e3; % 载波频率 100 kHz W = 5e3; % 基带信号频率 5 kHz t = (0:8191)/fs; % 时间向量,约 4 ms mn = sin(2*pi*W*t); % 归一化基带信号,峰值 1 ma = 0.5; % 调制指数 A0 = 1; % 直流偏置 s = A0 * (1 + ma * mn) .* cos(2*pi*fc*t); % 画包络线: A0*(1+ma*mn) 应该恒大于 0 plot(t, abs(s), t, A0*(1+ma*mn), 'r--');

这段代码里,abs(s)只是用来观察高频波形轮廓,不是真正的包络检波。A0*(1+ma*mn)就是理论包络,当ma等于 0.5 时,包络范围是 0.5 到 1.5,恒大于 0。如果把这个范围压到 0 附近,噪声稍微一点波动就可能造成包络“触底”,非相干解调在低信噪比下的门限效应会提前出现。

2.2 非相干解调和相干解调的差异

相干解调需要本地载波与发射载波同频同相,仿真里可以假设理想同步,但工程上同步误差会直接带来幅度衰减和失真。非相干解调不依赖载波相位,用包络检波就能恢复基带,代价是抗噪声性能比相干解调差。这个差在低信噪比区域尤其明显,包络检波存在门限效应:当信噪比掉到某个阈值以下,输出信噪比会急剧恶化,而相干解调只是近似线性变差。

对比项相干解调非相干解调(包络检波)
是否需要载波同步需要不需要
低信噪比性能线性恶化存在门限效应
实现复杂度
典型应用数字 AM 接收、高灵敏度接收模拟 AM 广播、低成本接收

包络检波在仿真里的处理流程很短:信号取绝对值,相当于全波整流;然后低通滤波,把载波二次谐波和带外噪声压掉;最后减去直流偏置A0,得到基带信号。下面这段代码就是最小实现。

% 包络检波最小实现 env = abs(s); % 全波整流,得到包含包络和载波谐波的信号 [b, a] = butter(4, 1.5*W/(fs/2)); % 低通截止频率取 1.5 倍基带频率 demod = filter(b, a, env) - A0; % 低通后去掉直流偏置 plot(t, demod, t, mn, 'r--');

这里butter的截止频率参数是归一化频率,1.5*W/(fs/2)对应 7500 Hz,远低于载波 100 kHz,同时高于基带 5 kHz,能让基带通过、把二倍载频分量压住。filter是零相移 IIR 滤波器的普通实现,会带来固定群延迟,如果后面要和原始基带严格对齐,需要做延迟补偿。

2.3 仿真的采样率和滤波器边界

离散仿真里最容易被忽略的是频率分离度。采样率fs至少要大于 2 倍的载波频率,否则频谱混叠。实际仿真中为了让低通滤波器有过渡带,fs通常取载波频率的 10 倍以上。另一个约束是载波fc和基带带宽W之间也要拉开。如果fc只比W大 5 倍,包络检波后的二倍载频分量会离基带频谱很近,再好的低通滤波器也会留下明显纹波。

参数建议范围说明
fs≥ 10 fc避免频谱混叠,给低通滤波器留过渡带
fc≥ 20 W保证包络频谱和二次谐波分得开
ma0.3~0.8兼顾包络清晰度和抗噪声能力

做 AM 调制仿真时,我一般至少选fc = 100 kHz, fs = 2 MHz, W = 5 kHz这组数,整套链路跑起来快,滤波器设计也舒服。如果换成fc = 10 kHz, fs = 100 kHz, W = 5 kHz,包络检波后的二倍载频 20 kHz 和基带带宽 5 kHz 只差 4 倍,低通稍微做陡一点就会影响基带边缘,性能评估就会失真。

3. 用 MATLAB/Simulink 搭 AM 非相干解调仿真:从最小脚本到模型

3.1 MATLAB 脚本:先跑通一条最小链路

写脚本是排查问题最快的方式。下面这段代码把调制、加噪、非相干解调全部串起来,每步都有变量名对应,方便后面检查中间节点。

fs = 2e6; % 采样率 2 MHz fc = 100e3; % 载波频率 100 kHz W = 5e3; % 基带信号频率 5 kHz t = (0:8191)/fs; % 总时长约 4 ms mn = sin(2*pi*W*t); % 峰值 1 的基带信号 ma = 0.5; A0 = 1; % 调制指数和直流偏置 s = A0 * (1 + ma*mn) .* cos(2*pi*fc*t); SNR_dB = 20; % 整个采样带宽内的信噪比 rx = awgn(s, SNR_dB, 'measured'); % 按信号实际功率加噪声 env = abs(rx); % 包络检波第一步 Wn = 1.5 * W / (fs/2); % 低通归一化截止频率 [b, a] = butter(4, Wn); demod = filter(b, a, env) - A0; % 低通去直流 % 比较解调输出和原始基带的波形 plot(t, demod, t, mn, 'r--'); xlabel('时间 (s)'); ylabel('幅度');

这段代码里最需要注意的是awgn的 SNR 定义。它默认把信号功率作为参考,噪声功率铺满整个fs/2带宽,所以这里的 20 dB 不是接收机中频带宽内的信噪比。如果想更准确,应该在基带信号带宽内算噪声功率,这会在第 4 章展开。butter的 4 阶滤波器在截止频率附近有约 1 dB 的波纹,如果 5 kHz 基带刚好顶到截止频率,边缘会有衰减,所以我取 1.5 倍而不是 1 倍。

3.2 Simulink 模型搭建:从模块到连线的关键点

脚本跑通后,再用 Simulink 搭模型会比较顺。常见做法是用正弦源生成基带信号,另一路正弦源生成载波,通过加法和乘法形成 AM 信号,再接 Abs 模块和低通滤波器。关键模块配置如下:

模块关键参数说明
Sine Wave(载波)Amplitude=1, Frequency=100000载波 fc
Sine Wave(基带)Amplitude=0.5, Frequency=5000对应 ma·mn
Constant(偏置)Value=1直流偏置 A0
AddInputs=2把偏置和基带相加
Product默认实现调幅
Abs默认全波整流
Transfer Fcn / Analog Filter Design4 阶低通,截止频率 7500 Hz提取包络
Subtract默认去掉直流偏置

连线时注意避免代数环。比如把 Abs 模块连到滤波器,滤波器再反馈回 Abs,这在包络检波里不会出现,但有些人为了“平滑”会额外引入状态反馈,反而让 Simulink 无法解算。仿真步长上,如果用固定步长求解器,步长必须小于1/(2*fc),建议设置为1/(20*fc),也就是 5e-7 秒,否则载波波形会严重失真。

3.3 仿真发散与不收敛的常见原因和处置顺序

“仿真发散”在 AM 非相干解调模型里很少是解调算法本身的问题,更多来自求解器和滤波器实现的边界。常见原因和排查顺序是这样:

  1. 步长过大导致载波采样点不足。先用固定步长1/(20*fc)跑一遍,如果波形正常再切换变步长。
  2. 低通滤波器初始状态为零,信号从 0 突然跳到A0会产生过渡带过冲。给输入信号加一个 20~50 微秒的上升沿,或直接把滤波器初始状态设为稳态值。
  3. 连续滤波器和离散源混用。Simulink 里如果信号源是离散的,滤波器用连续模块,求解器会插入额外采样点,看起来没问题,但频谱会多出混叠成分。
  4. 解调输出乘以恢复增益后数值过大,超过了浮点显示范围。先不加增益,确认包络幅度和理论值一致后再补偿。

这些坑在信号发生器仿真里特别明显:如果基带信号是方波,包络检波低通后会看到振铃,这是滤波器对跳变沿的响应,不是非相干解调失效。处理方法是先换成正弦基带把链路调稳,再换方波评估振铃影响。

4. 非相干解调仿真的关键参数:低通带宽、信噪比与波形评估

4.1 低通滤波器截止频率到底取多少:一个可复用的设计套路

包络检波后频谱里有两部分:基带信号和围绕2fc的载波二次谐波。低通滤波器的任务是把第一部分尽量无失真地保留,把第二部分压掉。理论上截止频率大于W、远小于2fc-W即可。实际设计时我会用这个范围:

1.2*W <= fcut <= 2*W

如果 fcut 低于 1.2 倍基带频率,基带高频分量会被削平,方波信号尤其明显;如果 fcut 太高,二次谐波泄漏会增加,解调波形上会有很细的“锯齿”纹。用butter设计时归一化截止频率要除以fs/2,比如W=5kHz, fs=2MHz, fcut=7.5kHz时:

fcut = 1.5 * W; % 截止频率 7.5 kHz Wn = fcut / (fs/2); % 归一化到 0~1 [b, a] = butter(4, Wn, 'low'); % 4 阶低通

滤波器阶数也要克制。阶数越高,过渡带越陡,但相位延迟越大,输出波形相对原始基带的群延迟也越大。如果发现解调波形比基带“慢”了明显一段,不是非相干解调有问题,而是滤波器延迟。可以用grpdelay查看,或者用零相位滤波filtfilt消除相位偏移,但filtfilt会把噪声也做一次反向平滑,不适用于在线解调仿真。

4.2 信噪比定义和仿真中的测量口径

AM 仿真里最容易混淆的是信噪比参考带宽。awgn(s, SNR_dB, 'measured')把噪声功率分配到整个奈奎斯特带宽fs/2,但这个带宽远大于 AM 信号的有效带宽。接收机里通常定义信号带宽内的信噪比,工程上一般取带宽2W。如果仿真的目的是和理论门限对比,建议手动控制噪声功率。

% 按信号带宽 2W 定义信噪比,而不是采样带宽 sigPow = mean(s.^2); % AM 信号平均功率 noiseBw = 2 * W; % 接收机等效噪声带宽 noisePow = sigPow / (10^(SNR_dB/10)); % 噪声功率 noiseSigma = sqrt(noisePow * noiseBw / (fs/2)); % 调整到满带宽方差 rx = s + noiseSigma * randn(size(t)); % 叠加高斯白噪声

这里最核心的是noiseSigma的换算。因为randn生成的噪声方差按整个fs/2带宽计算,而我们要限制到noiseBw,所以要用带宽比例去缩放。这样统计出来的 SNR 才是 AM 接收机真正关心的带内信噪比,后续测门限效应也更可信。

4.3 用波形、频谱和误差指标一起评估

不要只看时域波形像不像基带,至少要看三样东西:时域包络、解调输出频谱、误差指标。时域里可以检查包络是否有削底和凹陷;频谱里可以看基带频段是否平坦,二倍载频处有没有明显残留;误差指标用归一化均方误差最直观:

% 对齐滤波器延迟后计算 NMSE delay = round(grpdelay(b, a, 1)); % 滤波器群延迟采样点 demod_align = demod(delay+1:end); mn_align = mn(1:end-delay); NMSE = sum((demod_align - mn_align).^2) / sum(mn_align.^2);

我一般会记录一组不同 SNR 下的 NMSE,判断门限效应出现的位置。下面是一个典型观察结果,具体数值会随滤波器和调制指数变化,但趋势一致:

SNR (dB)NMSE 典型量级波形表现
300.005~0.01包络干净,恢复波形平滑
150.03~0.06包络有轻微毛刺
50.15~0.3包络局部塌陷,出现门限效应

当 SNR 从 10 dB 降到 5 dB 时,NMSE 不是线性升一倍,而是可能跳升数倍,这就是非相干解调的门限效应。如果你观察到的是缓慢线性恶化,说明仿真里噪声带宽可能取错了,或者是相干解调的模型混了进来。

5. 用相干解调作为标尺验证 AM 非相干解调仿真

仿真有个天然陷阱:自己写的非相干解调可能因为滤波器参数错误而输出一个“看起来差不多”的信号,但实际上是相位失真或带限失真。为了避免这个问题,最实用的技巧是在同一个仿真链路里加一路相干解调作为参考标尺。

相干解调在仿真里实现很直接:接收信号乘以本地同频载波,再用低通滤波器提取基带。由于仿真中不存在频率漂移,本地载波可以和发射载波完全同频同相。把相干解调输出和非相干解调输出画在同一张图里,立刻就能看出包络检波在哪些位置增益衰减、哪些位置出现相位偏移。

% 相干解调参考链路 localCarrier = cos(2*pi*fc*t); % 理想同步载波 mix = rx .* localCarrier; % 频谱搬到基带和 2fc [bRef, aRef] = butter(4, 2*W/(fs/2)); % 基带恢复滤波器 refDemod = 2 * filter(bRef, aRef, mix); % 除以载波幅度 1,补偿 1/2 refDemod = refDemod - mean(refDemod); % 去直流,注意 AM 直流偏置影响 % 对齐后对比两条链路 subplot(2,1,1); plot(t, demod, 'b'); title('非相干包络检波'); subplot(2,1,2); plot(t, refDemod, 'r'); title('相干解调参考');

使用这个标尺时最关键的是幅度刻度。AM 信号包络检波输出携带A0直流偏置,减去后才是基带;相干解调在理想同相位时输出是0.5*A0*[1+ma*mn],所以我在代码里乘以 2,再去掉直流。如果两条链路都能正确恢复基带,两者应该只差噪声形态:非相干输出受包络噪声影响更大,相干输出更接近原始基带的加性噪声。

顺着这个思路还可以进一步验证本地载波相位误差的影响:把本地载波相位偏移 10 度,相干解调输出幅度会按cos(10度)衰减,而包络检波几乎不受影响。这个对比能帮助判断你的仿真模型里是否真的实现了“非相干”特性。把两个解调输出送到同一时刻的示波器里,重点看波形起点和高频毛刺位置,比单独看一条曲线更能发现问题。

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

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

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

立即咨询