通信系统卷积码 Viterbi 译码仿真程序
项目简介
本项目是一个基于 MATLAB 开发的数字通信链路仿真系统,专注于演示和分析卷积码及其 Viterbi 译码算法的性能。仿真链路涵盖了从随机信源生成、卷积编码、BPSK 调制、加性高斯白噪声(AWGN)信道传输到软判决 Viterbi 译码的完整过程。项目旨在通过蒙特卡洛仿真验证卷积码在不同信噪比(Eb/N0)条件下的纠错能力,并将仿真结果与未编码系统的理论误码率进行对比分析。
功能特性
- 完整通信链路仿真:实现了信源、编码、调制、信道、解调、译码及误码统计的全流程。
- 参数化卷积编码:虽然主程序中默认配置为约束长度 K=3,生成多项式 (7, 5) 八进制,但底层函数设计支持自定义约束长度和多项式。
- 软判决 Viterbi 译码:采用基于欧氏距离(Euclidean Distance)的软判决算法,而非简单的硬判决,从而获得更优的译码增益。
- 加-比-选(ACS)运算:完整实现了 Viterbi 算法核心的 ACS 操作,维护路径度量(Path Metric)和幸存路径(Survivor Path)。
- 性能可视化:自动运行不同信噪比下的仿真,统计误比特率(BER),并绘制仿真曲线与理论参考曲线的对比图。
- 尾比特处理:编码过程中包含尾比特(Tail Bits)填充策略,确保编码器状态最终回归零状态,提高译码收敛性。
系统要求
- MATLAB R2016a 或更高版本(代码仅使用基础 MATLAB 函数及通信原理逻辑,不依赖特定工具箱的黑盒函数)。
使用方法
- 确保 MATLAB 环境已准备就绪。
- 直接运行主脚本函数
main。 - 程序将在命令行输出当前的仿真进度,包括当前信噪比(Eb/N0)和计算出的误码率(BER)。
- 仿真结束后,程序将弹出一个图形窗口,展示 Eb/N0 与 BER 的对数关系曲线,其中蓝色线条为本次 Viterbi 译码仿真的结果,红色虚线为未编码 BPSK 的理论值。
代码实现逻辑详解
本项目的所有核心算法均为手动实现,未调用 MATLAB 通信工具箱中的高级函数,以便于理解算法细节。
1. 系统参数配置与初始化
主程序首先定义了关键通信参数:
- 约束长度(K):设置为 3。
- 生成多项式(G):设定为 [1 1 1; 1 0 1],对应八进制表示的 (7, 5) 码。
- 码率:1/2。
- 信噪比范围:Eb/N0 从 -2dB 到 8dB。
- 预计算网格图:调用
build_trellis 函数预先构建状态转移表和输出表,避免在循环中重复计算。
2. 卷积编码模块 (my_conv_encoder)
该函数实现了基于移位寄存器的卷积编码逻辑:
- 输入处理:接受原始比特流,并根据约束长度 K,在末尾自动填充 K-1 个零作为尾比特,强制编码器最终回到全零状态。
- 状态机模拟:使用一个长度为 K 的滑动窗口(寄存器)存储当前及历史输入比特。
- 多项式运算:对每个输入比特,将其移入寄存器,并与生成矩阵 G 进行模 2 卷积运算(点乘后求和模 2),生成对应的编码输出比特。
3. 网格图构建模块 (build_trellis)
为了支持 Viterbi 算法的高效查表,该函数预先计算了所有可能状态和输入的转移关系:
- 状态定义:系统共有 $2^{(K-1)}$ 个状态。
- 逻辑映射:遍历每一个状态(0 到 $2^{(K-1)}-1$)和每一个可能的输入比特(0 或 1)。
- 输出计算:计算当前状态在特定输入下的下一个状态索引,以及对应的编码输出比特,并将这些信息存储在结构体中供译码器使用。
4. 信道模拟与调制
- BPSK 调制:将逻辑比特 0 映射为电平 -1,逻辑比特 1 映射为电平 +1。
- 噪声添加:根据当前设定的 Eb/N0 计算噪声标准差 $sigma$。注意代码中正确处理了信噪比转换关系 $SNR = E_b/N_0 times Rate times 2$(针对实数信号仿真)。生成符合高斯分布的随机噪声并在时域叠加到发送信号上。
5. Viterbi 译码模块 (my_viterbi_decoder)
这是本项目的核心,实现了软判决译码算法:
- 度量初始化:建立路径度量矩阵,初始时刻状态 0 的度量设为 0,其余状态设为无穷大,由于已知编码开始于全零状态。
- 前向递推(ACS 操作):
* 对于每一个时间步,读取接收到的软信息符号。
* 遍历前一时刻的所有可能状态。
*
分支度量(Branch Metric):计算接收到的含噪信号与网格图中理论输出符号(映射为 -1/+1 后)之间的欧氏距离的平方。
*
路径更新:将前一状态的累积度量加上当前分支度量,得到候选路径度量。
*
竞争与选择:对于每一个目标状态,比较所有进入该状态的路径,保留度量值最小(距离最近)的一条路径,并记录该路径对应的“前驱状态”索引。
* 虽然提供的代码片段在回溯逻辑处被截断,但根据其数据结构
survivor_prev_states 可知,算法旨在从最终时刻的最佳状态(通常为度量最小的状态或预设的零状态)开始,利用记录的前驱状态索引矩阵反向推导,逐步恢复出原始的最优输入比特序列。
6. 误码统计与绘图
- 译码完成后,程序截去为了尾比特处理而填充的末尾 K-1 个比特,提取有效信息位。
- 将译码结果与原始信源比特进行比对,统计错误比特数。
- 利用
semilogy 函数绘制对数坐标下的 BER 曲线,直观展示编码增益。