参照3GPP的标准文档,摘录其中下行共享信道与寻呼信道的LDPC编码流程,以便于进行对应的软件仿真
-
传输块加CRC校验
记待传输的数据块序列为 a 0 , a 1 , ⋯ , a A − 1 a_0,a_1,\cdots,a_{A-1} a0,a1,⋯,aA−1,其中 A A A为传输块的负载(payload)尺寸。加入CRC校验比特以提供检错能力,其中加入的CRC校验比特长度 L L L由 A A A的大小决定,如下式所示
L = { 24 , i f A > 3824 16 , o t h e r w i s e L = \begin{cases} 24,\ \ \ \ if A \gt 3824 \\ \\ 16,\ \ \ \ otherwise \end{cases} L=⎩⎪⎨⎪⎧24, ifA>382416, otherwise
对应选取的CRC生成多项式为
g c r c 24 a ( D ) = D 24 + D 23 + D 18 + D 17 + D 14 + D 11 + D 10 + D 7 + D 6 + D 5 + D 4 + D 3 + D + 1 g c r c 16 ( D ) = D 16 + D 12 + D 5 + 1 g_{crc24a}(D) = D^{24}+D^{23}+D^{18}+D^{17}+D^{14}+D^{11}+D^{10}+D^{7}+D^{6}+D^{5}+D^{4}+D^{3}+D+1\\g_{crc16}(D)=D^{16}+D^{12}+D^{5}+1 gcrc24a(D)=D24+D23+D18+D17+D14+D11+D10+D7+D6+D5+D4+D3+D+1gcrc16(D)=D16+D12+D5+1
生成的校验比特序列 p 0 , p 1 , ⋯ , p L − 1 p_0,p_1,\cdots,p_{L-1} p0,p1,⋯,pL−1附在数据块序列后,记加了CRC校验的序列为 b 0 , b 1 , ⋯ , b B − 1 b_0,b_1,\cdots,b_{B-1} b0,b1,⋯,bB−1,即有
{ b k = a k , 0 ≤ k < A b k = p k − A , A ≤ k < B \begin{cases} b_k=a_k,\ \ \ \ 0\leq k \lt A\\ \\ b_k=p_{k-A},\ \ \ \ A\leq k \lt B \end{cases} ⎩⎪⎨⎪⎧bk=ak, 0≤k<Abk=pk−A, A≤k<B
其中 B = A + L B=A+L B=A+L。 -
选择基图BG
根据具体传输要求决定的码率 R R R,以及传输块原始的长度 A A A,确定基图的选择如下
B G = { B G 2 , i f A ≤ 292 o r { A ≤ 3824 R ≤ 0.67 o r R ≤ 0.25 B G 1 , o t h e r w i s e BG=\begin{cases} BG2,\ \ \ \ if \ A\leq 292\ or\ \begin{cases}A\leq 3824\\ R\leq 0.67\end{cases}\ or\ R\leq 0.25 \\ \\ BG1,\ \ \ \ otherwise \end{cases} BG=⎩⎪⎪⎪⎨⎪⎪⎪⎧BG2, if A≤292 or {A≤3824R≤0.67 or R≤0.25BG1, otherwise -
传输块分段
对应于不同的基图,单次能够传输的码块大小是有限制的,记码块最大为 B m a x B_{max} Bmax,则有
B m a x = { 8448 , i f B G 1 3840 , i f B G 2 B_{max}= \begin{cases} 8448,\ \ \ \ if \ BG1\\ \\ 3840,\ \ \ \ if \ BG2 \end{cases} Bmax=⎩⎪⎨⎪⎧8448, if BG13840, if BG2
如果传输块尺寸 B > B m a x B>B_{max} B>Bmax,则要求对传输块进行分块,并且每个分块还要附加长度 L ′ = 24 L^{'}=24 L′=24的CRC校验比特,综上所述,所需分块的数目 C C C和分块后总体传输块大小 B ′ B^{'} B′的计算如下
C = { 1 , i f B ≤ B m a x ⌈ B / ( B m a x − L ′ ) ⌉ , o t h e r w i s e B ′ = { B , i f B ≤ B m a x B + C ⋅ L ′ , o t h e r w i s e \begin{aligned} C&= \begin{cases} 1,\ \ \ \ if \ B\leq B_{max}\\ \\ \lceil B / (B_{max}-L^{'})\rceil,\ \ \ \ otherwise \end{cases}\\ \\ B^{'}&= \begin{cases} B,\ \ \ \ if \ B \leq B_{max}\\ \\ B+C·L^{'},\ \ \ \ otherwise \end{cases} \end{aligned} CB′=⎩⎪⎨⎪⎧1, if B≤Bmax⌈B/(Bmax−L′)⌉, otherwise=⎩⎪⎨⎪⎧B, if B≤BmaxB+C⋅L′, otherwise -
确定码块大小
由于标准中支持的提升值 Z Z Z肯定不可能是连续的,因此用校验矩阵进行编码时支持的输入比特序列长度也不会是连续的。如果直接将传输块均分,得到的码块长度很可能不会恰好满足校验矩阵对编码序列长度的要求,需要填充比特才行。另外,标准中的BG2还要求根据输入码块长度来适当删减对应的核心矩阵系统列,这也会影响到最终编码码块长度的确定。所以,综合来看,码块长度的确定还需要进行对应的计算.
设对传输块 B ′ B^{'} B′均分得到的码块长度为 K ′ K^{'} K′,则有
K ′ = B ′ C K^{'}=\frac{B^{'}}{C} K′=CB′
另外,编码对应系统列数 K b K_b Kb确定如下
K b = { 22 , B G 1 10 , B G 2 & & B > 640 9 , B G 2 & & 640 ≥ B > 560 8 , B G 2 & & 560 ≥ B > 192 6 , B G 2 & & B ≤ 192 K_b= \begin{aligned} \begin{cases} 22,\ \ \ \ &BG1\\ \\ 10,\ \ \ \ &BG2\ \&\& \ B>640\\ \\ 9,\ \ \ \ &BG2\ \&\& \ 640\geq B>560\\ \\ 8,\ \ \ \ &BG2\ \&\& \ 560\geq B > 192\\ \\ 6,\ \ \ \ &BG2\ \&\&\ B\leq 192 \end{cases} \end{aligned} Kb=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧22, 10, 9, 8, 6, BG1BG2 && B>640BG2 && 640≥B>560BG2 && 560≥B>192BG2 && B≤192
根据式子 Z c ≥ K ′ / K b Z_c\geq K^{'}/K_b Zc≥K′/Kb,确定满足这一条件的最小提升值 Z Z Z,其可能取值如下所示
Z = a ⋅ 2 i , a = { 2 , 3 , 5 , 7 , 9 , 11 , 13 , 15 } , i = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 } , Z ≤ 384 Z=a·2^i,\ a=\{2,3,5,7,9,11,13,15\},\ i=\{0,1,2,3,4,5,6,7\},Z\leq384 Z=a⋅2i, a={2,3,5,7,9,11,13,15}, i={0,1,2,3,4,5,6,7},Z≤384最终确定编码码块的大小 K K K如下
K = { 22 Z c , B G 1 10 Z c , B G 2 K= \begin{aligned} \begin{cases} 22Z_c, \ \ \ \ &BG1\\ \\ 10Z_c, \ \ \ \ &BG2 \end{cases} \end{aligned} K=⎩⎪⎨⎪⎧22Zc, 10Zc, BG1BG2 -
码块填充比特
确定了编码码块的大小后,还需要确定编码码块的组成。若码块 C = 1 C=1 C=1,则只需要在信息块 B ′ B^{'} B′后添加填充比特 < N U L L > ( 0 ) <NULL>(0) <NULL>(0)即可,此时的编码码块组成如下
若码块数 C > 1 C>1 C>1,则需要添加长度 L = 24 L=24 L=24的CRC校验比特,其生成多项式如下所示
g c r c 24 b ( D ) = D 24 + D 23 + D 6 + D 5 + D + 1 g_{crc24b}(D)=D^{24}+D^{23}+D^6+D^5+D+1 gcrc24b(D)=D24+D23+D6+D5+D+1
此时的码块组成如下所示 -
LDPC编码
确定了编码码块后,要进行编码,还需要得到校验矩阵。具体来说,标准中根据基图和提升值所属组确定了 2 × 8 = 16 2\times8=16 2×8=16个校验矩阵,其中提升值所属组即计算式 Z = a ⋅ 2 i Z=a·2^i Z=a⋅2i中的 a a a,共8种取值即8组。另外,这16个校验矩阵的移位值是按照对应提升值组中的最大值确定的,若要应用到当前编码中则需要对移位值进行 Z c Z_c Zc的求余,这样得到的计算结果才是当前提升值对应的移位值。
通过编码码块和校验矩阵进行编码后,根据基图的不同,得到的系统编码比特序列长 N ′ N^{'} N′为
N ′ = { 68 Z c , B G 1 52 Z c , B G 2 N^{'}= \begin{aligned} \begin{cases} 68Z_c,\ \ \ \ &BG1\\ \\ 52Z_c,\ \ \ \ &BG2 \end{cases} \end{aligned} N′=⎩⎪⎨⎪⎧68Zc, 52Zc, BG1BG2
值得注意的是,5G NR所采用的基图在设计时给前 2 Z c 2Z_c 2Zc个系统比特对应的两列设置了较大的列重,使得发送端将这两列对应的系统比特打掉后仍然能够在接收端较大可能地恢复出来。而打掉这 2 Z c 2Z_c 2Zc个系统比特后,可以对应地补上 2 Z c 2Z_c 2Zc个校验比特,以实现发送比特数不变的前提下性能上的提升。因此,虽然标准中给的最终编码后序列长度 N = 66 Z c N=66Z_c N=66Zc或 N = 50 Z c N=50Z_c N=50Zc,但是实际仿真中还是会在后面补上校验比特的。