基于MATLAB的卷积码编译码与Viterbi译码误码率仿真系统
项目介绍
本项目是一个基于MATLAB环境开发的完整数字通信链路仿真系统,专注于卷积码(Convolutional Codes)的编码与译码性能分析。项目代码源自经过严格校验的高分毕业论文,旨在修复网络上常见同类资源的逻辑错误,提供一套逻辑严谨、算法透明的参考实现。
该系统从底层原理出发,不依赖MATLAB通信工具箱的高级封装函数(如 convenc 或 vitdec),而是手动实现了卷积编码器和Viterbi译码算法的核心逻辑。这使得本项目特别适合用于深入理解信道编码理论、Viterbi算法(最大似然估计)以及移动通信中的信道传输过程。
功能特性
- 全链路仿真:涵盖信源生成、卷积编码、BPSK调制、AWGN信道模拟、硬判决解调、Viterbi译码及误码率统计的全过程。
- 手动算法实现:
*
Trellis构建:自动根据约束长度和生成多项式计算网格图的状态转移表和输出表。
*
卷积编码:基于移位寄存器原理手动实现编码逻辑。
*
Viterbi译码:实现经典的硬判决Viterbi算法,包含路径度量初始化、分支度量计算(汉明距离)、加-比-选(ACS)操作及路径回溯逻辑。
* 正确的 $E_b/N_0$ 到 $E_s/N_0$ 的信噪比转换。
* 包含尾比特(Tail Bits)处理,不仅在编码端添加 $K-1$ 个零比特使寄存器归零,更在误码率计算时正确截断。
- 可视化分析:自动绘制误码率(BER)随信噪比($E_b/N_0$)变化的曲线图,用于评估系统性能。
系统要求
- MATLAB R2016a 或更高版本(代码基于基础MATLAB函数编写,对工具箱依赖较低)。
使用方法
- 将代码保存为MATLAB脚本文件(例如
main.m)。 - 确保工作路径下包含主函数及所有子函数。
- 直接运行主脚本。
- 程序将在命令行输出初始化状态,并在仿真循环中实时打印当前信噪比下的误码数和误码率。
- 运行结束后,系统将自动弹窗显示BER曲线图。
代码实现逻辑详解
本项目的核心逻辑位于 main 函数及其调用的子函数中,具体流程如下:
1. 系统参数初始化
程序首先定义了通信系统的关键参数:
- 帧长度:设定为 10,000 比特,保证足够的样本量以统计低误码率。
- 卷积码结构:采用约束长度 $K=3$,码率 $R=1/2$。生成多项式使用八进制表示
[7, 5](即 $g_1=1+D+D^2$, $g_2=1+D^2$)。 - 信噪比范围:设定 $0 sim 10$ dB 的 $E_b/N_0$ 扫描范围。
2. 网格(Trellis)预计算
为了提高译码效率,程序调用
create_trellis 函数预先计算卷积码的拓扑结构。该函数将八进制生成多项式转换为二进制,并遍历所有可能的状态($2^{K-1}$个)和输入(0或1),生成“状态转移表”和“输出符号表”。这一步模拟了编码器的状态机行为。
3. 仿真主循环
程序对每个信噪比点进行独立的蒙特卡洛仿真:
- 信源产生:生成均匀分布的随机二进制序列(0/1)。
- 尾比特填充:为了保证编码器最终回到全零状态(Trellis Termination),在数据末尾添加了 $K-1$ 个零比特。这对于分组传输的Viterbi译码是必要的,能显著降低末尾数据的误码率。
- 卷积编码:调用
convolutional_encoder 函数。该函数模拟物理移位寄存器,通过滑动窗口和模2加法(异或)生成编码序列。 - 信道传输:
*
BPSK调制:将逻辑0映射为-1,逻辑1映射为+1。
*
噪声添加:根据当前 $E_b/N_0$ 计算噪声方差。代码中严谨地进行了单位转换:$E_s/N_0 = (E_b/N_0) times R$,从而推导出高斯白噪声的标准差,并叠加到发送信号上。
- 解调与判决:采用硬判决(Hard Decision)方式。接收信号大于0判为1,小于等于0判为0(注意:此处接收端的判决逻辑已根据发送端的映射关系进行了适配,确保逻辑一致)。
- Viterbi译码:调用
viterbi_decoder_hard 对接收到的含噪比特流进行纠错。 - 误码统计:将译码结果去除尾比特后与原始信源比对,计算误码率(BER)。
4. 结果可视化
仿真结束后,调用
plot_results 函数绘制 $E_b/N_0$ 与 BER 的关系曲线,通常采用半对数坐标系展示。
关键算法实现细节
###手动构建卷积编码器 (convolutional_encoder)
该函数并未通过矩阵乘法实现,而是模拟了硬件移位寄存器的工作流:
- 维护一个长度为 $K-1$ 的寄存器状态
reg。 - 对输入比特流逐位处理,将输入位推入寄存器,旧位移出。
- 利用生成多项式的二进制掩码与当前寄存器状态进行点乘和模2求和,得到输出码字。
硬判决 Viterbi 译码器 (viterbi_decoder_hard)
这是本项目的核心算法模块,实现了最大似然序列估计:
- 初始化:设定时刻0的状态度量,状态0的路径度量(Path Metric, PM)为0,其余状态为无穷大。
- 前向递推(Forward Pass):
* 遍历每一个时间步 $t$。
* 计算接收符号与网格图中预期输出符号之间的
汉明距离(Branch Metric)。
* 执行
ACS (Add-Compare-Select)操作:对于每一个“下一状态”,比较所有能到达该状态的路径的累积度量,保留度量最小(距离最近)的那条路径。
* 记录
幸存路径:使用矩阵存储每个状态在每个时刻的最优前驱信息(输入比特或前一状态),为回溯做准备。
- 回溯与输出:利用前向递推记录的幸存路径矩阵,从最佳路径恢复出原始发送的比特序列。