基于S-function机制的(2,1,7)卷积码维特比译码器仿真
项目介绍
本项目实现了一个基于MATLAB的(2,1,7)卷积码通信链路仿真系统。其核心在于模拟了Simulink S-function(系统函数)的运行机制,通过脚本化的方式实现了维特比(Viterbi)译码器的底层算法内核。项目采用标准的CCSDS/NASA卷积码参数(约束长度K=7,码率R=1/2),并构建了包含信源产生、卷积编码、BPSK调制、AWGN信道传输、硬判决及维特比译码的完整通信链路。
该仿真旨在验证译码器算法逻辑在S-function架构下的正确性,实现了加-比-选(ACS)和回溯(Traceback)等核心步骤,并提供了详细的误码率(BER)统计与可视化分析功能。
功能特性
- 标准(2,1,7)卷积码配置:采用生成多项式 (171, 133)₈,约束长度7,码率1/2。
- S-function架构模拟:主程序结构模仿了S-function的初始化、时间步进、输出计算与状态更新流程。
- 高效维特比译码核心:
*
BMU (分支度量单元):基于硬判决输入的汉明距离计算。
*
ACS (加-比-选单元):利用预计算网格图(Trellis LUT)进行高效的状态度量更新与路径选择,包含度量归一化逻辑以防止数值溢出。
*
Traceback (回溯单元):实现了基于滑动窗口的回溯算法,用于从幸存路径中恢复原始信息位。
- 通信链路仿真:集成了BPSK调制与AWGN(加性高斯白噪声)信道模型。
- 可视化评估:提供接收信号直方图、发送/译码比特对比图以及误码位置分布图。
系统要求
- MATLAB R2016b 或更高版本
- Signal Processing Toolbox(推荐,用于部分基础信号处理,非必须核心算法依赖)
- Communications Toolbox(推荐,用于对比验证,非必须核心算法依赖)
算法实现细节与逻辑分析
本项目的主逻辑完全在脚本中实现,并未调用MATLAB内置的vitdec函数,而是从底层编写了算法逻辑。以下是代码的具体实现分析:
1. 系统初始化与参数配置
- 定义了仿真参数:信噪比(SNR = 4dB)、回溯深度(35,即5倍约束长度)、码率和生成多项式。
- 网格图预计算:构建了查找表(LUT),包含状态转移关系(NextState/PreState)和预期输出,用于加速后续的ACS操作。
- 状态寄存器初始化:模拟S-function的
DWork向量,初始化路径度量(状态0为0,其余为无穷大)和回溯内存。
2. 信号生成与信道传输
- 生成随机二进制序列作为信源。
- 执行(2,1,7)卷积编码。
- 进行BPSK调制(0映射为1,1映射为-1)并叠加高斯白噪声。
- 硬判决:接收端根据零门限对信号进行二值化处理,生成供译码器使用的二进制输入流。
3. S-Function 核心模拟循环
主程序通过循环模拟Simulink的时间步进机制,每次处理一组接收符号(2 bit):
- 输入获取:从接收数据流中分片提取当前时刻的符号对。
- 算法步进:调用核心函数模拟
mdlOutputs和mdlUpdate过程。 - 数据流重组:收集译码输出,并剔除因回溯深度导致的初始延迟数据。
4. 维特比算法核心逻辑 (Helper Function)
该部分实现了译码器的具体的数学运算:
* 根据当前输入的硬判决符号对,利用查表法计算其与所有可能状态转移输出之间的汉明距离。
* 距离表针对硬判决优化,仅包含0, 1, 2三种距离值。
* 由于使用了预计算的
PreState(前驱状态)表,算法遍历所有目的状态,查找其两个可能的前驱状态。
*
Add:将前驱状态的累积路径度量与当前分支度量相加。
*
Compare & Select:比较两条路径的度量值,保留较小者作为当前状态的新度量,并记录幸存路径对应的输入比特。
*
归一化:每步结束后减去最小度量值,防止路径度量随时间累积导致计算机浮点数溢出。
* 更新回溯内存(记录历史幸存路径)。
* 寻找当前时刻具有最小路径度量的状态作为最佳路径终点。
* 从该终点向后回溯
tbDepth步,利用网格图的逆向关系恢复原始发送比特。
5. 结果处理与可视化
- BER计算:截取有效数据段(去除头部的回溯延迟)与原始发送数据比对,计算误码数和误码率。
- 图形展示:
*
接收信号直方图:展示AWGN信道下的信号分布及判决门限。
*
比特对比图:直观展示发送序列与译码序列的吻合情况(主要展示前100位)。
*
误码分布图:使用Stem图标记出错的具体位置,便于分析错误的突发性或随机性。
使用方法
- 确保MATLAB路径中包含主脚本及所需的辅助函数(如编码器和Trellis构建函数)。
- 直接运行主脚本(通常命名为
main.m)。 - 脚本将自动执行以下流程:
* 打印参数配置。
* 进行编码与信道仿真。
* 进入S-function模拟循环进行逐比特译码。
* 在命令行窗口输出误码率统计结果。
* 弹出图形窗口展示仿真波形与分析图表。
注意事项
- 代码中实现了硬判决逻辑,如果需要软判决,需修改BMU部分的距离计算方式(改为欧氏距离)及输入数据类型。
- 回溯深度(Traceback Depth)设置为35,这是权衡译码性能与延迟的标准设置。
- 译码输出存在固有的处理延迟(等于回溯深度),在计算BER时代码已自动对齐数据。