简介:围绕通信原理课程中的模拟调制解调实验,这份DOC文档以Simulink为仿真平台,系统梳理AM、DSB与SSB三类调制方式的设计原理、建模过程与结果分析,适合通信工程、电子信息等专业学生以及需要复现实验的初学者。文档先给出AM的时域表达式、频谱结构及相干解调与包络检波思路,再对比抑制载波双边带的调制效率与相干解调要求,并进一步说明SSB的滤波法和相移法实现差异;仿真中设置5Hz调制信号与50Hz载波,加入均值0、方差1的高斯白噪声,便于观察幅度失真与波形偏差。压缩包仅含1个DOC文件,约390KB,篇幅紧凑,便于按章节查阅。目前已有4771人学习下载,可作为实验报告撰写、Simulink模型搭建和调制性能对比的参考素材,帮助读者理解边带取舍、噪声影响及不同解调方案的优劣。
1. 从一份“AM、DSB、SSB 调制解调仿真.doc”说起
很多人第一次在课程设计里看到“基于 Simulink 的 AM、DSB、SSB 调制解调仿真”,第一反应是拖几个模块连起来跑个波形就交差。可真跑起来才发现:包络检波出来的正弦波为什么上下不对称?DSB 相干解调后幅度只剩一半是哪里被吃掉了?SSB 用滤波法在 5 Hz 基带、50 Hz 载波这种窄带比下为什么滤波器根本滤不干净?这份文档的价值不在于它做了三个实验,而在于它把三种幅度调制的差异摆在了同一组参数下——调制信号 5 Hz、振幅 1,载波 50 Hz、振幅 1,信道里再加均值为 0、方差为 1 的高斯白噪声。同一套激励、同一条噪声链路,AM 能包络检波也能相干解调,DSB 必须相干解调,SSB 又要分滤波法和相移法两条实现路径。对做通信原理课设、准备信号与系统大作业,或者想快速搭一个可用于后续信道编码验证的基带-频带链路的人来说,这就是一份可以直接复现、又能顺着往下改的工程骨架。
2. AM/DSB/SSB 的数学差异与 Simulink 模块选型
2.1 三种调制的时域与频谱对照
先把公式落到可比较的坐标上。AM 是把直流分量 A0 叠加到基带 m(t) 后再乘载波,DSB 直接去掉 A0 只乘载波,SSB 则是在 DSB 基础上再砍掉一个边带。三者的差别在频域上非常直白:基带带宽记为 B,AM 和 DSB 占 2B,SSB 只占 B。
| 调制方式 | 时域表达式 | 带宽 | 载波分量 | 解调方式 |
|---|---|---|---|---|
| AM | [A0 + m(t)]·cos(ωct) | 2B | 有,占总功率大头 | 相干解调或包络检波 |
| DSB | m(t)·cos(ωct) | 2B | 无 | 必须相干解调 |
| SSB | m(t)cos(ωct) ± m̂(t)sin(ωct) | B | 无 | 相干解调(相移法) |
这张表解释了文档里那句“DSB 调制效率是 100%”:载波不携带信息,去掉 A0 后所有功率都落在边带上。代价是 DSB 的包络不再等于 |m(t)|,无法用二极管加 RC 做非相干检波,必须本地恢复同频同相的载波做相干解调。AM 之所以两种解调都行,就是因为它保留了载波分量,让包络保持单极性。
2.2 Simulink 里到底要摆哪些模块
以 AM 相干解调链路为例,常见搭法是:Sine Wave 产生 5 Hz 基带 → Add 叠加常数 A0 → Product 与 50 Hz 载波相乘 → Transport Delay 或 AWGN Channel 模拟信道 → 再次 Product 与同频载波相乘 → Analog Filter Design 做低通 → Scope 观察。
参数配置上,几个点最容易设错:
- Sine Wave 的 Sample time 不能留默认的 0(连续),跑变步长时可以,但要做 FFT 就固定成 1e-4 s。
- AWGN Channel 的 Eb/No 模式对基带仿真不适用,直接切到 SNR 模式,符号功率按 1 W 估。
- 相干解调用的本地载波必须和发端同频同相,任何相位偏差都会让解调输出乘上 cos(Δφ)。
- 低通滤波器截止频率取基带最高频率的 1.2 倍左右,5 Hz 基带就取 6 Hz,阶数太高会引入明显群延迟。
提示:仿真步长和载波频率必须满足采样定理。50 Hz 载波至少 500 Hz 采样率,用 1e-4 s 步长相当于 10 kHz 采样,频谱观察时不会混叠。
2.3 用 MATLAB 代码先验证公式再搭模型
搭 Simulink 之前,建议先用一段脚本把三种调制的频谱跑一遍,心里有个基准线,出问题时能立刻判断是模型错还是理论理解错。
% 三种幅度调制的基础验证脚本 fs = 10000; % 采样率,远高于 50 Hz 载波 t = 0:1/fs:1; % 1 秒时长 fm = 5; fc = 50; % 基带 5 Hz,载波 50 Hz mt = cos(2*pi*fm*t); % 单音基带,振幅 1 ct = cos(2*pi*fc*t); A0 = 1; % AM 的直流偏置 s_am = (A0 + mt).*ct; % AM:含载波分量 s_dsb = mt.*ct; % DSB:抑制载波 s_ssb = mt.*ct - imag(hilbert(mt)).*sin(2*pi*fc*t); % 相移法取下边带 % 画频谱,重点看边带位置和载波谱线 for k = 1:3 sig = {s_am, s_dsb, s_ssb}{k}; S = abs(fftshift(fft(sig)))/length(sig); f = linspace(-fs/2, fs/2, length(sig)); subplot(3,1,k); plot(f, S); xlim([-100 100]); grid on; end这段代码的关键在imag(hilbert(mt)),它给出基带的希尔伯特变换,即相移 90° 的分量。相移法 SSB 的核心就是让基带和它的正交版本分别乘 cos 和 sin,两路相减即可抵消掉一个边带。跑完看频谱:AM 在 ±50 Hz 处有孤立的载波谱线,DSB 没有,SSB 只剩一边。这就是后面在 Simulink 里判断模型对不对的第一手参照。
3. 三条链路的 Simulink 建模与参数落地
3.1 AM 双解调路径:相干与包络检波对比
AM 链路的核心是把“含载波的幅度信息”拆出来,相干解调和包络检波是两条路。相干解调在 Simulink 里的关键配置如下:
% 建议在模型初始化脚本里统一参数,避免散落在各模块 mdl = 'am_demod'; fm = 5; fc = 50; A0 = 1; Ac = 1; % 载波振幅 Ts = 1e-4; % 固定步长 snr_db = 10; % 信道信噪比,对照文档中的高斯白噪声 set_param(mdl, 'StopTime', '0.5', 'Solver', 'FixedStepDiscrete', ... 'FixedStep', num2str(Ts));相干解调后必须低通,否则 2fc 附近的分量会残留。低通用Analog Filter Design,类型选 Butterworth,截止 6 Hz,阶数 4。包络检波则换成Diode+Lowpass Filter的组合,实现上等效为绝对值加 RC 平滑。
两条路的差异在结果里很明显:相干解调输出严格等于 A0+m(t) 的一半(0.5 倍系数来自乘积定理),需要乘 2 才能恢复原幅度;包络检波输出直接是 A0+m(t) 的包络,无需额外增益,但要求 A0 大于 m(t) 峰值,否则会出现过调幅失真。文档里“幅度大致相同但有偏差”的现象,一半来自那个 0.5 的系数,一半来自噪声。
3.2 DSB 相干解调与 0.5 系数陷阱
DSB 去掉载波后,链路和 AM 相干解调几乎一样,只是发端少一个 Add。真正要盯的是解调增益:
% DSB 相干解调后的理论输出 % 接收信号 r(t) = m(t)*cos(wc t) % 乘以本地载波再低通:r(t)*cos(wc t) -> 0.5*m(t) % 因此恢复出的信号是原基带的一半,必须补 2 倍增益 gain_comp = 2;很多课设报告里说“DSB 恢复出信号幅度大幅减小”,说的就是这个 0.5。解决办法要么在解调后加 Gain 模块设成 2,要么在发端把基带振幅设成 2。选择哪种看你的评价指标:如果要比抗噪性能,统一在解调后补增益更干净。
DSB 的抗噪声性能优于 AM 的原因也在这里。AM 的载波分量不携带信息却占用大量功率,发射效率低;DSB 全部功率都在边带上,相同总功率下信噪比更好。文档里“DSB 抗噪声性能较好”的判断是对的,仿真的 SNR 调到 10 dB 就能看出端倪。
3.3 SSB 滤波法 vs 相移法的实现与坑
SSB 是三种里最容易翻车的,因为它要么依赖滤波器,要么依赖正交支路,两条路各有各的坑。
滤波法:先产生 DSB,再用单边带滤波器滤掉一个边带。问题在于 5 Hz 基带、50 Hz 载波时,上下边带离载波只有 5 Hz 间隔,过渡带极窄。理想高通/低通不可实现,实际滤波器阶数要拉到很高才勉强干净。
% 滤波法 SSB 的滤波器设置 % 保留下边带:理想低通,截止略高于 fc % 保留上边带:理想高通,截止略低于 fc N = 64; % FIR 阶数,低了根本滤不出来 fc_cut = 50; % 截止频率取载波处 b = fir1(N, fc_cut/(fs/2), 'low'); % 保留下边带 % 注意 fir1 会引入 N/2 个采样点的群延迟,需在解调侧补偿相移法:不需要陡峭滤波器,但要一条 90° 相移支路。MATLAB/Simulink 里用 Hilbert Transform 模块给基带做 90° 相移,再分别乘 cos 和 sin 后相加或相减。相移法对相位误差敏感,但对幅度频率响应的平坦度要求低,所以在窄带比下效果反而更好——这正是文档里“相移法效果好于滤波法”的工程原因,不是玄学。
注意:希尔伯特滤波器在低频段相移不准,基带如果含直流分量,相移法会产生残留误差。可以在基带源后加一个隔直高通把 0 Hz 分量压掉。
4. 高斯白噪声下的信噪比对比与结果校验
4.1 AWGN Channel 参数与仿真结果判读
文档里加了均值为 0、方差为 1 的高斯白噪声。在 Simulink 里对应AWGN Channel模块,方差为 1 意味着噪声功率为 1 W,如果基带振幅 1,信号功率约 0.5 W,信噪比就是负的,波形会糊成一片。实际做对比实验时,建议按 SNR 扫描:
% 批量跑不同 SNR,对比三种调制的输出信噪比 snr_list = 0:2:20; for s = snr_list set_param([mdl '/AWGN Channel'], 'SNR', num2str(s)); sim(mdl); % 用 To Workspace 记录输出,计算与原始基带的相关系数 r = corrcoef(out.sig_out, out.sig_ref); fprintf('SNR=%d dB, corr=%.4f\n', s, r(1,2)); end判读结果时重点看三个量:解调输出与原始基带的相关系数、输出信号的均方误差、恢复载波的相位偏差。相关系数在 10 dB 以上应接近 0.99,低于 0.9 说明链路有问题,多半是滤波器通带太窄或者本地载波相位没对齐。
4.2 常见失真来源与定位方法
文档里提到“去掉噪声后幅度失真仍在,波形失真基本消失”,这个判断可以用仿真复现:把 AWGN 模块禁用,重跑,如果输出依旧整体偏小,那就是 0.5 系数没补;如果波形变成平顶或者削峰,那就是 AM 过调幅,A0 设小了。逐步定位比盲目调参数快得多。
| 现象 | 可能原因 | 排查手段 |
|---|---|---|
| 输出整体缩小一半 | 相干解调 0.5 系数未补偿 | 解调后加 Gain=2 |
| 波形削顶 | AM 过调幅,A0 < max | m(t) |
| 频谱旁瓣泄漏严重 | 滤波器阶数不足 | 提高 FIR 阶数或改 Butterworth 阶数 |
| 输出有直流偏置 | 希尔伯特变换低频误差 | 基带加隔直高通 |
| 相位整体偏移 | 本地载波初相未对齐 | 统一设置两路 Sine Wave 初相为 0 |
4.3 用 FFT 和误差曲线做定量验证
光看 Scope 波形只能定性判断,真正要写进报告或做优化,得落成数值。建议给每条链路挂两个输出端口:一个接 To Workspace 存时域,一个接 Spectrum Analyzer 看频域。跑完后在 MATLAB 里做一次误差分析:
% 定量评估解调效果 err = out.sig_out - out.sig_ref; mse_val = mean(err.^2); % 均方误差 snr_out = 10*log10(mean(out.sig_ref.^2)/mse_val); % 输出信噪比 fprintf('输出 SNR = %.2f dB, MSE = %.4f\n', snr_out, mse_val);横向对比 AM、DSB、SSB 三条链路在同一 SNR 下的输出信噪比,就能把文档里那句“SSB 理论抗噪好但实际效果差”量化出来:理论上 SSB 输出信噪比应等于 DSB,但滤波法在 5 Hz/50 Hz 这种窄带比下损失明显,相移法能追回来。这条对比曲线,比任何结论文字都有说服力。
5. 从仿真到实机:模型导出与参数迁移技巧
仿真跑通只是第一步,课设里常被追问“这个模型能不能生成代码、能不能上硬件”。Simulink 支持通过 Embedded Coder 把模型转成 C 代码,也可以导出为 FMU 供其他工具做联合仿真。导出前有几件事必须做,否则生成的代码跑不出预期结果。
先做静态检查。用 Model Advisor 扫一遍,重点关注代数环、数据类型不匹配、采样时间继承这三类告警。幅度调制链路里常见的是滤波器模块的采样时间跟着求解器走,一旦求解器改步长,滤波器系数会失配。做法是把所有信号源和滤波器的采样时间显式写成同一个值,比如统一设 1e-4 s,别留继承。
再固定数据类型。仿真时默认 double 没问题,生成代码后 double 在定点目标上开销大。可以在基带源后加 Data Type Conversion 统一成 single,观察性能损失是否可接受。
导出 FMU 的常见流程是:先给模型配置rtwbuild目标,然后用exportToFMU2CS导出。注意 FMU 里不包含 Simulink 的求解器,外部工具要用自己的积分器,所以模型里如果依赖变步长求解器的刚性处理,导出后精度会掉,最好在仿真阶段就用固定步长验证一遍。
最后一个实用技巧:把三种调制的参数写成一个结构体放进模型工作区,而不是散落在各模块的对话框里。切换 AM/DSB/SSB 时只改结构体字段,模型本身不动。这样批量扫参、批量出图都只用改一行代码,比逐个点开对话框改数字靠谱得多,也方便把整个工程交给别人复现。
本文还有配套的精品资源,点击获取