[④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的值
结合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⋮ 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 ∑为每一行的信息比特累加部分:
∑ + 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只是维度不同,过程是一样的。
还没有评论,来说两句吧...