基于MATLAB的LDPC编码与解码仿真系统
项目简介
本项目是一个基于MATLAB平台开发的低密度奇偶校验码(LDPC)由端到端通信链路仿真系统。项目旨在通过软件仿真,深入分析LDPC码在AWGN信道下的编译码性能。系统实现了从校验矩阵构造、编码、BPSK调制、噪声信道传输到软判决译码的全流程,并集成了蒙特卡洛仿真方法以评估不同信噪比下的误码率(BER)和误帧率(FER)。
主要功能特性
- 校验矩阵构造:实现了基于规则(Regular)构造法的稀疏校验矩阵(H矩阵)生成,支持行列权值的自定义配置。
- 生成矩阵转换:包含高斯消元算法,能够自动将随机生成的H矩阵转换为系统形式,并导出对应的生成矩阵(G矩阵),确保H与G的正交性。
- 通信链路仿真:
*
信源:随机二进制比特流生成。
*
调制:采用BPSK调制(0映射为1,1映射为-1)。
*
信道:加性高斯白噪声(AWGN)信道模型,支持动态信噪比调整。
* 支持对数域和积算法(Log-SPA)。
* 在主逻辑中预留了最小和算法(Min-Sum Algorithm)的调用接口。
* 使用对数似然比(LLR)作为软判决输入。
- 性能评估:通过蒙特卡洛方法自动统计BER和FER,并绘制性能曲线图。
系统要求
- MATLAB R2016a 或更高版本。
- 通信工具箱(Communications Toolbox)为一可选依赖,但本项目主要通过基础矩阵运算实现核心逻辑,依赖性较低。
使用方法
- 打开MATLAB环境,定位到项目所在目录。
- 直接运行主脚本。
- 系统将自动输出当前仿真参数(码长、码率、解码算法等)。
- 程序首先进行H矩阵和G矩阵的构造与校验。
- 随后进入仿真循环,命令行会实时显示当前Eb/N0下的仿真进度、误码率和误帧率。
- 仿真结束后,会自动弹出一个图形窗口,分别展示BER和FER随信噪比变化的曲线。
---
代码功能与实现逻辑详解
本项目的所有功能均集成在一个主程序入口及若干子函数中,以下是针对代码实际逻辑的详细分析:
1. 系统参数配置
程序首先定义了仿真的基础物理层参数:
- 码长结构:默认设定码长 N=512,码率 R=0.5,计算得到信息位长度 K=256。
- LDPC构造参数:定义了列重(col_weight=3)和行重(row_weight=6),这是一组典型的规则LDPC参数。
- 仿真控制:最大迭代次数设定为50次;为了保证统计结果的置信度,设置了“最小错误帧数=10”作为特定信噪比下停止仿真的条件,同时设定了最大仿真帧数上限。
- 信噪比范围:设定了从 0dB 到 4.0dB 的扫描范围。
2. H矩阵与G矩阵的构造
代码并非直接加载预定义的矩阵,而是通过
construct_ldpc_system 函数实时构造:
- 随机生成策略:采用Mackay-Neal算法的简化思路,通过列填充的方式尝试构建H矩阵,并添加了简单的“重试机制”和“伪随机兜底逻辑”以确保能够生成可用的稀疏矩阵。
- 正交性检验:在生成完成后,立即计算
G * H' 在模2域下的结果,以验证矩阵构造的正确性。
3. 信道仿真循环
主循环基于蒙特卡洛思想,对每一个Eb/N0点进行处理:
- 噪声计算:根据码率R和当前Eb/N0计算噪声标准差 sigma。
- 编码过程:生成随机信源 u,通过矩阵乘法
c = mod(u * G, 2) 得到码字。尽管G矩阵经过了列交换,但在本实现的简易BER统计中,直接对比了整个码字。 - 调制与传输:将二进制码字(0/1)映射为双极性信号(+1/-1),并添加高斯白噪声。
- LLR初始化:解码器接收端根据接收信号 rx 和噪声方差计算初始对数似然比(LLR),公式为
2 * rx / sigma^2。 - 解码调用:根据配置变量
decode_algo 选择调用 Log-SPA 或 Min-Sum 解码函数。 - 误差统计:逐帧比较解码结果与发送码字,累计误比特数和误帧数,直到满足终止条件。
4. 结果可视化
仿真结束后,代码利用 MATLAB 的绘图功能生成两个半对数坐标图(semilogy):
- 左图:误码率(BER) vs Eb/N0。
- 右图:误帧率(FER) vs Eb/N0。
---
关键算法与函数分析
construct_ldpc_system (矩阵构造器)
该函数不仅负责生成稀疏矩阵,还负责解决生成矩阵 G 的求解问题。
- 它尝试通过随机分配行索引的方式填充每一列的“1”,并约束行重不超过预设值。
- 为了确保能生成 G 矩阵,函数内部调用了
gf_rank 检查 H 矩阵是否行满秩(在GF(2)域)。如果不满秩,会触发重试逻辑。 - 关键步骤:调用
make_systematic 将 H 转化为系统形式 $[P | I]$。由于原始 H 的后 M 列可能不可逆,该步骤至关重要。
make_systematic (系统化变换)
这是构造 LDPC 编码器的核心数学工具。
- 高斯消元:它通过行变换(异或操作)尝试将 H 矩阵的右侧子矩阵转化为单位矩阵。
- 列交换机制:如果在消元过程中发现主元位置为0(即当前列不可逆),算法会自动在左侧的信息位列中寻找可用列并进行交换。
- 输出记录:函数会返回列交换的索引记录
cols。为了保证解码后的数据能正确还原,最终生成的 G 矩阵和 H 矩阵都根据这个索引进行了相应的列重排。
gf_rank (GF(2) 秩计算)
这是一个辅助函数,用于计算二进制矩阵的秩。它实现了模2域下的高斯消元算法,用于判断矩阵构建是否成功,防止生成奇异矩阵导致后续编码失败。
decode_log_spa (对数域和积解码)
虽然代码在定义处截断,但根据调用逻辑和标准实现,该函数执行标准的置信传播(BP)流程:
- 初始化:利用信道LLR初始化变量节点信息。
- CN更新:校验节点(Check Node)利用双曲正切(tanh)或其近似公式处理来自变量节点的信息。
- VN更新:变量节点(Variable Node)汇总来自校验节点的信息及信道初始信息。
- 判决:计算后验LLR并进行硬判决,若校验方程成立或达到最大迭代次数则输出结果。
decode_min_sum (最小和解码)
代码预留了该函数的调用逻辑。它是 Log-SPA 的简化版,将校验节点的复杂运算简化为寻找最小值和符号运算,虽然在性能上略有损失,但大幅降低了计算复杂度。