基于MATLAB的LDPC码BP置信传播译码算法仿真系统
项目简介
本项目是一个基于MATLAB平台开发的通信链路仿真系统,专注于低密度奇偶校验码(LDPC)的编译码性能评估。系统实现了从码字构造、信源编码、BPSK调制、AWGN信道传输到基于对数域置信传播(Log-SPA)译码的完整流程。通过蒙特卡洛(Monte Carlo)方法,系统能够在不同信噪比(Eb/N0)条件下自动化测试并统计误码率(BER)和误帧率(FER),是研究信道编码理论、验证译码算法收敛性及纠错性能的有效工具。
功能特性
- 正则LDPC码构造:支持自定义码长和行列权重,使用Gallager构造法生成稀疏校验矩阵H。
- 生成矩阵自动推导:通过GF(2)域的高斯消元法将校验矩阵H转换为系统形式,并自动求解生成矩阵G,内置列变换机制以解决矩阵奇异问题。
- 完整通信链路仿真:包含随机信源生成、LDPC编码、BPSK调制、加性高斯白噪声(AWGN)信道模拟。
- 高性能BP译码器:实现了对数域的和积算法(Log-Domain Sum-Product Algorithm),利用稀疏矩阵特性进行消息传递。
- 统计与可视化:自动扫描SNR范围,动态统计BER、FER及平均迭代次数,并生成双图表进行性能展示。
- 数值保护机制:在译码迭代运算中加入了阈值限制,防止浮点数溢出或无穷大值的产生。
系统要求
- MATLAB R2016a 或更高版本(代码未依赖特定工具箱的特殊函数,基础版本即可运行)。
使用方法
- 直接在MATLAB环境中运行主脚本。
- 程序将自动初始化参数(默认码长N=200,信息位K=100)。
- 控制台将实时输出当前信噪比(Eb/N0)下的仿真进度、误码率、误帧率及平均迭代次数。
- 仿真结束后,系统将自动绘制两幅图表:一幅展示BER和FER随SNR变化的曲线,另一幅展示平均迭代次数的收敛情况。
代码实现逻辑详解
本项目的核心逻辑封装在主流程与三个关键子函数中,具体实现细节如下:
1. 参数配置与初始化
系统首先定义了LDPC码的关键参数,包括码长(N=200)、列重(wc=3)和行重(wr=6)。仿真参数设定了0dB至4dB的信噪比扫描范围,并配置了最大仿真帧数(1000帧)和最少误码数(50个)作为蒙特卡洛仿真的停止准则。
2. 核心算法实现细节
#### LDPC码构造 (construct_regular_H)
代码采用简化的Gallager构造法生成正则校验矩阵H。
- 根据给定的码长和行列重计算校验方程数M。
- 首先构造基础子矩阵,然后通过垂直堆叠子矩阵的方式形成H。
- 第一层子矩阵按顺序排列,后续层通过随机列置换(randperm)来保证矩阵的稀疏性和随机性,从而避免短环的出现。
#### 生成矩阵求解 (create_generator_matrix)
为了进行编码,代码实现了从校验矩阵H求取生成矩阵G的逻辑:
- 高斯消元:主要目标是将H矩阵转换为 $[P^T | I]$ 的系统形式。
- 列变换处理:在消元过程中,如果发现对角线元素为0(即矩阵在该位置不满秩),算法会自动搜索后续列并进行列交换,以确保能成功构造单位阵。
- 生成G矩阵:基于 $H_{sys} = [P^T | I]$ 的关系,推导出生成矩阵 $G = [I | P]$。
#### 译码算法 (ldpc_bp_decode)
译码模块实现了核心的置信传播算法(BP),具体采用对数域和积算法(Log-SPA):
- 初始化:接收信道的对数似然比(LLR)作为变量节点的初始内部信息。
- 稀疏存储:利用MATLAB的索引查找功能(find函数)定位H矩阵中的非零元素,仅在连接的节点间传递消息。
- 校验节点更新(水平步):
* 计算公式涉及双曲正切(tanh)和反双曲正切(atanh)。
*
数值稳定性:为了防止
atanh(1) 导致无穷大或NaN,代码在计算
tanh 乘积前后进行了数值截断(限制在 ±0.999999 范围内)。
* 逻辑:对于每个校验节点,计算连接到它的所有变量节点信息的乘积,再除以目标变量节点的贡献,得到外信息。
- 变量节点更新与判决:虽然代码片段在校验更新处截断,但整体结构表明利用了标准的BP迭代逻辑,并在达到最大迭代次数或满足校验方程时输出译码结果。
3. 主仿真循环 (Main Loop)
- 信噪比计算:根据给定的Eb/N0和码率R,精确计算AWGN信道的噪声标准差 $sigma$。
- 编码与调制:生成随机的0/1比特流,通过 $c = u times G$完成编码,随后进行BPSK调制(0映射为+1,1映射为-1)。
- 信道模拟:在发送信号上叠加高斯白噪声。
- 统计:在接收端,比较译码后的信息位与原始发送信息位。代码特别处理了由
create_generator_matrix 引入的列交换,确保比较的是正确的信息位位置。统计总误比特数和误帧数,实时计算BER和FER。
4. 数据可视化
仿真完成后,代码利用MATLAB绘图功能生成两个图形窗口:
- 误码性能图:双对数坐标轴显示,包含BER vs Eb/N0 和 FER vs Eb/N0 两条曲线。
- 迭代次数图:线性坐标轴显示,展示在不同信噪比下译码器成功译码所需的平均迭代次数,用于分析算法的收敛速度。