前言
博主在[③5G NR]: 3GPP协议中LDPC编码流程解读中介绍了5G中LDPC码编码的相关流程,在这篇博客中就介绍下在5G中LDPC码具体编码的算法。因为在5G中LDPC码的PCM(Parity Check Matrix)有着特殊的构成,所以它有快速的编码的算法。
循环位移 Cyclic Shift
5G使用的是QC-LDPC(Quasi-Cyclic Low Density Parity Check Code)编码方法,所以首先来讲下循环位移这个概念。
对长度为
Z
Z
Z的向量
b
⃗
=
[
b
0
,
.
.
.
,
b
z
−
1
]
T
\vec{b}=[b_0,..., b_{z-1}]^T
b=[b0,...,bz−1]T 向左做1位的循环位移:
σ
(
b
⃗
)
=
[
b
1
,
.
.
.
,
b
z
−
1
,
b
0
]
T
σ(\vec{b})=[b_{1},..., b_{z-1},b_0]^T
σ(b)=[b1,...,bz−1,b0]T
等价的矩阵运行算是:
σ
(
b
⃗
)
=
P
⋅
b
⃗
σ(\vec{b})=P·\vec{b}
σ(b)=P⋅b
其中
P
P
P为单位阵
I
I
I向右列循环1次得到的矩阵:
P = [ 0 1 0 ⋯ 0 0 0 1 ⋯ 0 ⋮ ⋮ ⋮ ⋱ ⋮ 0 0 0 ⋯ 1 1 0 0 ⋯ 0 ] P=\begin{bmatrix} 0&1&0&\cdots&0\\ 0&0&1&\cdots&0\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&0&0&\cdots&1\\ 1&0&0&\cdots&0\\ \end{bmatrix} P= 00⋮0110⋮0001⋮00⋯⋯⋱⋯⋯00⋮10
如果
P
i
P^i
Pi表示
I
I
I向右列循环
i
i
i次得到的矩阵,那么向量
b
⃗
\vec{b}
b向左做
i
i
i次循环位移可以表示为:
σ
i
(
b
⃗
)
=
P
i
⋅
b
⃗
σ^i(\vec{b})=P^i·\vec{b}
σi(b)=Pi⋅b
校验矩阵 PCM
根据3GPP 38.212协议,LDPC码的校验矩阵是由基矩阵
H
B
G
H_{BG}
HBG(Base Graph)扩展得来,有BG1跟BG2两种选择,另外还需计算扩展因子
Z
c
Z_c
Zc,
Z
c
Z_c
Zc的计算方法可以参考LDPC编码流程一文。计算出
Z
c
Z_c
Zc后就能根据下面的表得出set index
i
L
S
i_{LS}
iLS的值
结合Base Graph,
i
L
S
i_{LS}
iLS和协议中章节5.3.2给出的表,就能构造出基矩阵
H
B
G
H_{BG}
HBG,BG1基矩阵的维度是
46
∗
68
46 * 68
46∗68,BG2基矩阵的维度是
42
∗
52
42 * 52
42∗52:
因为BG取值范围1 ~ 2,
i
L
S
i_{LS}
iLS取值范围为0 ~ 7,所以一共有18种基矩阵的可能性,可以参考[②5G NR]: LDPC编码H_BG矩阵C代码实例一文。
下面就是
H
B
G
H_{BG}
HBG的展开,
H
B
G
H_{BG}
HBG中行列的每一个元素代表的都是一个
Z
c
∗
Z
c
Z_c * Z_c
Zc∗Zc的矩阵,如果元素值为
i
i
i,那么扩展后就是一个
Z
c
∗
Z
c
Z_c * Z_c
Zc∗Zc的
P
i
P^i
Pi矩阵,如果行列元素的值在协议的表中没有给出(记为
−
1
-1
−1),那么扩展后就是一个
Z
c
∗
Z
c
Z_c * Z_c
Zc∗Zc的零矩阵。下面举个例子假设
H B G = [ 1 − 1 3 2 0 − 1 − 1 4 2 ] Z C = 5 H_{BG}=\begin{bmatrix} 1&-1&3\\ 2&0&-1\\ -1&4&2\\ \end{bmatrix}Z_C=5 HBG= 12−1−1043−12 ZC=5
那么展开后的PCM就为:
用零矩阵和
P
i
P^i
Pi矩阵表示的话就是:
H = [ P 1 0 P 3 P 2 P 0 0 0 P 4 P 2 ] H=\begin{bmatrix} P^1&0&P^3\\ P^2&P^0&0\\ 0&P^4&P^2\\ \end{bmatrix} H= P1P200P0P4P30P2
快速编码算法
因为是systematic的编码,LDPC编码后的结果并不是把原来的信息比特改的面目全非,而是在原来的信息比特后面接上新的校验比特数据,比如说在BG2下,编码后的码长为 52 Z c 52Z_c 52Zc,其中 10 Z c 10Z_c 10Zc是原来的信息比特部分, 42 Z c 42Z_c 42Zc是新生成的校验比特部分。下面是BG2, i L S = 2 i_{LS}=2 iLS=2 的一个 H B G H_{BG} HBG实例:
const int16_t h_bg2_a5_[42][52] = {
{ 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{137, -1, -1, 124, 0, 0, 88, 0, 0, 55, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 20, 94, -1, 99, 9, -1, -1, -1, 108, -1, 1, -1, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 38, 15, -1, 102, 146, 12, 57, 53, 46, 0, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, 157, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 131, -1, -1, -1, 142, -1, 141, -1, -1, -1, 64, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, 124, -1, 99, -1, 45, -1, 148, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, 45, -1, 148, -1, -1, -1, 96, -1, 78, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, -1, -1, -1, 97, -1, 51, 85, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 17, -1, -1, -1, -1, 156, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, -1, 7, -1, 4, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, 113, -1, -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 112, -1, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, -1, 138, -1, -1, -1, -1, 57, -1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, -1, -1, -1, -1, 79, -1, 111, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, 24, -1, -1, -1, -1, -1, 109, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, 18, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, 158, -1, -1, -1, -1, -1, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, 148, -1, -1, -1, -1, -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, 75, -1, 158, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, 69, -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, -1, 0, -1, -1, -1, -1, 100, -1, -1, -1, -1, 13, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, 126, -1, -1, 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, 154, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, -1, 0, -1, -1, 35, -1, 51, -1, 134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, 20, -1, -1, -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{ -1, -1, 0, -1, -1, -1, -1, 88, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, 157, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1},
{ 0, -1, 63, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1},
{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1},
{ -1, 0, -1, -1, -1, 93, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1},
{ 0, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1},
{ -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1},
{ -1, 0, -1, -1, -1, 2, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0}
};
根据LDPC的校验关系,LDPC的码字
c
⃗
\vec{c}
c 满足下面的关系:
H
c
⃗
=
0
⃗
H\vec{c}=\vec{0}
Hc=0
在BG2中,可以将码字
c
⃗
\vec{c}
c 分成52个
Z
c
Z_c
Zc长的码块
{
c
i
⃗
}
\lbrace\vec{c_i}\rbrace
{ci},
c
i
⃗
∈
{
0
,
1
}
Z
\vec{c_i}\in\lbrace0,1\rbrace^Z
ci∈{0,1}Z:
c
⃗
=
[
I
0
⃗
,
I
1
⃗
,
.
.
.
,
I
9
⃗
,
P
0
⃗
,
P
1
⃗
,
P
2
⃗
,
P
3
⃗
.
.
.
,
P
41
⃗
]
\vec{c}=[\vec{I_0},\vec{I_1},...,\vec{I_9},\vec{P_0},\vec{P_1},\vec{P_2},\vec{P_3}...,\vec{P_{41}}]
c=[I0,I1,...,I9,P0,P1,P2,P3...,P41]
其中
I
i
⃗
,
I
i
⃗
∈
{
0
,
1
}
Z
\vec{I_i},\vec{I_i}\in\lbrace0,1\rbrace^Z
Ii,Ii∈{0,1}Z是原来的信息比特部分,
P
i
⃗
,
P
i
⃗
∈
{
0
,
1
}
Z
\vec{P_i},\vec{P_i}\in\lbrace0,1\rbrace^Z
Pi,Pi∈{0,1}Z是校验比特部分。校验矩阵的每一行都定义了校验方程组满足:
∑
H
i
j
c
j
⃗
=
0
⃗
\sum{H_{ij}}\vec{c_j}=\vec{0}
∑Hijcj=0
因为
H
H
H是由
H
B
G
H_{BG}
HBG展开得来,上面的校验方程也等价为:
∑
P
a
i
j
c
j
⃗
=
0
⃗
\sum{P^{a_{ij}}}\vec{c_j}=\vec{0}
∑Paijcj=0,
a
i
j
a_{ij}
aij为
H
B
G
H_{BG}
HBG中的值,也可以写作
∑
σ
a
i
j
c
j
⃗
=
0
⃗
\sum{σ^{a_{ij}}}\vec{c_j}=\vec{0}
∑σaijcj=0,这里我们发现对
c
j
⃗
\vec{c_j}
cj的操作就是循环左移。
[ P a 0 , 0 P a 0 , 1 ⋯ P a 0 , 51 ⋮ ⋮ ] [ I 0 ⃗ I 1 ⃗ ⋮ I 9 ⃗ P 0 ⃗ P 1 ⃗ ⋮ P 41 ⃗ ] = 0 ⃗ \begin{bmatrix} P^{a_{0,0}}&P^{a_{0,1}}&\cdots & P^{a_{0,51}}\\ \vdots&&&\vdots\\ \\ \\ \\ \\ \\ \\ \\ \end{bmatrix}\begin{bmatrix} \vec{I_0}\\ \vec{I_1}\\ \vdots\\ \vec{I_9}\\ \vec{P_0}\\ \vec{P_1}\\ \vdots\\ \vec{P_{41}}\\ \end{bmatrix}=\vec{0} Pa0,0⋮Pa0,1⋯Pa0,51⋮ I0I1⋮I9P0P1⋮P41 =0
从本例中的 H B G H_{BG} HBG我们可以看出基矩阵的结构是有些特殊的,所以在算法中我们不需要展开校验矩阵 H H H,直接用 H B G H_{BG} HBG来计算 P i ⃗ \vec{P_i} Pi, H B G H_{BG} HBG可以分解成下面的结构:
首先我们要计算 P 0 ⃗ \vec{P_0} P0~ P 3 ⃗ \vec{P_3} P3,在本例中我们可以找到一个 4 ∗ 4 4*4 4∗4的核心校验矩阵:
[ 0 0 − 1 − 1 − 1 0 0 − 1 1 − 1 0 0 0 − 1 − 1 0 ] \begin{bmatrix} 0&0&-1&-1\\ -1&0&0&-1\\ 1&-1&0&0\\ 0&-1&-1&0\\ \end{bmatrix} 0−11000−1−1−100−1−1−100
每个 H B G H_{BG} HBG的核心校验矩阵可能不太一样,但是前4行校验方程组的 P i ⃗ \vec{P_i} Pi部分只跟 P 0 ⃗ \vec{P_0} P0~ P 3 ⃗ \vec{P_3} P3相关( H B G H_{BG} HBG右上角部分扩展后都是零矩阵),而且累加必定会把 P 1 ⃗ \vec{P_1} P1~ P 3 ⃗ \vec{P_3} P3约掉(二进制加法),就能先求出 P 0 ⃗ \vec{P_0} P0,比如在本例中,前4行校验方程组为:
①
I
0
⃗
+
I
1
⃗
+
I
2
⃗
+
I
3
⃗
+
I
6
⃗
+
I
9
⃗
+
I
10
⃗
+
P
0
⃗
+
P
1
⃗
=
0
⃗
\vec{I_0}+\vec{I_1}+\vec{I_2}+\vec{I_3}+\vec{I_6}+\vec{I_9}+\vec{I_{10}}+\vec{P_0}+\vec{P_1}=\vec{0}
I0+I1+I2+I3+I6+I9+I10+P0+P1=0
②
P
137
I
0
⃗
+
P
124
I
3
⃗
+
I
4
⃗
+
I
5
⃗
+
P
88
I
6
⃗
+
I
7
⃗
+
I
8
⃗
+
P
55
I
9
⃗
+
P
1
⃗
+
P
2
⃗
=
0
⃗
P^{137}\vec{I_0}+P^{124}\vec{I_3}+\vec{I_4}+\vec{I_5}+P^{88}\vec{I_6}+\vec{I_7}+\vec{I_8}+P^{55}\vec{I_9}+\vec{P_1}+\vec{P_2}=\vec{0}
P137I0+P124I3+I4+I5+P88I6+I7+I8+P55I9+P1+P2=0
③
P
20
I
0
⃗
+
P
94
I
1
⃗
+
P
99
I
3
⃗
+
P
9
I
4
⃗
+
P
88
I
6
⃗
+
P
108
I
8
⃗
+
P
1
P
0
⃗
+
P
2
⃗
+
P
3
⃗
=
0
⃗
P^{20}\vec{I_0}+P^{94}\vec{I_1}+P^{99}\vec{I_3}+P^{9}\vec{I_4}+P^{88}\vec{I_6}+P^{108}\vec{I_8}+P^{1}\vec{P_0}+\vec{P_2}+\vec{P_3}=\vec{0}
P20I0+P94I1+P99I3+P9I4+P88I6+P108I8+P1P0+P2+P3=0
④
P
38
I
1
⃗
+
P
15
I
2
⃗
+
P
102
I
4
⃗
+
P
146
I
5
⃗
+
P
12
I
6
⃗
+
P
57
I
7
⃗
+
P
53
I
8
⃗
+
P
46
I
9
⃗
+
P
0
⃗
+
P
3
⃗
=
0
⃗
P^{38}\vec{I_1}+P^{15}\vec{I_2}+P^{102}\vec{I_4}+P^{146}\vec{I_5}+P^{12}\vec{I_6}+P^{57}\vec{I_7}+P^{53}\vec{I_8}+P^{46}\vec{I_9}+\vec{P_0}+\vec{P_3}=\vec{0}
P38I1+P15I2+P102I4+P146I5+P12I6+P57I7+P53I8+P46I9+P0+P3=0
如果① + ② + ③ + ④,就能得到:
∑ + P 1 P 0 ⃗ = 0 ⃗ ⟶ ∑ = P 1 P 0 ⃗ \sum+P^{1}\vec{P_0}=\vec{0}\longrightarrow\sum=P^{1}\vec{P_0} ∑+P1P0=0⟶∑=P1P0, ∑ \sum ∑为信息比特相关的累加部分
P
a
i
j
c
j
⃗
P^{a_{ij}}\vec{c_j}
Paijcj部分在C代码中实现也比较简单,就是向量的循环左移,计算出
P
0
⃗
\vec{P_0}
P0后,将值带入① ,②, ③中就能依次算出
P
1
⃗
\vec{P_1}
P1,
P
2
⃗
\vec{P_2}
P2,
P
3
⃗
\vec{P_3}
P3。
我们再次观察
H
B
G
H_{BG}
HBG的右下角部分,这个部分的矩阵对角线为0,其余部分为-1,所以接下来的扩展校验部分
P
4
⃗
\vec{P_4}
P4~
P
41
⃗
\vec{P_{41}}
P41,都可以由每一行的信息比特部分加上
P
0
⃗
\vec{P_0}
P0~
P
3
⃗
\vec{P_3}
P3的组合通过校验方程组得出,而且一定能按照顺序依次得出。
比如第5行,这里的
∑
\sum
∑为每一行的信息比特累加部分:
∑ + P 157 P 1 ⃗ + P 4 ⃗ = 0 ⃗ \sum+P^{157}\vec{P_1}+\vec{P_4}=\vec{0} ∑+P157P1+P4=0
第6行:
∑ + P 64 P 1 ⃗ + P 5 ⃗ = 0 ⃗ \sum+P^{64}\vec{P_1}+\vec{P_5}=\vec{0} ∑+P64P1+P5=0
第10行:
∑ + P 51 P 0 ⃗ + P 85 P 1 ⃗ + P 9 ⃗ = 0 ⃗ \sum+P^{51}\vec{P_0}+P^{85}\vec{P_1}+\vec{P_9}=\vec{0} ∑+P51P0+P85P1+P9=0
直到算完所有的校验比特,我们就能得到LDPC码编码后的结果,本例是BG2的配置,如果为BG1只是维度不同,过程是一样的。