# LDPC Kit **Repository Path**: sg-first/LDPC-code ## Basic Information - **Project Name**: LDPC Kit - **Description**: LDPC编译码 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 17 - **Forks**: 9 - **Created**: 2020-02-26 - **Last Updated**: 2025-05-07 ## Categories & Tags **Categories**: mathlibs **Tags**: None ## README LDPC Kit ========= 目录 ---------- 这个仓库是基于LDPC的NANDFlash控制器项目的一部分 * 本仓库为C++编写的有限域矩阵库和LDPC校验矩阵编码/检验库 * 基于LDPC的NANDFlash控制器接口实现在[这个仓库](https://gitee.com/sg-first/NANDFlash_IO) * 项目的完整文档已发表于OALib Preprint:Liu, T. , Yu, H. , Zhang, G. , Li, Y. , Zhou, M. , Zhang, Z. , Xin, X. , Liu, S. and Ren, J. (2021). Design of NAND Flash Controller Based on NB-LDPC ECC. Open Access Library PrePrints, 5, e293. doi: http://dx.doi.org/10.4236/oalib.preprints.1200293. 概述 --------- 最近几年,低密度奇偶校验码(Low Density Parity Check Codes,LDPC) 以相对较低的编解码复杂难度和良好的纠错性能受到广泛关注。在码长相同以及码率相同的情况下,有限域LDPC码的性能超越二进制LDPC码。本套件针对LDPC编译码硬件设计问题,完成了以下工作: * 基于纯C++的有限域计算与有限域矩阵运算库,可在不同阶数与本征多项式的有限域下进行运算,可自行生成乘法表 * 可以自动优化构造编码矩阵(校验矩阵)的生成器 * 对编码功能进行实现,可基于编码矩阵计算编码直接需要使用的中间矩阵,也可以对编码矩阵的正确性进行验证 生成编码矩阵 -------- ### 原理 构造数个`n×n`对角阵构成的小矩阵(对角元素随机),将其以每行`r`个,每列`c`个放置,构成大矩阵`H`。示意图如下: ![生成编码矩阵](生成编码矩阵.PNG) 我们的编码矩阵基于大矩阵的循环右移得到,即需循环进行如下步骤: * 随机选定`i`个小矩阵 * 对每个选定的小矩阵,随机循环右移`j`次(循环右移即为将矩阵中每个非零元素移动到右边相邻位置。如果该元素已经在最右,那么回到第一个位置) * 检查`H`的四环数量,如果是目前发现最少的,暂存这个矩阵 循环的停止条件视情况而定。在我们的实验中,`H`列数为256时,可以很快找到四环数为0的编码矩阵。因此停止条件设为四环数量为0。 ### 对应代码 头文件`genH.h`包含了生成编码矩阵需要用到的生成器类`HGenerator`。在使用前需要设置namespace `genH`中的参数来指定所要生成的编码矩阵尺寸。 参数包括: * 小矩阵尺寸`diagSize` * `H`中每列小矩阵个数`cNum` * `H`中每行小矩阵个数`rNum` 然后构造生成器对象,就可以开始生成编码矩阵。构造后的对象中,小矩阵对角元素均为1。这样初始化的原因是,有人认为先减少GF(2)矩阵的四环个数,再将对角元素随机替换为实际使用的GF(n)元素,效果会更好。这么做基于的考虑是,可能存在某些向GF(n)的某些替换无法使得编码矩阵达到最小的四环数量,因此可以基于优化后的GF(2)进行几种不同的随机替换分别进行优化,选择最好的。但在我们的实验中,`H`列数为256时,(我们所尝试的)所有替换都可以很快找到四环数为0的编码矩阵。因此直接进行向GF(n)的替换也是可以的,而且这样做会大大加快优化速度。 使用生成器进行编码矩阵生成的示例代码如下: ``` cpp HGenerator hg; hg.permutationGF(); //替换为GF(n)元素 uint usefulNum; for(int i=0;true;i++) { if(hg.moveDetection()) usefulNum=i; if(hg.tetracyclicNum==0) break; //直到四环为0跳出循环 } std::cout<<"usefulNum"<