LDPC 低密度奇偶校验码的软判决译码(三)-算法和代码
(这是系列文章,见右侧目录,有列表)
这篇小文,把前两个文章讲的原理和算法,用 Octave/Matlab 代码写出来,我用 matlab2020a 调试的。GNU Octave 7.2.0 上也测试通过。
这个文档对应两个视频:
算法描述: https://www.bilibili.com/video/BV1ae4y1y7cM/
代码讲解:https://www.bilibili.com/video/BV15t4y1j7gp/
后续的文章和视频中,用到了两个简写,我整理在这里:
其中 N(n) 表示比特 n 参与的那些校验方程, \m 表示集合减法,即不考虑校验方程 m,则N(n)\m 表示:”比特 n 参与的那些校验方程” 中去掉 “标号为m 校验方程” 后的校验方程
算法描述:
---------------------------------------------------------------------------------------------------------------
输入: A, 信道的后验概率 , 以及最大的迭代次数 L
初始化: 对所有 A(m,n)=1 的 (m,n), 令
Horizontal Step:对每个A(m,n)=1 的 (m,n):
计算
计算
计算 和
Vertical Step:对每个A(m,n)=1 的 (m,n):
计算
和
其中 是使得
成立的值
计算 准后验概率(pseudo-posterior):
和
其中 是使得
成立的值
做一次临时判决:若 则
, 否则
如果满足 , 则 停止. 否则,如果 迭代次数 < L,循环至 Horizontal Step,否则,宣布译码失败并停止.
---------------------------------------------------------------------------------------------------------------
下面的 Octave/Matlab 程序,还是使用前面文章中的校验矩阵:
发送的原始信息 , 经过 LDPC 编码之后(这里先略过如何编码的):
经过一定的高斯信道,我们可以得到如下后验概率:
如果用大于 0.5 为 1 做判决,则硬判决得到的结果为:
两个画底线的数字是错误的,
则意味着有两个校验方程是没有成立的,出错了!
下面是 Octave/Matlab 代码:
版权声明:此代码取自[1] 配套的代码,稍作修改。
[1] Error Correction Coding--Mathematical Methods and Algorithms , Todd K. Moon, Wiley, 2005