[④5G NR]: 5G LDPC编码算法
前言
博主在[③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的值
![[④5G NR]: 5G LDPC编码算法](/img/79/c91883875395457a9280d0e8dc623dbd.png)
结合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:
![[④5G NR]: 5G LDPC编码算法](/img/ea/a8e0b5e73eaa429e8fb63ec10e74b16e.png)
因为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就为:
![[④5G NR]: 5G LDPC编码算法](/img/f4/c029376110614a04add7dc23d64e5e61.png)
用零矩阵和
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⋮
I0
I1
⋮I9
P0
P1
⋮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
∑为每一行的信息比特累加部分:
![[④5G NR]: 5G LDPC编码算法](/img/58/1d5c57c9fb15492b88051b97b52c7c61.png)
∑
+
P
157
P
1
⃗
+
P
4
⃗
=
0
⃗
\sum+P^{157}\vec{P_1}+\vec{P_4}=\vec{0}
∑+P157P1
+P4
=0
第6行:
![[④5G NR]: 5G LDPC编码算法](/img/da/383b7fce53fa4a6f8630f487c3972556.png)
∑
+
P
64
P
1
⃗
+
P
5
⃗
=
0
⃗
\sum+P^{64}\vec{P_1}+\vec{P_5}=\vec{0}
∑+P64P1
+P5
=0
第10行:
![[④5G NR]: 5G LDPC编码算法](/img/3d/b5f041ce07104572a74dc28996881cad.png)
∑
+
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只是维度不同,过程是一样的。
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/3e15ee88ca.html
