MATLAB调幅广播系统仿真:AM调制解调与包络检波
简介这是一份面向通信原理、信号与系统课程学习者的Matlab调幅广播系统仿真设计课程设计文档。资源围绕中波调幅广播传输链路展开涵盖载波与基带信号参数设定、Simulink建模流程、接收选频滤波器设计、加性高斯噪声方差计算与20dB输出信噪比要求并对比包络检波与相干解调两种解调方式的性能附有脚本程序ex1.m的设计思路与信噪比曲线绘制方法。文档按任务书、系统建模、参数设置、波形观测、总结体会与参考文献组织含目录与章节编号可作为课程设计报告的完整参考框架帮助读者理清从建模、仿真到验证的推进路径。资源包共1个docx文档约359KB目前已有358人学习适合需要完成同类课程设计或夯实Simulink通信仿真实操的读者查阅。1. 从中波广播链路切入为什么先在 MATLAB 里把 AM 系统跑通很多人做调幅广播相关的课程设计或工程预研第一反应是直接拿两块射频板对着调。真调起来才发现调制指数、低通滤波器带宽、包络检波的时间常数这几个参数互相牵制改一个就得重新焊一次一轮下来一周就没了。调幅广播系统的仿真设计本质上就是把整条链路——音源、调制、信道加噪、解调、低通重建——搬到 MATLAB 里用几百行脚本替代反复上电。对通信、电子信息类专业的学生这套仿真能直接支撑课程设计与毕业设计对做接收机预研或算法验证的工程师它先把参数边界摸清楚再决定硬件怎么改。载波取多少、采样率留几倍余量、m 给到 1.0 还是 1.5这些问题在脚本里改一个数字就能重跑几分钟出结果。2. AM 信号的数学模型与 MATLAB 载波域参数化调幅广播的核心是把语音基带搬到中波频段上发射接收端再搬回来。整个链路能不能仿真得准取决于是不是把「数学表达式—离散采样—频谱搬移」这三件事对齐了。很多人第一次写脚本波形画出来挺像样一做 FFT 就发现边带位置不对多半是采样率或者时间轴的构造方式出了问题。2.1 时域表达式、调制指数与上下边带标准双边带调幅的时域表达式是s(t) Ac · [1 m·cos(2π·fm·t)] · cos(2π·fc·t)其中 Ac 是载波幅度fm 是调制信号频率fc 是载波频率m Am/Ac 是调制指数。展开后可以看到三个频率分量位于 fc 的载波以及位于 fc±fm 的上下边带两个边带的幅度都是 m·Ac/2。这意味着调制指数直接决定了边带能量占多少——m 越大边带越强功率利用率越高但 m 超过 1 之后包络会过零包络检波器就再也恢复不出原来的正弦了。实际的中波调幅广播频道间隔通常是 9 kHz 或 10 kHz单声道音频带宽被限制在 4.5 kHz 左右正是为了不让相邻频道的边带互相压叠。仿真时如果只做单音验证fm 取 1 kHz 就够了如果要贴近真实语音可以用一段 wav 或者多个正弦叠加但滤波器截止频率的设定逻辑不变。2.2 采样率、仿真时长与频率分辨率的取值依据采样率是第一道门槛。载波域仿真的最低要求是 fs 2(fc fm)但工程上没人贴着奈奎斯特跑因为抗混叠、滤波器数值条件和画图可读性都会受影响。我一般取 fs 为载波频率的 8 倍左右既保证边带到载波的间隔在频域上占足够多的谱线又不会让点数爆炸。参数符号本文取值取值依据载波频率fc100 kHz比真实中波低一个量级便于脚本快速迭代调制频率fm1 kHz单音测试信号语音基带典型值采样率fs800 kHz8×fc边带间隔在谱上占 8 个 bin仿真时长T5 ms5 个调制周期覆盖包络完整变化调制指数m0.3 / 0.6 / 1.0 / 1.5覆盖欠调幅、正常、临界与过调幅频率分辨率Δf200 HzΔf 1/T决定边带能否与载波分开频率分辨率 Δf fs/N 1/T 这个关系要记住。T 取 5 msΔf 就是 200 Hz载波和边带之间隔了 1000 Hz也就是 5 根谱线谱图上能清清楚楚看到三根独立的峰。如果 T 只取 0.5 msΔf 变成 2 kHz边带直接糊进载波里看起来就像没调制一样。2.3 最小可跑脚本生成 AM 波形并用 fft 看谱下面这段脚本是整个仿真的地基后面所有解调、加噪、评估都在它产出的s上做。%% am_generate.m 生成单音调幅波形并检查频谱 fc 100e3; % 载波频率 100 kHz fm 1e3; % 调制频率 1 kHz fs 800e3; % 采样率 800 kHz8 倍载波 T 5e-3; % 仿真时长 5 ms Ac 1; % 载波幅度 m 0.6; % 调制指数先给一个欠调幅工作点 t (0:round(fs*T)-1). / fs; % 列向量时间轴避免转置踩坑 msg cos(2*pi*fm*t); % 归一化调制信号峰值 1 s Ac*(1 m*msg).*cos(2*pi*fc*t); % 已调波 N numel(t); f (-N/2:N/2-1). * (fs/N); % 双边频率轴单位 Hz S fftshift(fft(s)) / N; % 归一化幅度谱除以 N 便于读数 figure(Color,w); subplot(2,1,1); plot(t*1e3, s); grid on; xlabel(时间 / ms); ylabel(幅度); title(sprintf(AM 已调波波形m %.1f, m)); subplot(2,1,2); plot(f/1e3, abs(S)); grid on; xlim([fc/1e3-10, fc/1e310]); % matlab画图时先放大载波附近 xlabel(频率 / kHz); ylabel(|S(f)|); title(已调波幅度谱);逻辑说明时间轴构造成列向量后续.*、fft都不会出现维度对不上的报错频谱用fftshift搬到零频居中再除以 N 做归一化这样载波谱线高度正好是 Ac/2 0.5上下边带高度是 m·Ac/4 0.15可以拿尺子量着核对。参数说明m改成 0.3 会看到边带峰明显变矮改成 1.5 波形包络就会出现「压扁再翻上来」的形状这是过调幅的直观特征。xlim卡在载波附近 ±10 kHz是因为全频段画到 400 kHz 时三根谱线会挤成一根这是 matlab画图时最容易被忽略的细节。提示如果 fs 取成 2.2 倍载波频谱里会在 fc 附近出现一堆本不该存在的杂散那是采样后边带折叠过来的镜像不是程序写错了。把 fs 提到 4 倍载波以上再跑一次杂散会消失。3. 包络检波与相干解调的 MATLAB 实现生成波形只是准备工作真正的验证发生在解调端。调幅广播接收机有两种主流解调方式结构简单、成本低、几乎所有中波收音机都在用的包络检波以及需要载波同步但抗噪性能更好的相干解调。仿真里把两条路都跑一遍对比结果比只看一边更能说明问题。3.1 整流加低通的包络检波链路与抽取技巧包络检波的物理原型是二极管加 RC 低通二极管负责取出正半周电容负责把载波周期的高频成分滤掉、保留包络的慢变化。仿真里第一步用max(s,0)模拟理想二极管第二步做低通。问题出在低通上。包络的带宽只有 fm 1 kHz而当前采样率是 800 kHz归一化截止频率算下来是 1.5e-3直接扔给butter会得到一堆条件数极差的系数filtfilt出来的结果不是发散就是严重畸变。正确做法是先抽取降低采样率再设计滤波器。s_r max(s, 0); % 理想半波整流模拟二极管导通 r round(fs/(20*fm)); % 抽取因子目标采样率为 20 倍调制频率 env decimate(s_r, r); % decimate 自带抗混叠低通 fs2 fs / r; % 抽取后采样率 20 kHz [b,a] butter(6, 1.5*fm/(fs2/2), low); env_f filtfilt(b, a, env); % 零相位滤波避免包络整体延迟逻辑说明decimate的抽取因子 r 800e3 / (20×1e3) 40抽取后采样率 fs2 20 kHz。此时 1.5 kHz 的截止频率对应归一化值 1.5e3 / 10e3 0.15滤波器的数值条件非常健康六阶巴特沃斯的过渡带也足够窄。filtfilt做前后双向滤波相位响应为零这一步很关键——如果用filter包络会整体平移几十个采样点后面和原始msg做对比时相关系数会被延迟拖低。参数说明截止频率取 1.5·fm 而不是 1·fm是给包络中的二次谐波留一点过渡余地同时又不让载波的二次谐波2fc 附近抽取后已经被decimate的抗混叠滤波器压掉漏进来。高通侧不需要额外处理因为包络恒为正直流分量本身就是信号的一部分收音机里那级隔直电容在这里用不到。低通阶数不要盲目往上加。八阶以上在过渡带更陡的同时阶跃响应会出现明显的振铃对应到音频上就是「嗡嗡」的瞬态失真。3.2 相干解调的相乘与低通滤波器设计相干解调在数学上更干净把已调波和本地恢复的载波相乘再用低通滤掉二倍频项。s(t)·cos(2πfc t) 0.5·Ac·[1 m·cos(2πfm t)] 0.5·Ac·[1 m·cos(2πfm t)]·cos(4πfc t)前一项就是需要的基带后一项集中在 2fc 200 kHz 附近低通一滤就没了。麻烦在于这里的低通截止频率相对于 800 kHz 采样率同样极小所以要用零极点增益形式构造避免多项式系数直接计算带来的数值问题。lo cos(2*pi*fc*t); % 本地载波理想情况与发端同频同相 x s .* lo; % 相乘产生基带与二倍频项 x x - mean(x); % 去直流方便后续指标计算 [z,p,k] butter(6, 1.5*fm/(fs/2), low); % zpk 形式数值更稳 [sos,g] zp2sos(z, p, k); % 转二阶节避免高阶直接型 y filtfilt(sos, g, x); % 零相位低通输出即解调音频逻辑说明butter返回 zpk 参数而不是传递函数系数是因为 Wn 1.5e3/400e3 0.00375 时直接型的b、a系数动态范围超过双精度能稳定处理的范围filtfilt会直接报「矩阵接近奇异」。转成二阶节串联后每个节的系数都在合理量级内结果稳定。参数说明lo的频率必须严格等于 fc相位也最好对齐。仿真里能直接取到理想值实际接收机要靠载波恢复电路或者平方环来提取相位误差带来的影响在 4.3 节里量化。filtfilt输出长度与输入一致不需要额外补齐。3.3 Simulink 模块与 MATLAB 函数的逐环节对照很多人习惯在 Simulink 里搭这套链路模块化看着直观但参数配错时排查比脚本麻烦得多。下面这张对照表能在两条路之间来回切换时省不少时间。链路环节MATLAB 等价写法Simulink 模块关键参数调制信号源cos(2*pi*fm*t)Sine WaveFrequency 1e3Sample time 1/800e3载波cos(2*pi*fc*t)Sine WaveFrequency 100e3相位 0调制(1m*msg).*carrierProduct 或 DSB AM Modulator Passband载波幅度、调制指数信道加噪awgn(s, snr, measured)AWGN Channel模式选 SNR输入相应 dB 值半波整流max(s,0)Saturation下限 0或 Diode 模块上下限 [0, inf]低通滤波butterfiltfiltAnalog Filter Design 或 Lowpass Filter截止 1.5 kHz六阶相干解调s.*cos(2*pi*fc*t)Product 本地 Sine Wave本地载波频率与发端一致频谱观测fftfftshiftSpectrum AnalyzerFFT length N窗函数选矩形注意Simulink 里直接把采样步长设成 1/800e3 时求解器要显式选 Fixed-step discrete。默认的变步长求解器会在载波每次过零附近反复缩减步长一秒钟的波形能跑到十几分钟而且结果里还会混进求解器噪声频谱上看是贴在底噪上的一层毛刺。4. 加噪、过调幅与 AM 解调质量的量化评估波形和解调曲线画出来「看着像」不算完得给出可比较的数字。调幅广播系统的仿真设计里最常用的三个指标是输出信噪比、解调波形与原始调制信号的相关系数、以及归一化均方误差。它们分别回答「抗噪够不够」「波形像不像」「整体差多少」这三个不同的问题。4.1 用 awgn 注入高斯白噪声并计算输出信噪比加噪用awgn最省事但第三个参数不写会踩坑——不写时函数默认信号功率是 0 dBW跟实际波形根本对不上加出来的信噪比完全不是你设的那个值。snr_db 20; % 设定信道信噪比 s_n awgn(s, snr_db, measured); % measured 表示先实测信号功率再按 SNR 加噪 % 走包络检波链路 s_r max(s_n, 0); r round(fs/(20*fm)); env decimate(s_r, r); [b,a] butter(6, 1.5*fm/(fs/2/ (fs/fs2) ), low); % 抽取后重新归一化截止频率 env_f filtfilt(b, a, env); % 用互相关对齐消除滤波与抽取引入的整体延迟 [c, lag] xcorr(env_f, msg); [~, idx] max(abs(c)); d lag(idx); if d 0 env_al env_f(1d : numel(msg)d); else env_al env_f(1 : numel(msg)); end env_al env_al - mean(env_al); % 去直流后再比较 % 幅度归一后算相关系数与输出信噪比 env_al env_al / max(abs(env_al)) * max(abs(msg)); rho corr(env_al, msg); snr_out 10*log10( sum(msg.^2) / sum((env_al - msg).^2) ); fprintf(rho %.4f, SNR_out %.2f dB\n, rho, snr_out);逻辑说明measured参数让awgn先测一次信号实际功率再按指定 dB 值反推噪声功率波形改幅度后不用重新手算。xcorr求互相关峰值的位置用lag把解调输出平移回与msg对齐这一步比手工裁掉前几百个点可靠得多尤其是滤波器阶数变化时。参数说明去直流那一步不能省包络检波输出恒为正均值不为零直接算相关系数会把直流分量当成有效信号ρ 虚高。幅度归一后再比较是因为包络检波 حفظ 的是相对包络绝对幅度本来就和 Ac 差一个系数。4.2 过调幅 m1 引起的包络失真调制指数是调幅系统里最敏感的参数。m ≤ 1 时1 m·cos恒为正包络检波能完整还原m 1 时表达式出现负值整流器把负的部分翻上来输出就变成了原信号的绝对值形状产生严重谐波。m_list [0.3 0.6 1.0 1.5]; res zeros(numel(m_list), 3); for k 1:numel(m_list) m m_list(k); s_k Ac*(1 m*msg).*cos(2*pi*fc*t); s_k awgn(s_k, 20, measured); % 复用 4.1 的包络检波与对齐流程得到 env_al % 指标依次为相关系数、归一化 MSE、包络最小值 res(k,1) rho; res(k,2) sum((env_al - msg).^2) / sum(msg.^2); res(k,3) min(1 m*msg); end逻辑说明循环把调制指数换成四个工作点其他链路完全不动这样指标差异只来自 m。第三列记录理论包络的最小值1 m·msg它小于零就说明已经过调幅可以直接和实测指标对照不用靠肉眼看波形。参数说明相关系数 ρ 越接近 1 越好归一化 MSE 越小越好。以下数量级是在 20 dB 信道信噪比下跑同一套脚本得到的参考值用你自己的参数跑出来可能有出入看趋势比看绝对值更有意义。m理论包络最小值相关系数 ρ归一化 MSE现象0.30.70约 0.99~1e-3边带弱音量偏小失真可忽略0.60.40约 0.99~1e-3常规工作点功率与失真平衡1.00.00约 0.98~1e-2临界满调幅包络触零效率最高1.5-0.50明显下降显著上升包络翻折「削顶」感强谐波丰富提示m 1.0 时理论包络正好触零仿真里如果噪声让包络稍微往负方向偏一点就等价于瞬间过调幅。工程上发射端通常把 m 控制在 0.80.9留出余量。4.3 载波相位误差与本地载波频差的影响包络检波不需要载波同步这是它最大的优势。相干解调虽然输出信噪比更好但本地载波一旦偏离输出立刻受影响。相位误差 φ 是纯乘性衰减输出幅度乘上 cos φ频率误差 Δf 更麻烦会产生 cos(2πΔf t) 的差拍项听感上是周期性起伏。本地载波相位误差 φ输出幅度因子 cos φ相对损失0°1.0000 dB15°0.966约 -0.30 dB30°0.866约 -1.25 dB45°0.707约 -3.01 dB60°0.500约 -6.02 dB90°0.000输出归零验证方法很简单把 3.2 节里的lo换成cos(2*pi*fc*t phi)扫一遍 phi记录解调输出的峰值和上表的 cos φ 对照。频率误差则把lo换成cos(2*pi*(fcdf)*t)df 取 1 Hz、10 Hz、100 Hz观察输出包络的起伏周期是不是等于 1/df。注意包络检波在低信噪比下的门限效应比相干解调明显得多通常信噪比低于 10 dB 后输出会急剧恶化而不是平滑退化。做链路预算时把这一点算进去别按线性关系外推。5. 参数扫描、结果导出与仿真可信度校验单点仿真只能说明「这个参数下能work」要做设计决策得看参数面上的趋势。把脚本改造成可批量跑的形式再配一套固定的导出习惯后面的对比图就不用每次重新手工整理。5.1 扫调制指数与信噪比的双层循环外层扫信噪比内层扫调制指数每个组合跑一次完整的调制—加噪—解调—评估链路把指标存进矩阵。snr_vec 0:5:30; % 信道信噪比扫描点 m_vec [0.3 0.6 0.8 1.0]; % 调制指数扫描点 RHO zeros(numel(snr_vec), numel(m_vec)); MSE zeros(numel(snr_vec), numel(m_vec)); for i 1:numel(snr_vec) for j 1:numel(m_vec) % 复用第 3、4 章的调制、加噪、包络检波与对齐流程 [rho_k, mse_k] am_eval(m_vec(j), snr_vec(i), fc, fm, fs, T); RHO(i,j) rho_k; MSE(i,j) mse_k; end end figure(Color,w); plot(snr_vec, RHO, o-, LineWidth, 1.2); grid on; xlabel(信道信噪比 / dB); ylabel(相关系数 \rho); legend(arrayfun((x) sprintf(m %.1f, x), m_vec, UniformOutput, false), ... Location,southeast);逻辑说明把单次评估封装成函数am_eval主脚本只负责遍历和画图。函数化之后Simulink 里想对比方案也不冲突——脚本能算的指标模型里接一个 To Workspace 模块导出来是同一套算法。参数说明信噪比从 0 扫到 30 dB覆盖了从门限区到理想区的整个范围调制指数取 0.3 到 1.0跳过 1.5 是因为那个点已经属于明确不可用区间放在对比图里会把纵轴压扁看不清正常区的差异。5.2 导出矢量图与数据留档的几条命令论文和报告里插图对分辨率有要求saveas出来的位图放大会糊。导出矢量格式更合适MATLAB 2025 之后的版本用exportgraphics一步到位旧版本可以用print。% 导出为 eps 矢量图适合插入 Word 和 LaTeX exportgraphics(gcf, am_rho_vs_snr.eps, ContentType, vector, Resolution, 300); % 数据同时留一份避免以后重新跑仿真 save(am_sweep_result.mat, snr_vec, m_vec, RHO, MSE); writematrix([snr_vec(:), RHO], am_rho_table.csv);逻辑说明ContentType设成vector时线条和文字都按矢量路径写入放大到 A3 也不糊Resolution参数只对图中的位图元素比如你插入的截图有效纯矢量图用不上也不报错。数据存成.mat加.csv双份.mat保留变量结构方便回读.csv方便贴进表格工具绘图。参数说明文件名里的点号要小心有些期刊模板对扩展名大小写敏感统一用小写.eps最保险。中文标签在 eps 里容易缺字图里的轴标签用英文或者把字体设成支持中文的字体再导出。5.3 三个校验点确认仿真结果没跑偏仿真代码写长了最怕的结果不是报错而是跑出一张看着漂亮但物理上不对的图。三个地方可以快速自查。第一能量守恒。已调波的总平均功率理论上是Ac²/2 · (1 m²/2)用mean(s.^2)实测一下两者对不上就说明时间轴长度不是整数个调制周期或者采样率没和周期对齐。第二边带高度。2.3 节里已经用 FFT 量过载波谱线高度是 Ac/2边带是 m·Ac/4这个比例不随 fs 和 T 变化。相差超过 5% 就要回头查时间轴的构造绝大多数问题是t的转置或者端点重复。第三解调增益。相干解调链路在零相位误差下filtfilt输出的基带幅度理论上是0.5·Ac·m乘性系数包络检波输出则是Ac·(1 m·msg)。两条链路的输出做比值应该是个常数和 msg 无关。这个比值随 msg 变化就说明滤波器把信号也滤掉了一部分需要放宽截止频率或者提高阶数。本文还有配套的精品资源点击获取