1. 课程导入与仿真环境搭建
水声OFDM(正交频分复用)技术把高速数据分散到大量相互正交的子载波上传输,既能对抗水声信道的多径扩展,又能通过循环前缀(CP)吸收码间干扰,是当前水声通信研究中最常用的宽带传输方案之一。本课程的目标不是停留在公式推导,而是从零搭建一条可运行、可观测、可修改的水声OFDM收发链路仿真:从比特流出发,经过信道编码、调制映射、串并变换、IFFT、加CP、上变频,进入水声信道模型,再在接收端完成同步、去CP、FFT、信道估计与均衡、解映射与译码,最终统计误码率(BER)与误块率(BLER)。
在动手写第一行代码之前,先把整条链路的信号流向和每一级的数据形态看清楚,是后续所有章节的共同基础。下图给出了本课程采用的收发链路整体架构,标注了各节点的关键参数与数据维度,后续章节将逐级展开。
为什么选择 MATLAB 与 Python 双工具
本课程同时给出 MATLAB 与 Python 两套实现,原因在于二者在水声仿真中的分工不同。MATLAB 的通信工具箱、信号处理工具箱提供了现成的 comm.OFDMModulator、comm.RayleighChannel、berawgn 等对象,适合快速验证算法思路、绘制标准星座与误码曲线;Python 则依托 NumPy/SciPy/Matplotlib 生态,便于与深度学习框架、开源水声信道模型(如 Bellhop 的 Python 封装)以及版本管理工具衔接,适合做可复现的工程化仿真。两套代码在关键参数上保持一致,读者可对照阅读。
工具选择的一个实用判断是:如果本节任务以“验证公式与曲线形态”为主,优先 MATLAB;如果以“批量扫参、生成数据集、接入后续处理链”为主,优先 Python。本课程前段以 MATLAB 讲清原理,后段用 Python 完成参数扫描与结果汇总。
基础环境配置
MATLAB 侧建议 R2021a 及以上版本,安装 Communications Toolbox 与 Signal Processing Toolbox;Python 侧建议 3.9~3.11,核心依赖为 numpy、scipy、matplotlib,可选 scikit-commpy 用于卷积码与维特比译码。下面给出可直接执行的 Python 环境检查脚本,运行后应打印各库版本并完成一次最小 OFDM 调制解调自检:
import numpy as np, scipy, matplotlib
print("numpy", np.__version__, "| scipy", scipy.__version__)
N, CP = 1024, 256
rng = np.random.default_rng(2024)
X = (rng.integers(0, 2, N//2)*2-1) + 1j*(rng.integers(0, 2, N//2)*2-1) # QPSK 半谱
Xf = np.concatenate([X, np.conj(X[::-1])]) # 构造共轭对称,保证实信号
x = np.fft.ifft(Xf).real
tx = np.concatenate([x[-CP:], x]) # 加 CP
rx = tx[CP:CP+N] # 理想信道:去 CP
Y = np.fft.fft(rx)
err = np.max(np.abs(Y[:N//2] - Xf[:N//2]))
print("IFFT/FFT 往返最大误差:", err) # 应接近 1e-12 量级
这段自检的意义在于:它把“共轭对称构造实信号—IFFT—加CP—去CP—FFT”这条最容易出维度错误和共轭错误的路径先跑通。若误差在 1e-10 以下,说明 FFT 长度、CP 截取位置、共轭对称拼接三处均正确,后续再叠加信道与噪声就不会把基础错误误判为算法问题。
仿真参数约定与首个可运行帧
为避免全文符号混乱,先固定参照约定:时间以秒为单位,频率以赫兹为单位,采样率 fs 为 12 kHz;一个 OFDM 符号含 N=1024 个采样点,CP 取 256 点;子载波间隔 Δf = fs/N ≈ 11.72 Hz,符号周期约 85.3 ms,CP 时长约 21.3 ms。CP 时长必须大于信道最大多径时延扩展 τmax,这是水声 OFDM 设计的硬约束——浅海多径常达数十毫秒,因此 CP 往往占到符号长度的 20%~25%,频谱效率的牺牲是必要代价。
建议的第一个可运行帧规模为:信息比特 4096 个,QPSK 映射后 2048 个复符号,占用约 342 个有效子载波、约 6 个 OFDM 符号。这个规模小到可以在命令行逐级打印维度,又足以观察 CP 与导频插入后的帧结构。下表给出建议的初始参数集,可直接作为配置文件起点:
| 参数 | 建议值 | 说明与判断依据 |
|---|---|---|
| 采样率 fs | 12 kHz | 需大于 2 倍最高子载波频率,留出上变频余量 |
| FFT 点数 N | 1024 | 决定 Δf 与符号长度,兼顾时频分辨率 |
| CP 长度 | 256 | 须大于 τmax,示例对应约 21.3 ms |
| 调制方式 | QPSK | 首帧用低阶调制,便于星座判读 |
| 导频间隔 | 每 8 个子载波 1 个 | 梳状导频,兼顾估计精度与开销 |
| 信道模型 | 3 径 + AWGN | 先验证均衡,再引入时变多普勒 |
| 信噪比扫描 | 0~20 dB,步长 2 dB | 每点至少 100 帧统计 BER |
config/、tx/、ch/、rx/、results/ 五个目录,所有参数集中写入一个配置文件,禁止在函数内部硬编码 N、CP、fs。这样后续做参数扫描时只需改配置,不必逐文件搜索替换。