2-LDPC实验基本参照的网上的程序来的,而且实验公式有些是在二进制情况下进行了公式化简,当推到多进制时候便不再适用,鉴于个人编程和理解能力有限,唉,只是在LDPC编译码的基础公式上进行了实现。
1.编码
q-LDPC编码部分主要可以分为3步:生成q-H矩阵、矩阵分解、编码;
关于生成矩阵方面,自然可以沿用二进制的方法,我这里采用的是规则(3,6)矩阵,关于非零元素的替代由于尚未弄明白边缘熵最大化的问题,所以就随机替换为GF(q)域的非零值;
编码采用文献中提到的改进LU编码,而这要保证B矩阵的满秩条件,因此,需要自己编写的就是B矩阵的调整。由于是多进制,为了保证所有非零元素为正整数,先对B矩阵中对角线上进行了调整,将该列最大的数放在对角线位置上,然后寻找该列其他位置非零值与对角线上值得最小公倍数,将B矩阵化为对角阵,完成这步后,可以检查下B是否为满秩,如果不满秩,那么就需要对A、B矩阵进行列交换来保证B满秩,在列交换的算法中,偶选择构造了解集的矩阵,对每个需要进行列交换的B的列找出在A中可以交换的所有列集组成矩阵,之后对每个解——即A中的备选列,求出度数,这里的度数就是B中有几个列可以和A中的某列交换,之后先交换只有一个解的列,然后按列的度数来取解,当然,这种方法还是存在很大的随机性,因此不能保证每次运行完都是合适的B,需要改进啊......增加复杂度......还有一点,由于H矩阵的初等运算都是mod(q)运算,很可能经过一系列的运算即是对角变换中,B的秩减小;
编码自然不用说,有统一的公式了。
2.译码
关于译码,无非就是初始化、校验节点的更新和变量节点的更新,以及最后的判决;
说初始化,不得不提一下,多进制的LDPC系统全套信息流,至少在现在我的理解中是二进制信号——转为多进制信号——LDPC编码——转为二进制信号——信道——LDPC译码——转为二进制信号——误码判断,在这套系统中,译码的初始化依然需要判断每位的0-1概率,但需要将每位判断出来的概率按照q进制进行计算,得到GF(q)域上每个值取值的概率,那么从信道出来的二进制序列到多进制的转化过程就包含在了译码的初始化中,这块需要在二进制的基础上进行添加;
校验节点更新,个人认为,校验节点更新的理解要比变量节点更新复杂,而且在实现上也确实复杂了不少,按照基础的公式,校验节点的更新编程复杂度为O(q^(rowflag-1)),这里rowflag为行重,要求出当某点为GF(q)上每个值得时候,其他非零变量取值使得该m齐次方程成立的所有解集,在二进制的情况下,解集的数量并不大,毕竟只有0-1两种可能,但转到多进制,取值的可能变大了,计算又是模q计算,可能在第m个校验点,某变量的某一个取值就有上万个解,不得不说,这块的运行速度实在堪忧......但在查看的文献中,虽然都是对译码的改进,但其改进都不是在这块......
当上面校验节点更新结束,剩下的就可以跟着二进制的走了,并无难度。
3.实验结果
现在误码率倒是感觉可以,不过由于运行时间可以说成指数增长,就像2进制需要3s,4进制需要50s,8进制需要200s,差不多类似这种吧,16进制的一直没有勇气把它运行完......