开源一个 MATLAB 水声通信调制工具箱:支持 BPSK/QPSK/8PSK/QAM/DSSS/OFDM
GitHub:https://github.com/ZoperIOT/underwater-acoustic-modulation
最近整理了一个面向水声通信发射端实验的 MATLAB 调制信号生成工具箱,主要用于快速生成 BPSK、QPSK、8PSK、QAM、DSSS 和 OFDM 等常见水声通信发射波形。
这个项目的目标不是做一个完整通信系统,而是先解决水声实验中一个非常基础、却常常容易混乱的问题:如何稳定、规范、可复现地生成发射端调制信号。
它适合通信原理课程设计、水声通信仿真入门、声学换能器发射波形生成、MATLAB 信号处理实验等场景。

1. 为什么先把“信号源”做规范?
做水声通信实验时,很多问题并不从信道开始,而是从发射端就已经埋下了:
- BPSK、QPSK、QAM 的比特映射和相位偏置各写各的;
- 载波频率、符号率、采样率在不同脚本里不统一;
- 成形滤波后波形长度、幅度归一化和 WAV 输出格式不一致;
- 换一个调制方式就要重新改一套脚本;
- 想把仿真信号送到 DAC、功放和换能器时,才发现输出格式没有统一。
对于后续的同步、信道估计、均衡、BER 测试而言,发射端波形是共同起点。先把这个起点固定下来,后面的实验会轻松很多。
这个工具箱将典型发射流程统一为:
Bits → Modulation → Pulse Shaping → Carrier Modulation → WAV Output → Acoustic Experiment
其中,信息比特先映射为复基带符号,再经过根升余弦脉冲成形,上变频为实值声学通带信号,最后可以保存为 WAV 文件,用于播放或接入实际发射链路。
2. 目前支持哪些调制方式?
| BPSK | BPSK | 10 kHz / 200 Baud |
| QPSK | QPSK | 10 kHz / 200 Baud |
| pad_8PSK | 8PSK | 10 kHz / 200 Baud |
| QAMtrain | 方形 QAM(默认 16QAM) | 10 kHz / 200 Baud |
| DSSS | DSSS-BPSK(m 序列扩频) | 11 kHz / 37.8 bit/s |
| OFDM | 导频辅助 QPSK-OFDM | 10 kHz / 7.5 Hz 子载波间隔 |
所有调制函数都会返回:
- waveform:归一化到 [-1, 1] 的实值通带波形;
- info:包含实际使用的比特、基带符号、参数、采样率和持续时间等元数据。
这意味着同一套调用方式可以快速切换调制体制,也方便后续统一接入接收机或信道模型。
3. 最小可运行示例:生成 QPSK 水声发射波形
下面这段代码可以直接生成 128 bit 的 QPSK 声学发射波形,并写出为 WAV 文件:
addpath('src');
bits = randi([0 1], 1, 128);
[waveform, info] = QPSK(bits);
audiowrite('qpsk_10k.wav', waveform, info.sampleRate);
默认配置下,采样率为 96 kHz,载波频率为 10 kHz,符号率为 200 Baud。实际实验中可根据换能器工作带宽、声道条件、功放和 DAC 的满量程范围调整参数。
例如,生成 12 kHz 载波、400 Baud 的 BPSK 波形:
opt = struct('sampleRate', 96000, 'carrierFrequency', 12000, …
'symbolRate', 400, 'rolloff', 0.5);
[waveform, info] = BPSK(randi([0 1], 1, 256), opt);
也可以通过统一入口切换调制方式:
[waveform, info] = generate_signal('ofdm', [], …
struct('carrierFrequency', 12000, 'numberOfOFDMSymbols', 10));
4. 输出波形是什么样的?
仓库中提供了一张由实际 QPSK 示例生成的诊断图,包含三部分:

在 MATLAB 中运行下面的脚本即可重新生成图片:
run('examples/generate_visualizations.m')
如果需要导出所有调制方式的音频样例,可以运行:
run('examples/generate_examples.m')
生成的 WAV 文件会保存在 examples/output/ 目录中。
5. 这个项目适合哪些场景?
通信原理课程设计
可以直接从 BPSK、QPSK、QAM 等基础体制开始,对比不同星座映射、带宽占用和波形特征,再逐步加入信道与接收机。
水声通信仿真入门
先用规范的发射波形搭建基线,再加入多径、噪声、多普勒等水声信道因素,会比从零散脚本开始更容易定位问题。
声学换能器与播放实验
通过 audiowrite 输出 WAV 后,可将波形送入音频接口或自定义 DAC 链路,配合功放和换能器进行水池或台架发射实验。
MATLAB 信号处理实验
项目不依赖 Communications Toolbox。根升余弦滤波器已在仓库内实现,适合希望理解调制流程、又想快速得到可运行结果的同学。
6. 使用时需要注意什么?
- 该项目当前只覆盖发射端波形生成,不包含解调、帧同步、信道估计或 BER 计算。
- 单载波体制需满足 sampleRate / symbolRate 为整数;DSSS 还需满足 sampleRate / (symbolRate * spreadingFactor) 为整数。
- QPSK、8PSK、QAM 的输入比特数应能被每符号比特数整除;OFDM 会自动补零并在 info.paddingBits 中记录。
- 波形虽然归一化到 [-1, 1],但真正接入硬件前仍需按 DAC 格式、功放增益和换能器带宽做幅度与频率校准。
7. 项目地址与后续计划
项目地址:https://github.com/ZoperIOT/underwater-acoustic-modulation
目前已经发布 v0.1.0,包含项目总览、可复现示例和输出诊断图。
如果你正在做通信原理课程设计、水声通信仿真、MATLAB 调制信号生成,欢迎参考这个开源项目。后续我会继续更新解调、同步、信道建模和 BER 测试相关内容。
推荐标签: MATLAB 水声通信 通信原理 数字调制 QPSK OFDM 信号处理 开源项目

![[通信与计算]光通信:原理、器件与系统设计-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260814131455-6a7f14cfdf0e2-220x150.png)

