基于MATLAB的LDPC编译码及误码率仿真系统
项目介绍
本项目构建了一个完整的低密度奇偶校验码(LDPC)通信链路仿真平台。系统基于MATLAB开发,涵盖了从信道编码构造、调制传输、信道噪声叠加到接收端迭代译码的全过程。该平台主要用于评估规则LDPC码在加性高斯白噪声(AWGN)信道下的纠错性能,支持通过蒙特卡洛仿真通过对比不同译码算法(Log-BP与Min-Sum)在不同信噪比下的误码率(BER)和误帧率(FER)。
功能特性
- 规则LDPC码构造:支持生成指定码长、列重和行重的规则校验矩阵H,采用随机置换算法以保证稀疏性。
- 生成矩阵自动推导:通过高斯消元法将校验矩阵H转化为系统形式,并自动求解对应的生成矩阵G,支持列变换记录以确保编码正确性。
- 链路仿真:实现了BPSK调制与AWGN信道模型,能够根据设定的$E_b/N_0$自动计算噪声方差。
- 双算法对比:内置两种主流迭代译码算法——对数域置信传播算法(Log-BP)和最小和算法(Min-Sum),在同一仿真条件下并行运行以对比性能。
- 性能可视化:自动统计误比特数与误帧数,计算BER与FER,并绘制双对数坐标下的性能曲线对比图。
系统要求
- MATLAB R2016a 或更高版本
- 通信工具箱(Communications Toolbox)- 可选,本项目核心算法主要基于基础矩阵运算实现。
使用方法
直接运行主函数即可启动仿真。程序将按照预设参数自动执行以下流程:
- 初始化仿真参数(码长、权重、SNR范围等)。
- 尝试构造有效的校验矩阵H和生成矩阵G。
- 对设定范围内的每个SNR点进行蒙特卡洛仿真。
- 实时在控制台输出仿真进度及误码统计。
- 仿真结束后弹出图形窗口展示BER和FER曲线。
代码实现逻辑详解
本项目的核心逻辑通过主程序串联各个功能模块实现,具体流程如下:
1. 参数配置
系统首先定义了关键的LDPC码参数,默认设置为:
- 码长 N:256
- 列重 wc:3
- 行重 wr:6
- 码率:约为0.5(取决于矩阵秩)
- 仿真控制:设定最大迭代次数(20次),并设置了每个SNR点的最小错误帧数和最小帧数阈值,以保证统计结果的置信度。
2. 码字构造模块
程序包含动态构造LDPC码的核心机制:
- 校验矩阵 H 生成:采用“列填充+行随机置换”的方式。首先构建满足列重约束的基础索引,然后通过随机打乱行索引来满足行重约束,生成的矩阵为稀疏矩阵。
- 生成矩阵 G 求解:为了进行编码,程序尝试将 H 矩阵转换为系统形式 $[P | I]$。这一过程通过高斯消元实现,期间涉及列交换操作。程序会记录列交换的索引顺序(
P_indices),用于后续在编码完成后将比特流恢复到原始 H 矩阵定义的顺序。如果生成的 H 无法转换为有效的系统形式,程序会进行有限次重试。
3. 数据结构预处理
为了加速迭代译码过程,程序在进入仿真循环前对 H 矩阵进行了预处理。将稀疏矩阵转换为邻接表形式:
- vn_edges:存储每个变量节点相连的校验节点索引。
- cn_edges:存储每个校验节点相连的变量节点索引。
这种结构避免了在译码迭代中反复遍历稀疏矩阵,显著提高了仿真速度。
4. 蒙特卡洛仿真循环
主循环遍历设定的SNR范围(0-6 dB),内部进行帧传输仿真:
- 信源产生:生成长度为 $K$ 的随机二进制信息序列 $u$。
- 编码:利用生成矩阵计算 $c_{sys} = u times G mod 2$。由于 G 是基于列交换后的 H 计算的,得到的码字顺序与原始 H 不匹配,因此程序根据
P_indices 对编码后的比特进行重排,得到最终的发送码字 $c$。 - 调制于信道:执行BPSK调制($0 to +1, 1 to -1$),并根据当前的信噪比计算噪声标准差 $sigma$,叠加高斯白噪声。
- 译码输入计算:接收端计算初始对数似然比(LLR),公式为 $2y/sigma^2$。
5. 迭代译码与判决
针对同一接收信号,系统分别调用两种算法进行处理:
- Log-BP 算法:执行标准的对数域和积算法,进行软信息迭代更新。
- Min-Sum 算法:作为BP算法的近似,通过寻找最小值来简化校验节点的更新计算,降低复杂度。
6. 统计与绘图
- 误码统计:在每次帧仿真结束后,对比译码输出 $hat{c}$ 与发送码字 $c$。程序分别统计两种算法下的误比特数和误帧数。
- 动态终止:当累积的错误帧数达到预设阈值(如10帧)且仿真帧数达到下限时,当前SNR点的仿真提前结束,进入下一个信噪比测试。
- 结果展示:仿真全部结束后,利用
semilogy 函数绘制 Log-BP 和 Min-Sum 两种算法的 BER 和 FER 性能对比曲线。
关键算法实现细节
construct_regular_H
该函数主要负责构造规则LDPC矩阵。通过创建一个包含 $N times w_c$ 个元素的索引池,保证每一列严格包含 $w_c$ 个1。随后通过随机排列行索引池,使得每一行近似包含 $w_r$ 个1,并利用
sparse 函数生成矩阵。使用了
spones 来消除可能产生的重复边。
construct_G_from_H
该函数实现了二进制域下的高斯消元。其核心在于寻找主元并将 H 矩阵变换为右侧是单位阵的形式。关键细节在于处理列交换:当对角线位置元素为0时,算法会在左侧列中寻找1并交换列位置。记录这些交换操作对于保证编码产生的码字真正满足 $H cdot c^T = 0$ 至关重要。
译码器接口
译码函数(
decode_LDPC_BP 和
decode_LDPC_MinSum)设计为输入接收LLR值和包含图结构的
CodeStruct,输出硬判决比特流。这种模块化设计使得比较不同译码策略变得非常直接。