欢迎光临散文网 会员登陆 & 注册

LDPC 低密度奇偶校验码的软判决译码(三)-算法和代码

2022-08-17 20:26 作者:乐吧的数学  | 我要投稿

(这是系列文章,见右侧目录,有列表)

这篇小文,把前两个文章讲的原理和算法,用 Octave/Matlab 代码写出来,我用 matlab2020a 调试的。GNU Octave 7.2.0 上也测试通过。

这个文档对应两个视频:

算法描述:  https://www.bilibili.com/video/BV1ae4y1y7cM/

代码讲解:https://www.bilibili.com/video/BV15t4y1j7gp/



后续的文章和视频中,用到了两个简写,我整理在这里:

q_%7Bmn%7D(x)%3Dp(c_n%3Dx%7C%5C%7Br_%7Bm'n%7D%3D0%2C%20m'%20%5Cin%20%5C%7B%20N(n)%20%5Csetminus%20%20m%20%5C%7D%20%20%20%5C%7D%2Cr)

r_%7Bmn%7D(x)%3Dp(z_m%3D0%7Cc_n%3Dx%2Cr)

其中 N(n) 表示比特 n 参与的那些校验方程, \m 表示集合减法,即不考虑校验方程 m,则N(n)\m 表示:”比特 n 参与的那些校验方程”   中去掉    “标号为m 校验方程”   后的校验方程



算法描述

---------------------------------------------------------------------------------------------------------------

输入: A, 信道的后验概率 p_n(x)%20%3D%20P(c_n%3Dx%7Cr_n), 以及最大的迭代次数 L

初始化: 对所有 A(m,n)=1 的 (m,n), 令 q_%7Bmn%7D(x)%20%3D%20p_n(x)%20

Horizontal Step:对每个A(m,n)=1 的 (m,n):

    计算  %5Cdelta%20q_%7Bml%7D%20%3D%20q_%7Bml%7D(0)-q_%7Bml%7D(1)
    计算

                                %5Cdelta%20r_%7Bmn%7D%20%3D%20%5Cprod_%7B%5C%7Bn'%5Cin%20N_%7Bm%2Cn%7D%5C%7D%7D%20%20%5Cdelta%20q_%7Bmn'%7D

    计算 r_%7Bmn%7D(1)%20%3D%20(1-%5Cdelta%20r_%7Bmn%7D)%2F2  和  r_%7Bmn%7D(0)%20%3D%20(1%2B%5Cdelta%20r_%7Bmn%7D)%2F2

Vertical Step:对每个A(m,n)=1 的 (m,n):

    计算
    
                    q_%7Bmn%7D(0)%20%3D%20%5Calpha_%7Bmn%7D%20p_n(0)%20%5Cprod_%7B%5C%7Bm'%5Cin%20M_%7Bn%2Cm%7D%20%5C%7D%7Dr_%7Bm'n%7D(0)
                       和

                    q_%7Bmn%7D(1)%20%3D%20%5Calpha_%7Bmn%7D%20p_n(1)%20%5Cprod_%7B%5C%7Bm'%5Cin%20M_%7Bn%2Cm%7D%20%5C%7D%7Dr_%7Bm'n%7D(1)%0A


        其中 %5Calpha_%7Bmn%7D  是使得 q_%7Bmn%7D(0)%2Bq_%7Bmn%7D(1)%3D1 成立的值

     计算 准后验概率(pseudo-posterior):

        q_n(0)%20%3D%20%5Calpha_n%20p_n(0)%20%5Cprod_%7B%5C%7Bm'%5Cin%20M_n%20%5C%7D%7Dr_%7Bm'n%7D(0)
              和

        q_n(1)%20%3D%20%5Calpha_n%20p_n(1)%20%5Cprod_%7B%5C%7Bm'%5Cin%20M_n%20%5C%7D%7Dr_%7Bm'n%7D(1)


        其中 %5Calpha_n  是使得 q_n(0)%2Bq_n(1)%3D1 成立的值
        做一次临时判决:若 q_n(1)%20%3E%200.5%5Chat%20c_n%3D1, 否则 %5Chat%20c_n%3D0
        如果满足 A%20%5Cmathbf%20%7B%5Chat%20c%7D%20%3D%200, 则 停止. 否则,如果 迭代次数 < L,循环至  Horizontal Step,否则,宣布译码失败并停止.

---------------------------------------------------------------------------------------------------------------



下面的 Octave/Matlab 程序,还是使用前面文章中的校验矩阵:

A%20%3D%20%5Cbegin%7Bbmatrix%7D%0A%20%201%26%201%20%26%201%20%26%200%20%26%200%20%26%201%20%26%201%20%26%200%20%26%200%20%26%201%5C%5C%0A%20%201%26%200%20%26%201%20%26%200%20%26%201%20%26%201%20%26%200%20%26%201%20%26%201%20%26%200%5C%5C%0A%20%200%26%200%20%26%201%20%26%201%20%26%201%20%26%200%20%26%201%20%26%200%20%26%201%20%26%201%5C%5C%0A%20%200%26%201%20%26%200%20%26%201%20%26%201%20%26%201%20%26%200%20%26%201%20%26%200%20%26%201%5C%5C%0A%20%201%26%201%20%26%200%20%26%201%20%26%200%20%26%200%20%26%201%20%26%201%20%26%201%20%26%200%0A%5Cend%7Bbmatrix%7D


发送的原始信息 %20m%3D%5B1%5Cquad%200%5Cquad1%5Cquad0%5Cquad1%5D%5ET, 经过 LDPC 编码之后(这里先略过如何编码的):

c%3D%5B0%20%5Cquad%200%5Cquad%200%5Cquad1%5Cquad0%5Cquad1%5Cquad0%5Cquad1%5Cquad0%5Cquad1%5D%5ET


经过一定的高斯信道,我们可以得到如下后验概率:

%20P(%20%5Cmathbf%20c%3D1%7C%5Cmathbf%20r)%20%3D%20%5B0.22%20%5Cquad%200.16%20%5Cquad%200.19%20%5Cquad%200.48%20%5Cquad%200.55%20%5Cquad0.87%20%5Cquad0.18%20%5Cquad0.79%20%5Cquad0.25%20%5Cquad%200.76%5D%5ET


如果用大于 0.5 为 1  做判决,则硬判决得到的结果为:

%5Cmathbf%20%7B%5Chat%20c%7D%20%3D%20%5B0%20%5Cquad%200%5Cquad%200%5Cquad%20%5Cunderline0%5Cquad%20%5Cunderline%201%5Cquad%201%5Cquad%200%5Cquad%201%5Cquad%200%5Cquad%201%5D


两个画底线的数字是错误的,

A%5Cmathbf%7B%5Chat%20c%7D%20%3D%20%5B0%20%5Cquad%201%20%5Cquad0%5Cquad0%5Cquad1%5D%5ET


则意味着有两个校验方程是没有成立的,出错了!



下面是 Octave/Matlab 代码:

版权声明:此代码取自[1] 配套的代码,稍作修改。



[1] Error Correction Coding--Mathematical Methods and Algorithms , Todd K. Moon, Wiley, 2005

LDPC 低密度奇偶校验码的软判决译码(三)-算法和代码的评论 (共 条)

分享到微博请遵守国家法律