
简介面向通信工程初学者的幅度调制AM与非相干解调仿真源码现已发布资源包包含两个M文件压缩后大小仅2KB便于快速下载与本地运行。仿真覆盖基带信号生成、高频载波产生与乘法器调制的完整AM调制流程将低频信息转换为适合传输的高频信号同时演示不依赖精确载波同步的非相干解调方法可应用于课堂教学、实验演示或自学练兵。解调部分重点展示包络检波的实现思路通过波形图与频谱图直观呈现调制前后的信号变化帮助理解双边带抑制载波DSB-SC等常见AM形式的处理逻辑领会非相干解调如何从已调信号中恢复原始信息。两个脚本分别承担调制模拟与解调模拟功能读者可对照运行、调整载波频率与基带信号参数深入掌握模拟通信系统的基础设计环节。目前已有1320人学习下载是通信工程、电子信息类专业学生以及需要快速搭建通信仿真实验的初学者值得参考的源码资源。1. AM 调制解调仿真中非相干解调的“发散”往往不是算法问题把 AM 调制解调和非相干解调放在同一个仿真环境里很多人的第一反应是包络检波取绝对值、低通、去直流三步完事。但真正在 Simulink 或 MATLAB 脚本里跑起来经常会看到起始阶段波形跳变、低通输出出现过冲甚至直接报“仿真发散”。这个现象很容易让人怀疑非相干解调是不是不适合做 AM 调制仿真实际上多数情况是载波频率、采样率和滤波器截止频率没有形成合理的分离度。这篇内容沿着 AM 调制解调、非相干解调和 AM 调制仿真这条线把信号模型、包络检波在仿真里的落地方式、关键参数设置和验证方法一次讲透适合正在做通信系统仿真、课程设计或刚接触调制解调仿真的人参考。2. AM 信号模型与非相干解调原理包络检波的适用边界2.1 AM 信号表达式与调制指数怎么影响包络AM 调制在时域上的标准形式是s(t)[A0m(t)]cos(2πfct)其中 A0 是直流偏置m(t) 是基带调制信号。为了描述调制的深度通常会归一化基带信号写成s(t)A0[1ma·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*(1ma*mn) 应该恒大于 0 plot(t, abs(s), t, A0*(1ma*mn), r--);这段代码里abs(s)只是用来观察高频波形轮廓不是真正的包络检波。A0*(1ma*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载波Amplitude1, Frequency100000载波 fcSine Wave基带Amplitude0.5, Frequency5000对应 ma·mnConstant偏置Value1直流偏置 A0AddInputs2把偏置和基带相加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/(20*fc)跑一遍如果波形正常再切换变步长。低通滤波器初始状态为零信号从 0 突然跳到A0会产生过渡带过冲。给输入信号加一个 20~50 微秒的上升沿或直接把滤波器初始状态设为稳态值。连续滤波器和离散源混用。Simulink 里如果信号源是离散的滤波器用连续模块求解器会插入额外采样点看起来没问题但频谱会多出混叠成分。解调输出乘以恢复增益后数值过大超过了浮点显示范围。先不加增益确认包络幅度和理论值一致后再补偿。这些坑在信号发生器仿真里特别明显如果基带信号是方波包络检波低通后会看到振铃这是滤波器对跳变沿的响应不是非相干解调失效。处理方法是先换成正弦基带把链路调稳再换方波评估振铃影响。4. 非相干解调仿真的关键参数低通带宽、信噪比与波形评估4.1 低通滤波器截止频率到底取多少一个可复用的设计套路包络检波后频谱里有两部分基带信号和围绕2fc的载波二次谐波。低通滤波器的任务是把第一部分尽量无失真地保留把第二部分压掉。理论上截止频率大于W、远小于2fc-W即可。实际设计时我会用这个范围1.2*W fcut 2*W如果 fcut 低于 1.2 倍基带频率基带高频分量会被削平方波信号尤其明显如果 fcut 太高二次谐波泄漏会增加解调波形上会有很细的“锯齿”纹。用butter设计时归一化截止频率要除以fs/2比如W5kHz, fs2MHz, fcut7.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(delay1: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*[1ma*mn]所以我在代码里乘以 2再去掉直流。如果两条链路都能正确恢复基带两者应该只差噪声形态非相干输出受包络噪声影响更大相干输出更接近原始基带的加性噪声。顺着这个思路还可以进一步验证本地载波相位误差的影响把本地载波相位偏移 10 度相干解调输出幅度会按cos(10度)衰减而包络检波几乎不受影响。这个对比能帮助判断你的仿真模型里是否真的实现了“非相干”特性。把两个解调输出送到同一时刻的示波器里重点看波形起点和高频毛刺位置比单独看一条曲线更能发现问题。本文还有配套的精品资源点击获取