3GPP标准咬尾卷积码 (TBCC) 编解码与性能仿真系统
项目介绍
本项目是一个基于MATLAB的通信链路仿真系统,专注于实现3GPP LTE及5G标准控制信道中定义的咬尾卷积码(Tail-biting Convolutional Codes, TBCC)。系统完整构建了从信源生成、信道编码、调制、通过AWGN信道到软判决译码及误码统计的通信全过程。
核心亮点在于实现了一种符合3GPP TS 36.212规范的编码器,以及基于循环维特比算法(WAVA, Wrap-Around Viterbi Algorithm)的高性能解码器。该系统旨在评估在低信噪比环境下,TBCC算法的误比特率(BER)和误帧率(FER)性能。
功能特性
- 3GPP标准遵从:严格按照TS 36.212协议定义,使用约束长度K=7,码率R=1/3的生成多项式(八进制133, 171, 165)。
- 咬尾编码机制:实现了由数据末尾状态初始化寄存器的“咬尾”特性,确保编码起始状态与结束状态一致,消除了传统卷积码的零尾比特开销。
- WAVA循环译码:采用回溯维特比算法(WAVA),支持对循环网格图进行多次迭代(默认3次),显著提升短帧传输的译码可靠性。
- 软判决处理:解码器直接处理来自信道的浮点软信息,而非硬判决比特,最大限度利用信道信息。
- 性能可视化:自动生成Eb/N0 vs BER/FER的半对数性能曲线图,直观展示系统在不同信噪比下的表现。
系统要求
- MATLAB R2016a 或更高版本
- 不需要额外的工具箱(代码通过基础数学运算实现,未依赖Communications Toolbox的高级封装函数,便于算法原理研究)。
使用方法
直接运行主脚本 main 即可启动仿真。程序将依次执行以下步骤:
- 初始化系统参数和网格图结构。
- 在设定的信噪比范围(0-7 dB)内进行循环仿真。
- 实时打印每个信噪比点下的BER、FER及已仿真帧数。
- 仿真结束后,弹出图形窗口显示性能曲线。
main.m 实现逻辑详解
主程序实现了完整的蒙特卡洛仿真流程,具体逻辑如下:
1. 参数配置与初始化
- 信道编码参数:设定每帧信息比特为100位,约束长度为7(记忆深度6),码率为1/3。
- 生成多项式:定义了八进制多项式 [133, 171, 165],并通过
init_trellis 函数将其转换为二进制系数,构建用于查表的网格图结构(即状态转移表和输出表)。 - 仿真控制:设定信噪比范围为0至7dB,为了保证统计结果的置信度,设置了“最小错误帧数(50帧)”和“最大仿真帧数(100,000帧)”的双重循环终止条件。
2. 仿真主循环
程序对每一个Eb/N0点进行独立仿真,核心步骤包括:
- 噪声功率计算:根据公式 $sigma = sqrt{1 / (2 cdot R cdot 10^{SNR_{dB}/10})}$ 计算BPSK调制下实数信道的噪声标准差。
- 信源生成:利用
randi 产生均匀分布的二进制随机序列。 - 信道编码:调用咬尾编码函数,利用网格结构将信息比特映射为编码比特。
- 调制:执行BPSK调制,将二进制0映射为+1,1映射为-1。
- AWGN信道:向发送信号叠加均值为0、方差为 $sigma^2$ 的高斯白噪声。
- 信道译码:调用WAVA解码算法,输入含噪接收信号和网格结构,经过主要设定的3次迭代后输出判决比特。
- 误码统计:对比原始比特与译码比特,累计误比特数和误帧数。
3. 下一代状态与输出计算逻辑
在初始化网格图时:
- 程序将八进制多项式转换为二进制数组,精确对应移位寄存器的抽头系数。
- 通过遍历所有可能的寄存器状态($2^6=64$种)和输入(0或1),预先计算出所有可能的“下一状态”和“编码输出”。
- 严格遵循3GPP定义的移位寄存器操作:输入位进入最低位(LSB),原状态左移(或根据具体实现定义的右移逻辑,代码中通过位运算实现状态迁移)。
4. 结果输出与绘图
- 控制台实时输出表格化的仿真进度数据。
- 使用
semilogy 绘制误比特率(BER)和误帧率(FER)随信噪比变化的对数曲线,包含网格线和图例,便于学术分析。
关键算法与函数说明
init_trellis (网格初始化)
此函数负责构建卷积码的网格图(Trellis)。它将八进制的生成多项式解析为二进制系数,并遍历所有$2^m$个状态。对于每一个状态和每一个可能的输入比特,计算出寄存器通过模2运算后的输出比特,以及寄存器移位后的下一个状态。这些预计算的查找表被用于后续的高速编码和译码。
tbcc_encode (咬尾编码)
*注意:代码片段显示了该函数的调用。*
该函数实现了咬尾机制的核心逻辑:不仅是进行卷积运算,更重要的是在编码开始前,根据数据末尾的$m$个比特来初始化移位寄存器的状态。这保证了编码器在处理完所有数据后,最终回到与起始相同的状态,形成了逻辑上的“环”。
wava_decode (WAVA译码)
*注意:代码片段显示了该函数的调用。*
这是系统的核心解码引擎。它并未采用标准的Viterbi算法(VA),而是采用了Wrap-Around Viterbi Algorithm。由于TBCC的起始状态和结束状态是未知的(但相等的),标准VA无法直接确定幸存路径的起点。WAVA通过将接收到的观察序列在逻辑上首尾相接,在网格图上进行多次循环迭代(本系统设置为3次)。随着迭代次数增加,各状态的路径度量值逐渐收敛,从而以极高的概率找到全局最优路径。它利用软输入(Soft Input)直接计算分支度量(Branch Metrics),相比硬判决译码有约2dB的性能增益。