8-PSK网格编码调制(TCM)性能仿真系统
项目简介
这是一个基于MATLAB环境构建的通信仿真系统,专注于评估网格编码调制(TCM)技术在加性高斯白噪声(AWGN)信道下的性能表现。项目实现了一个结合了卷积编码与8-PSK调制的4状态TCM方案,采用了Ungerboeck提出的集合划分原则来最大化编码序列间的欧几里得距离。通过蒙特卡洛仿真方法,系统计算并展示了TCM方案与未编码方案(如理论QPSK)在不同信噪比下的误码率(BER)对比。
系统要求
- MATLAB R2016a 或更高版本
- 通信工具箱(可选,核心算法已通过基础矩阵运算实现)
功能特性
- 4状态TCM编码:实现了基于有限状态机的卷积编码器,将2比特输入映射为8-PSK符号。
- 8-PSK星座映射:基于单位圆的8相移键控调制。
- AWGN信道模拟:能够根据设定的$E_b/N_0$精确生成复数高斯白噪声。
- 软判决维特比译码:接收端采用最大似然序列估计(MLSE)算法进行解码。
- 动态误码统计:支持基于帧的蒙特卡洛仿真,具备目标错误数自动停止机制。
- 性能评估与可视化:计算误比特率(BER)并绘制接收星座图及性能曲线。
代码实现逻辑详解
1. 仿真参数配置
系统首先定义了仿真的基础环境:
- 信噪比范围:扫描 $E_b/N_0$ 从 0 dB 到 12 dB。
- 帧结构:每帧包含 1000 个符号(对应 2000 个比特)。
- 停止条件:为保证统计置信度,设置了最大仿真帧数(500帧)和累计最大误码数(1000个比特错误)。
- 星座定义:预计算了 $M=8$ 的PSK复数星座点,相位均匀分布。
2. 网格(Trellis)结构定义
代码通过查找表(Look-up Tables)的方式定义了TCM的核心网格结构,严格遵循Ungerboeck的集合划分原则:
- 状态空间:定义了4个状态(索引0-3)。
- 状态转移表 (NextStateTable):定义了当前状态在给定输入(2比特,值0-3)下如何跳转至下一个状态。
- 输出映射表 (OutputTable):定义了状态转移所对应的8-PSK符号索引。
- 设计细节:转移逻辑经过设计,使得自同一状态发出的分支信号点之间的欧氏距离最大化(例如状态0发出的分支对应子集A和B,涵盖符号0,2,4,6)。
3. 主仿真循环流程
仿真采用双层循环结构(外层由于SNR遍历,内层为帧循环),核心步骤如下:
A. 信源产生
生成随机整数序列(0-3),每个整数代表一个2比特的输入符号。
B. TCM 编码与调制
模拟了一个有限状态机:
- 初始化状态为0。
- 遍历输入序列,利用
NextStateTable 更新状态,利用 OutputTable 获取输出符号索引。 - 通过索引在8-PSK星座图中提取对应的复数信号点。
C. AWGN 信道传输
- 根据当前的 $E_b/N_0$ 计算噪声功率。注意系统考虑了编码效率(Rate = 2 bits/symbol),因此符号信噪比 $E_s/N_0 = E_b/N_0 + 3dB$。
- 生成复数高斯白噪声并叠加到发送信号上。
- 保存特定SNR下的接收数据用于后续的可视化绘图。
D. 维特比译码 (Viterbi Decoding)
调用译码函数,利用接收到的含噪信号、网格定义表和星座图进行软判决译码。算法在该步骤寻找通过网格的最短路径(最小累积欧几里得距离)。
E. 误码率统计
- 对比发送数据与译码后的数据。
- 位误差转换:代码包含精确的位操作逻辑,计算符号误差对应的比特误差。
- 如果符号差值为3(二进制11),计为2个比特错误。
- 其他非零差值计为1个比特错误。
- 累计错误数,当达到阈值或最大帧数时停止当前SNR点的仿真。
4. 性能基准与可视化
- 理论基准:代码同时计算了未编码QPSK在相同比特能量下的理论误码率公式 $P_b = 0.5 times text{erfc}(sqrt{E_b/N_0})$,用于评估TCM带来的编码增益。
- 图形输出:
-
星座图:绘制接收到的含噪信号点云(青色)与标准星座点(红色),直观展示噪声影响。
-
性能曲线(逻辑隐含在变量计算中):记录了TCM仿真BER和理论BER数据,用于后续绘制误码率曲线。
关键算法说明
基于查表的卷积编码
代码没有使用通用的卷积编码器对象,而是直接实现了基于状态转移矩阵的编码逻辑。这种方法执行效率高,且便于通过直接修改 OutputTable 来调整星座点映射规则以优化欧氏距离。
软判决度量
虽然译码器内部实现被封装,但主流程传入了原始的含噪复数信号(RxSymbols)而非硬判决后的比特,这意味着系统使用的是欧几里得距离作为分支度量(Branch Metric),这是TCM获得优越性能的关键。
位异或误码计算
为了准确评估性能,系统没有简单地统计符号错误,而是将符号值进行异或操作(bitxor),并根据结果的汉明重量(Hamming Weight)精确计算误比特数,确保了BER计算的准确性。
使用方法
- 确保MATLAB当前路径包含
main.m 文件。 - 直接运行
main 函数。 - 控制台将实时输出每个SNR点的仿真进度、误码率和仿真帧数。
- 仿真结束后,将自动弹出一个窗口显示接收信号的星座图对比。