
一句话介绍: 这套 MATLAB GUIDE 程序读取 WAV 语音信号,先完成上采样和基带滤波,再选择 AM、SSB 或 FM 调制,通过高斯白噪声信道和接收带通滤波后进行对应解调,最后播放发送与接收语音,并显示时域波形和频谱,用于观察不同调制解调方式及信噪比变化对语音传输的影响。
通信系统仿真真正要观察的,不只是“能不能调制出一个波形”。
更完整的问题是:
一段真实语音怎样变成适合传输的基带信号?
AM、SSB、FM 分别怎样把语音搬移到载波上?
信道加入噪声以后,接收端还能不能恢复原语音?
不同调制方式在频谱占用、接收方法和噪声影响上有什么区别?
恢复后的声音和频谱与原始语音相比发生了什么变化?
当前程序把这些环节串成了一条完整链路:
WAV 语音 → 上采样 → 发送端 FIR 滤波 → AM / SSB / FM 调制 → 高斯白噪声 → 接收带通滤波 → 解调 → 基带低通滤波 → 语音播放 + 时域/频域观察
因此,这套工程更适合作为:
一套面向通信原理教学和调制解调实验的语音通信链路 GUI 仿真程序。
需要先说明一点:辅助资料中提到了“录制语音”和“DSB”,但以当前压缩包源码为准,现有 GUI 不包含录音功能,也没有独立的 DSB 调制选项。程序实际读取已经存在的 .wav 文件,调制菜单实际提供的是 AM、SSB 和 FM。
1. 当前工程里真正有哪些文件?
工程主线比较集中,核心是一个 MATLAB GUIDE 图形界面。
文件 | 作用 |
|---|---|
SW.m | GUI 主程序,包含参数读取、滤波、AM/SSB/FM 调制、噪声信道、解调、播放和频谱计算 |
SW.fig | GUIDE 图形界面布局与默认控件参数 |
luyin3.wav | 工程自带测试语音之一 |
luyin_1.wav | 工程自带测试语音之一 |
luyin_2.wav | 工程自带测试语音之一 |
Untitled.m | 独立 FFT 测试脚本,不在 SW 主通信链路中调用 |
2. 程序输入的语音是什么?
当前 GUI 的“选择文件”按钮只允许选择:.wav音频文件
随后通过 audioread 读取语音和原始采样率。
压缩包中已经给出了三段测试语音:
文件 | 采样率 | 声道 | 时长 |
|---|---|---|---|
luyin3.wav | 44100 Hz | 2 | 约 4.82 s |
luyin_1.wav | 11025 Hz | 2 | 约 6.32 s |
luyin_2.wav | 11025 Hz | 2 | 约 7.29 s |
三段文件都是双声道语音。
程序读取以后,将音频矩阵保存到 handles.source,原始采样率保存到 handles.samplefs,后面的调制、信道和解调全部围绕这两个量展开。
这里要特别区分:当前程序是“读取已有语音文件”,不是“在 GUI 中现场录音”。
源码中没有使用 audiorecorder 等录音接口。
3. GUI 默认给出了哪些通信参数?
SW.fig 中保存的默认设置如下:
参数 | 默认值 |
|---|---|
调制方式 | AM |
基带最低频率 | 0 Hz |
基带最高频率 | 8000 Hz |
上采样倍数 | 3 |
载波频率 | 2 MHz |
载波幅度 | 1 |
AM 调制指数 | 0.2 |
信噪比 | 30 dB |
接收滤波器带宽 | 10000 Hz |
AM 默认解调 | 相干解调 |
载波频率输入框还设置了范围检查:
1.6 MHz ≤ f_c ≤ 30 MHz
这正好对应程序想表达的“短波”频率范围。
切换调制方式时,界面也会自动变化:
选择 AM:显示调制指数,默认 0.2,可选择相干解调或包络检波;
选择 SSB:隐藏调制参数,固定显示相干解调;
选择 FM:参数名称变为“最大频偏”,默认填写 80000。
所以 GUI 并不是简单执行一套固定算法,而是根据不同调制体制切换对应的发射与接收链路。
4. 为什么调制之前还要上采样和基带滤波?
程序不是读取语音后立刻乘载波。
它先把双声道音频重新整理成一维序列,再执行:
原始语音 →upsample上采样 → FIR 基带滤波
如果原语音采样率为 f_audio,上采样倍数为 k,那么新的计算采样率为:
f_s = k × f_audio
默认:k = 3
随后程序根据“最低频率”和“最高频率”设计发送端 FIR 滤波器。
默认最低频率为 0 Hz、最高频率为 8000 Hz,因此主要目标就是把语音限制在约:0~8 kHz的基带范围内。
滤波器没有直接调用 fir1,而是在 firFilter 函数中自己生成 sinc 型冲激响应,再乘 Blackman 窗,最后通过余弦调制实现低通或带通频移。
整个发送端前处理可以概括为:
语音 → 提高离散采样率 → 限制有效语音带宽 → 送入调制器
这样后面的调制和接收滤波都围绕一个相对明确的基带频率范围工作。
5. AM 在当前程序里是怎样实现的?
AM 是 GUI 的默认调制方式。
设滤波后的语音为 m[n],其最大值为 M,调制指数为 μ,载波幅度为 A,则源码对应关系可以写成:
s_AM[n] = A × [m[n] + M/μ] × cos(2πf_c n/f_s)
默认:μ = 0.2
它的本质是在语音信号上加入一个直流偏置,再与载波相乘,从而形成带载波的常规幅度调制信号。
因此这里的 AM 本身已经包含:载波 + 上边带 + 下边带
从频谱角度说,它属于常规双边带带载波 AM。
但需要注意:当前 GUI 没有另外提供一个名为 DSB 或 DSB-SC 的独立调制选项。
AM 接收端提供两种解调方法。
第一种是:相干解调
接收信号再次乘以本地产生的同频余弦,然后去除均值并做低通滤波。
第二种是:包络检波
源码通过 hilbert 得到解析信号,再取绝对值:
包络 = |Hilbert 接收信号|
之后减去平均值,恢复基带变化部分。
因此 AM 是当前程序中唯一可以直接比较:
相干解调和包络检波
两种接收方法的调制体制。
6. SSB 为什么只保留一个边带?
SSB 的目标是避免像普通 AM 那样同时发送两个包含重复信息的边带。
当前源码明确把这一支标记为:SSB(USB)也就是上边带。
程序没有直接调用现成的 SSB 调制函数,而是建立 I/Q 两条支路。
首先根据基带上下限计算中心频率:
f_m = (F_min + F_max) / 2
然后:
基带语音 → 正交混频 → 中间低通滤波 → I/Q 再次搬移到载频附近 → 两支路合成
最终得到 mod_source = I + Q。
这种处理方式利用正交分量抵消不需要的镜像边带,从而构造单边带信号。
接收端则采用相干解调:
SSB 接收信号 × cos(2πf_c t) → 基带低通滤波 → 恢复语音
从理想带宽关系看,如果语音基带宽度为 B_m:普通 AM 带宽约为 2B_m
而:SSB 带宽约为 B_m
因此在相同基带信息下,SSB 最主要的特点就是:
只保留一个边带,提高频谱利用率。
当前程序很适合通过频谱图直观看这种区别,但源码没有自动计算“节省了多少带宽”的数值指标。
7. FM 是怎样把语音写进瞬时频率里的?
切换到 FM 后,GUI 把原来的“调制指数”输入框改成:最大频偏
默认填写:80000
源码把该值记为 α。
对于每一个离散采样点,程序构造:
f_i[n] = f_c + αm[n]
然后对瞬时频率累加得到相位:
φ[n] = φ[n-1] + 2πf_i[n]/f_s
最后生成:
s_FM[n] = cos(φ[n])
因此 AM 改变的是载波幅度,而 FM 改变的是:
载波瞬时频率。
FM 的解调也和 AM、SSB 不同。
程序先建立 I/Q 两路:
I = 接收信号 × cos(2πf_ct)
Q = 接收信号 × sin(2πf_ct)
滤波后通过 Q/I 获得相位信息,再执行相位展开 unwrap,最后通过相邻相位差恢复频率变化。
恢复关系可以概括成:
相位变化率 → 瞬时频偏 → 原始基带语音
源码最后还把异常幅值限制在约:±1.5 × 标准差
范围内,然后再进行基带低通滤波。
所以当前 FM 链路实际上包含:
频率积分调制 → I/Q 正交解调 → 相位展开 → 相位差分 → 基带滤波
比 AM 的包络恢复过程更复杂。
8. 信道噪声是怎样加入的?
程序的信道模型非常明确:加性高斯白噪声 AWGN
它没有直接调用通信工具箱中的 awgn,而是自己根据设定信噪比计算噪声标准差。
若调制信号为 s,GUI 输入信噪比为 SNR,则:
σ = std(s) / 10^(SNR/20)
随后生成:
r = s + σ × randn
默认:SNR = 30 dB
因此改变 SNR 后,最直接变化的是加入接收信号中的随机噪声幅度。
SNR 越高:噪声标准差越小,SNR 越低:噪声标准差越大
这里还有一个很重要的实验特点:
源码没有固定随机数种子。
所以即使所有参数完全相同,每次点击“运行”,randn 产生的噪声序列也可能不同。
如果要严格比较 AM、SSB、FM 在“完全相同的一次噪声实现”下的结果,需要进一步在源码中固定随机种子;当前 GUI 本身没有这个功能。
9. 接收端为什么还要先做一次带通滤波?
噪声加入以后,程序没有直接解调。
它首先围绕载波设计一个接收带通 FIR:
f_c - B/2 ~ f_c + B/2
其中 B 就是 GUI 中的:
接收滤波器带宽
默认:B = 10000 Hz
它的作用是先抑制接收带外噪声,再把有效带通信号送入解调器。
完成 AM、SSB 或 FM 解调以后,程序还会再使用以基带最高频率为依据的低通 FIR,对解调结果进行最后一次滤波。
因此接收链路实际是:
含噪带通信号 → 接收带通滤波 → 对应解调器 → 基带低通滤波 → 恢复语音
这比“直接把噪声信号乘一次载波”更接近完整的通信接收流程。
10. 程序怎样比较发送和接收结果?
当前 GUI 提供了两个很直接的观察入口:
发送信号和接收信号
点击“发送信号”后,程序会:
播放原始 WAV;绘制发送语音时域波形;对原始语音做 FFT;显示发送语音频谱。
点击“接收信号”后,则会:播放完成解调和滤波后的语音;绘制接收语音时域波形;对恢复语音做 FFT;显示接收语音频谱。
频谱由 spectrum 函数计算:
语音 → FFT →fftshift→ 零频移动到频谱中心
因此用户可以从两个角度观察结果:
听感比较 + 时域/频域比较
11. AM、SSB 和 FM 在这套程序里应该怎样比较?
三种方式的区别首先体现在“信息写到载波什么位置”。
方式 | 当前实现 | 主要特点 |
|---|---|---|
AM | 常规带载波幅度调制 | 实现直观,可做相干解调和包络检波对比,但同时保留上下两个边带 |
SSB | 上边带 USB,I/Q 正交实现 | 只传一个边带,理想情况下频谱占用约为普通 AM 的一半 |
FM | 瞬时频率随语音变化 | 信息主要由频率/相位变化承载,需要 I/Q、相位展开和差分恢复 |
如果基带最高有效频率记为 B_m,AM 和 SSB 的理想带宽关系可以近似写成:
B_AM ≈ 2B_m、B_SSB ≈ B_m
FM 则与最大频偏 Δf 有关,常见近似关系为:
B_FM ≈ 2(Δf + B_m)
这也说明了一个重要问题:
不能只改变调制方式,却完全不调整接收滤波器带宽。
例如当前 FM 默认最大频偏为:Δf = 80 kHz
而默认接收滤波器带宽只有:10 kHz
这两个默认量并不是一套匹配的宽带 FM 参数。
因此如果用当前程序研究 FM,接收带宽也应结合频偏和基带带宽重新设置,否则滤波器本身就可能截掉大量 FM 频谱。
12. 这套“短波仿真”最需要注意的建模边界是什么?
当前程序确实把载波频率限制在:1.6~30 MHz
但源码采用的是:
直接对高频余弦载波进行离散时间采样。
这意味着必须同时满足离散采样条件。
程序中的计算采样率为:
f_s = k × f_audio
以工程中的 luyin3.wav 为例:
f_audio = 44.1 kHz
默认:k = 3
所以实际计算采样率只有:f_s = 132.3 kHz
对应奈奎斯特频率仅为:66.15 kHz
而 GUI 默认载波已经是:2 MHz
显然远高于 66.15 kHz。
因此在默认参数下,2 MHz 余弦载波会在离散系统中发生混叠。
如果按 0~8 kHz 基带、2 MHz 载波直接进行无混叠带通信号采样,仅考虑 AM/SSB 上边带,至少需要满足:
f_s > 2 × (2 MHz + 8 kHz) = 4.016 MHz
对于 44.1 kHz 语音,上采样倍数至少约为:k ≥ 92
而不是默认的 3。
如果使用 11.025 kHz 的两段测试语音,上采样倍数还需要更高。
所以当前默认配置更适合:
观察程序中的调制、加噪、滤波和解调流程。
如果希望把它作为频率量纲严格一致的真实 2~30 MHz 射频离散仿真,则需要进一步调整采样方案。
更常见的工程做法是使用:复包络 / 低通等效模型
在较低采样率下描述高频通信,而不是直接用数百万赫兹载波对整段音频进行超高倍率上采样。
13. 当前程序还没有模拟哪些真实短波传播现象?
源码中的“信道”目前只有:
AWGN 加性高斯白噪声
没有实现实际短波传播中常见的:
多径传播;电离层衰落;选择性衰落;多普勒频移;时变信道;窄带干扰;脉冲噪声;发射机和接收机频率偏差。
所以标题中的“短波通信系统”主要体现在:
1.6~30 MHz 的载波参数范围 + AM/SSB/FM 调制解调链
14. 它适合用在哪里?
程序把语音、调制、噪声、滤波、解调和频谱观察集中在一个 GUI 中,非常适合把课堂上的 AM、SSB、FM 概念变成可听、可看的实验过程。
尤其是 AM 可以直接切换:
相干解调 ↔ 包络检波
适合观察不同接收方法的区别。
固定同一段 WAV 和相近的基带设置后,可以依次选择 AM、SSB、FM,观察频谱结构发生什么变化。
其中 SSB 的单边带特征最适合用于说明:
为什么它比普通双边带 AM 更节省频谱。
改变 SNR,可以直接观察:
噪声增大 → 接收波形变化 → 恢复语音听感变化
这类实验不需要建立复杂信道模型,适合研究 AWGN 条件下的基本接收现象。
SW.m 已经把:
参数输入 → 调制 → 信道 → 解调 → 播放 → FFT
串成完整框架,因此也可以作为后续扩展的基础。
15. 哪些参数最值得修改?
参数 | 当前值 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
调制方式 | AM | 决定整个发射与接收算法 | 可切换 AM、SSB、FM 进行对比 |
SNR | 30 dB | 直接控制 AWGN 强弱 | 越低时恢复语音通常受噪声影响越明显 |
基带最高频率 | 8000 Hz | 决定保留多少语音频谱 | 同时影响发送/接收基带滤波 |
接收带宽 | 10000 Hz | 决定通过多少带通信号和噪声 | 太窄会损失信号,太宽会引入更多噪声 |
上采样倍数 k | 3 | 决定整个离散仿真的计算采样率 | 做高频直接采样时必须特别关注混叠 |
FM 最大频偏 | 80000 Hz | 直接决定 FM 瞬时频率变化范围 | 频偏增大时通常还需同步扩大接收带宽 |
载波频率虽然也是 GUI 的重要输入,但在当前直接离散采样实现中,不能脱离上采样倍数单独调整。
尤其当载波进入 MHz 数量级时,应先检查:
当前 f_s 是否足够表示该载波。
16. 怎么运行?
先将整个“短波通信系统仿真”目录保持完整,确保 SW.m 和 SW.fig 位于同一 MATLAB 工作目录中。
在 MATLAB 命令窗口运行:SW即可打开 GUIDE 主界面。
推荐操作顺序为:
运行SW→ 选择 WAV → 选择 AM/SSB/FM → 设置基带、载波、SNR 和接收带宽 → 点击“运行” → 点击“发送信号” → 点击“接收信号”
其中有几个源码层面的使用注意事项。
第一,程序选择文件后虽然生成了完整路径 sourceFile,但实际读取使用的是:
audioread(fname)
而不是完整路径。
因此最稳妥的做法是:
把测试 WAV 放在 MATLAB 当前工作目录中,或者先把 MATLAB 当前目录切换到音频所在目录。
工程自带的三段 WAV 与主程序本来就在同一个文件夹,直接用于测试比较方便。
第二,程序使用了 upsample 和 hilbert,因此按原代码运行建议具备:
Signal Processing Toolbox
17. 一句话看懂这个项目
这是一个 MATLAB GUIDE 语音通信链路仿真程序:它读取 WAV 语音,按设定带宽进行上采样与 Blackman 窗 FIR 滤波,再选择 AM、SSB 上边带或 FM 完成载波调制,通过按 SNR 生成的高斯白噪声信道和接收带通滤波后,分别使用相干解调、Hilbert 包络检波或 I/Q 相位差分恢复基带语音,最终可以试听发送与接收结果并观察 FFT 频谱。工程自带 3 段双声道测试语音,GUI 默认载波为 2 MHz、SNR 为 30 dB、基带上限为 8 kHz;但默认上采样倍数仅为 3,与 MHz 级载波的直接离散采样条件并不匹配,因此当前程序更适合 AM/SSB/FM 调制解调原理和 AWGN 实验教学,若用于严格短波射频仿真,还需要重新设计采样方案、FM 接收带宽以及更真实的短波传播信道。