LDPC编译码
LDPC码是根据低密度稀疏校验矩阵H来构造的。假设需要发送一组信息T{t_1,t_2,⋯,t_n},在发送前先使用生成矩阵G做线性变换,得到发送码字S=GTT,而校验矩阵H与生成矩阵G满足的关系为HGT=0,可以看到发送的码字是一组线性校验方程的解。
根据H构造不同,分成了LDPC规则码和LDPC不规则码。直观地说,稀疏矩阵每行每列1的个数固定的LDPC码称为LDPC规则码。稀疏矩阵每行每列1的个数或者行和列的重量不固定的LDPC码称为LDPC不规则码。
根据LDPC的码元是否为二进制,分成了二元LDPC码和高阶域LDPC码。高阶域LDPC码定义在GF(q)上,其中q= 2m。
LDPC编码
5G协议如下进行LDPC编码过程。
step1: 将输入比特按照码块长度K_cb进行分割,分割成多于1个的码块的时候,需要给每个码块加上CRC校验码。以此确定所需编码的最小长度。
step2: 确定每个码块的长度K,在确定过程中找到大于等于比编码所需最小长度的分组长度Z_c,将原始比特填入这些分组中,根据Graph不同,分组数取值是不同的,多余的部分则填上NULL。如下图所示。
step3:对每个长度为K的码块进行LDPC编码,得到长度为N的编码后码块。对于Graph=1的情况,该码块长度为66Z_c,对于Graph=2的情况,该码块长度为50Z_c。以Graph=1的情况来说明编码过程。
首先,编码后码块的组成,如下图,编码后的LDPC码分为两部分,前半部分为系统码,后半部分为LDPC校验码,此部分根据协议给定的H,根据H[c w]T=0的关系,计算得到w作为校验比特。
接下来说说如何根据协议给出的H来计算w的问题。协议给出的HBG具有近似下三角的结构,如下图,以下数字的单位都是Z_c,不再赘述。
根据H[c w]T=0以及上述矩阵结构,可以将w写成[p1 p2]两部分组成。其中p1的长度为4,p2的长度为42。那么式子H[s w]T=0可改写成,此处为便于区分用s指代以上的c。
[
A
B
0
C
D
I
]
[
s
p
1
p
2
]
=
0
\left[ \begin{matrix} A&B&0 \\ C&D&I \end{matrix} \right] \left[ \begin{matrix} s\\ p_{1}\\ p_{2} \end{matrix} \right]=0
[ACBD0I]⎣⎡sp1p2⎦⎤=0
可求得p1和p2的结果如下:
p
1
=
B
−
1
A
s
p
2
=
C
s
+
D
p
1
p_{1}=B^{-1}As\\ p_{2}=Cs+Dp_{1}
p1=B−1Asp2=Cs+Dp1
那么问题的关键是如何计算B-1。协议中Graph=1的情况下,B矩阵的形式如下:
B
=
[
1
0
X
X
0
0
0
X
X
X
0
0
1
X
X
0
]
B=\left[ \begin{matrix} 1&0&X&X \\ 0&0&0&X \\ X&X&0&0 \\ 1&X&X&0 \end{matrix} \right]
B=⎣⎢⎢⎡10X100XXX00XXX00⎦⎥⎥⎤
以上1表示对单位阵循环右移,0表示单位阵,X表示全0阵,那么根据逆矩阵的定义即可求得B-1,如下式:
[
1
0
X
X
0
0
0
X
X
X
0
0
1
X
X
0
]
[
x
1
x
2
x
3
x
4
x
5
x
6
x
7
x
8
x
9
x
10
x
11
x
12
x
13
x
14
x
15
x
16
]
=
[
I
X
X
X
X
I
X
X
X
X
I
X
X
X
X
I
]
\left[ \begin{matrix} 1&0&X&X \\ 0&0&0&X \\ X&X&0&0 \\ 1&X&X&0 \end{matrix} \right] \left[ \begin{matrix} x_{1}&x_{2}&x_{3}&x_{4} \\ x_{5}&x_{6}&x_{7}&x_{8} \\ x_{9}&x_{10}&x_{11}&x_{12} \\ x_{13}&x_{14}&x_{15}&x_{16} \end{matrix} \right]= \left[ \begin{matrix} I&X&X&X \\ X&I&X&X \\ X&X&I&X \\ X&X&X&I \end{matrix} \right]
⎣⎢⎢⎡10X100XXX00XXX00⎦⎥⎥⎤⎣⎢⎢⎡x1x5x9x13x2x6x10x14x3x7x11x15x4x8x12x16⎦⎥⎥⎤=⎣⎢⎢⎡IXXXXIXXXXIXXXXI⎦⎥⎥⎤
求取上述矩阵中的x1~x16即可得到逆矩阵。由于计算是定义在GF(2)上的,因此两个相同的矩阵相加为0,这样就能简便地计算出结果。
另外,需要注意的是,在译码的时候,需要人为地在译码结果前面加上2Zc长度的0来补齐长度。
LDPC译码
LDPC译码采用BP译码算法,该方法通过校验节点向变量节点传递信息以及变量节点向校验节点传递信息的方式,并经过迭代,得到近似ML的译码结果。经典的算法可参考书本《LDPC码基础与应用》中第四章。
这里说说自己的理解,LDPC编码的时候发送的原始比特会存在于多个校验方程中,一个校验方程中也会包含多个比特,这样就可以互相校验。
对于某个校验方程,其他比特为1的个数为偶数,为使得校验结果为0,则本比特位置为0,反之则为1。而我们需要计算的是其他比特为偶数个1和奇数个1的概率。对于某个比特,由于其存在于多个校验方程中,因此,其他校验方程是可以给出本比特取值的概率的。在迭代过程中就是反复利用以上关系更新各节点的概率,最后得到译码结果的。
(1)初始化
下图中绿色部分表示Hml=1的位置。译码过程中首先将估计得到的各比特的软值填入下图中对应位置绿色部分作为初始值。此时“校验方程”维度上的软值都是相同的。
(2)水平扫描
所谓水平扫描,就是校验节点向变量节点传递信息。也就是根据相同校验方程其他比特有偶数个1或者奇数个1的概率来推测本变量节点在本校验方程中的概率。具体实现的时候,可以将上图绿色部分的软值做横向相乘,然后再除以本节点的软值来做。
(3)垂直扫描
所谓垂直扫描,就是变量节点向校验节点传递信息。使用其他校验方程给出的概率以及先验概率的乘积作为本校验方程中本节点的概率,处理的时候是按照上图中纵向的维度来做的。另外,此处得到的是变量节点的概率,需要注意做下归一化。
(4)结束条件判断
当以上估计出来的变量节点概率做硬判决后得到d与校验矩阵H的关系满足Hd=0,或者达到迭代次数时,迭代结束,输出硬判结果。
以上过程实现代码可以参考https://download.csdn.net/download/woniukiky/19063000
附件中的代码实现了5G协议中的LDPC编译码过程,使用Matlab执行,运行LDPC_test函数,可尝试不同的输入比特,测试LDPC译码性能,此版本只提供.p文件,仅供参考。