[④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⋮01​10⋮00​01⋮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编码算法

结合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编码算法

因为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​−104​3−12​
​ZC​=5

那么展开后的PCM就为:

[④5G NR]: 5G LDPC编码算法

用零矩阵和

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=
​P1P20​0P0P4​P30P2​

快速编码算法

因为是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}

∑Hij​cj​
​=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}

∑Paij​cj​
​=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}

∑σaij​cj​
​=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​可以分解成下面的结构:

[④5G NR]: 5G LDPC编码算法

首先我们要计算

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−110​00−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行校验方程组为:

[④5G NR]: 5G LDPC编码算法

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}

Paij​cj​
​部分在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编码算法

+

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编码算法

+

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编码算法

+

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