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

[④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,...,bz1]T做1位的循环位移:
σ ( b ⃗ ) = [ b 1 , . . . , b z − 1 , b 0 ] T σ(\vec{b})=[b_{1},..., b_{z-1},b_0]^T σ(b )=[b1,...,bz1,b0]T
等价的矩阵运行算是:
σ ( b ⃗ ) = P ⋅ b ⃗ σ(\vec{b})=P·\vec{b} σ(b )=Pb
其中 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= 0001100001000010

如果 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 )=Pib

校验矩阵 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 4668,BG2基矩阵的维度是 42 ∗ 52 42 * 52 4252

因为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 ZcZc的矩阵,如果元素值为 i i i,那么扩展后就是一个 Z c ∗ Z c Z_c * Z_c ZcZc P i P^i Pi矩阵,如果行列元素的值在协议的表中没有给出(记为 − 1 -1 1),那么扩展后就是一个 Z c ∗ Z c Z_c * Z_c ZcZc的零矩阵。下面举个例子假设

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= 121104312 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,0Pa0,1Pa0,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 44的核心校验矩阵:

[ 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} 0110001110011100

每个 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只是维度不同,过程是一样的。

转载请说明出处内容投诉
CSS教程_站长资源网 » [④5G NR]: 5G LDPC编码算法

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买