一、前言
在5G SCH流程中为了便于编译码,并且减少HARQ重传的消耗,对于DL-SCH,会对MAC层的TB包进行添加CRC校验和码块分段,以下描述均基于DL-SCH,UL-SCH原理相同。
二、TB CRC
通过循环冗余校验(CRC)在 SCH 传输块上提供错误检测。
整个传输块TB用于计算 CRC 奇偶校验位。 如MAC层输入TB比特序列有效载荷大小为A,CRC 奇偶校验位长度为 L T B L_{TB} LTB。
L T B = { 24 i f A > 3824 16 i f A ≤ 3824 L_{TB}=\left\{ \begin{aligned} 24 && if&& A >3824\\ 16 && if&& A ≤3824\\ \end{aligned} \right. LTB={2416ififA>3824A≤3824
当TB 长度A > 3824, 添加24bit CRC, CRC 效验方程为Gcrc24A. 其他情况下,添加16bitCRC , 效验方程为Gcrc16;
B = A + L T B B = A + L_{TB} B=A+LTB .
流程如下图所示:
二、LDPC编码基图选择
NR的LDPC编码器适合于2个码块(Code-Block,CB)尺寸,对于基图1,码块尺寸是8424个bit;对于基图2,码块尺寸是3840个bit。
对于编码速率为R的传输块,NR根据如下原则选择基图1或基图2,主要是根据码率R和TB大小确定基图,以保证平衡LDPC译码的效率和性能:
(1)如果A≤292,或如果A≤3824且R≤0.67,或如果R≤0.25,使用LDPC基图2,
(2)否则使用LDPC基图1。
B G = { B G 2 i f A ≤ 292 , A ≤ 3824 且 R ≤ 0.67 , R ≤ 0.25 B G 1 其他 BG=\left\{ \begin{aligned} BG2 && if& & A≤292,A≤3824 且R≤0.67,R≤0.25\\ BG1 && & &其他\\ \end{aligned} \right. BG={BG2BG1ifA≤292,A≤3824且R≤0.67,R≤0.25其他
选择LDPC基图示意如下图 所示。
三、LDPC码块分段
如果传输块(Transport Block,TB)和CRC的尺寸之和B大于8424个bit或3840个bit则要通过码块分段(Code-Block Segmentation)的方式把传输块分割成多个尺寸相等的码块(Code Block,CB)。每个分割的码块也要增加上CRC(24个bit),在单个码块传输的情况下,不增加码块 CRC,。
增加码块 CRC的目的是码块组(Code-Block Group,CBG)发生错误后,仅需要重传错误的码块组,而不必重传整个传输块,因此有助于减少 UE 的处理负荷。传输块 CRC有助于通过差错检测增加额外的保护,由于码块分割仅应用在大的传输块上,因此增加传输块CRC的开销相对较小。
3.1 CB个数确定
确认好基图BG后,根据基图即可得到CB块最大尺寸 K c b K_{cb} Kcb:
K c b = { 8448 ; B G 1 , 22 ∗ 384 ( 最大 Z c 为 384 ) 3840 ; B G 2 , 10 ∗ 384 ( 最大 Z c 为 384 ) K_{cb}=\left\{ \begin{aligned} 8448;& &BG1&,22*384(最大Zc为384) \\ 3840;& & BG2&, 10*384(最大Zc为384) \\ \end{aligned} \right. Kcb={8448;3840;BG1BG2,22∗384(最大Zc为384),10∗384(最大Zc为384)
从以上公式可得出,在选择BG1是,CB块的大小为8448,在选择BG2是,CB块的大小为3840。
CB块中实际有效bit的大小并不一定是8448或3840,需根据参数得出。
确定 K c b K_{cb} Kcb后,就可以确定CB个数C,下式中L为每个CB添加的CRC长度,值为24或0,因 K c b K_{cb} Kcb是包含了CRC校验的,B中不包含CB的CRC,所以在计算时要将L排除掉。⌈x⌉为对x进行向上取整。
C = { 1 ; B ≤ K c b , L = 0 ⌈ B / ( K c b − L ) ⌉ ; B > K c b , L = 24 C=\left\{ \begin{aligned} &1; &&B≤K_{cb},L=0 \\ &⌈B/(K_{cb}-L)⌉; && B>K_{cb} ,L=24\\ \end{aligned} \right. C={1;⌈B/(Kcb−L)⌉;B≤Kcb,L=0B>Kcb,L=24
码块分割后CB的长度和B’变为:
B ′ = B + C ∗ L B' = B+C*L B′=B+C∗L
3.2 CB内有效数据长度确定
步骤如下:
计算 K ′ = B ′ / C = B / C + L K' = B'/C=B/C+L K′=B′/C=B/C+L, K ′ K' K′ 为理论的CB内有效数据长度,无法整除可能为小数,包含了CB CRC的长度.。通过C的计算公式可知 C ≥ B / ( K c b − L ) C≥B/(K_{cb}-L) C≥B/(Kcb−L),那么 B / C ≤ K c b − L B/C≤K_{cb}-L B/C≤Kcb−L,从而可得 K ′ ≤ K c b K' ≤ K_{cb} K′≤Kcb(小于的情况为 B / ( K c b − L ) B/(K_{cb}-L) B/(Kcb−L)非整数),说明 K ′ K' K′的长度是接近 K c b K_{cb} Kcb的。
计算 K b K_b Kb
K b = { 22 ; B G 1 10 ; B G 2 , B > 640 9 ; B G 2 , 560 < B ≤ 640 8 ; B G 2 , 192 < B ≤ 560 6 ; B G 2 , B ≤ 192 K_b=\left\{ \begin{aligned} &22; &&BG1 \\ &10; && BG2,B>640\\ &9; && BG2,560<B≤640\\ &8; && BG2,192<B≤560\\ &6; && BG2,B≤192\\ \end{aligned} \right. Kb=⎩ ⎨ ⎧22;10;9;8;6;BG1BG2,B>640BG2,560<B≤640BG2,192<B≤560BG2,B≤192计算 Z c Z_c Zc
这里需要用到LDPC编译码的提升因子Z,Z的值如下表所示
Z其实是由两部分组成:
Z = a ∗ 2 j Z = a*2^j Z=a∗2j
其中a={2,3,5,7,9,11,13,15}, j=0~7 (即为 i L S i_{LS} iLS), Z为满足 Z = a ∗ 2 j ≤ 384 Z = a*2^j≤384 Z=a∗2j≤384的值。
在上表中的所有提升因子中找到满足 K b ∗ Z ≥ K ′ K_b*Z≥ K' Kb∗Z≥K′ 最小值Z即为LDPC编译码的Zc,并有与之对应的a和j。实际就是LDPC编码协议只根据Z确定了BG1和BG2各51种CB长度,设计时需要去匹配这些长度,保证CB长度能包含所有数据bit,并且不产生过多的资源消耗,所以CB长度取51个长度中≥K’的最小值即可。
- 计算CB内有效数据K,K≥K’,包含CRC
K = { 22 Z c ; B G 1 10 Z c ; B G 2 K=\left\{ \begin{aligned} &22Z_c; &&BG1 \\ &10Z_c; && BG2\\ \end{aligned} \right. K={22Zc;10Zc;BG1BG2
3.3 数据打孔和填充
在得到CB内有效数据长度 K K K和 K c b K_{cb} Kcb后,可以生成完整的CB块数据,由于 K b ∗ Z c ≥ K ′ K_b*Z_c≥ K' Kb∗Zc≥K′,所以CB块的数据大于有效数据的长度,需要进行码块数据填充。协议中并没有将 K ′ K' K′为小数的情况表示出来,这里不参照协议中的公式:
定义最终分块后添加CRC的序列为 C r k C_{rk} Crk,r=0 ~ C-1,为CB块序号,k=0 ~ K-1,为CB块内bit序号。定义带分块TB序列为 b s b_{s} bs,s=0 ~ B-1。
C=1的情况,不添加CB CRC
C 0 k = { b k ; k = 0 − ( K ′ − 1 ) 0 ; k = K ′ − K − 1 ,填充 C_{0k}=\left\{ \begin{aligned} &b_{k}; &&k=0 - (K'-1) \\ &0; && k=K'-K-1,填充\\ \end{aligned} \right. C0k={bk;0;k=0−(K′−1)k=K′−K−1,填充
C>1的情况,添加CB CRC,并需根据K’是否为整数确定每个CB的有效数据数量。
C p 1 = m o d ( B ′ , C ) C_{p1}=mod(B',C) Cp1=mod(B′,C),对于r=0 ~ ( C p 1 − 1 C_{p1}-1 Cp1−1),有效数据长度为 K l ′ = f l o o r ( K ′ ) K'_l=floor(K') Kl′=floor(K′);对于r=0 ~ ( C p 1 − 1 C_{p1}-1 Cp1−1),有效数据长度为 K h ′ = c e i l ( K ′ ) K'_h=ceil(K') Kh′=ceil(K′),即最后 m o d ( B ′ , C ) mod(B',C) mod(B′,C)个CB的有效数据长度比前面的CB有效数据长度大1,以保证最终CB长度和为B’。
P r P_{r} Pr,为 C r k C_{rk} Crk( l=0~K’-1)产生的CRC序列,长度为24
因此r=0 ~ ( C p 1 − 1 C_{p1}-1 Cp1−1)时:
C r k = { b ( K l ′ − L ) ∗ r + k ; k = ( K ∗ r + 0 ) − ( K ∗ r + K l ′ − L − 1 ) P r ; k = ( K ∗ r + K l ′ − L ) − ( K ∗ r + K l ′ − 1 ) , C R C 校验,长度 24 0 ; k = ( K ∗ r + K l ′ ) − ( K ∗ r + K − 1 ) ,填充 C_{rk}=\left\{ \begin{aligned} &b_{(K'_l-L)*r+k}; &&k=(K*r+0) - (K*r+K'_l-L-1) \\ &P_{r}; &&k=(K*r+K'_l-L) - (K*r+K'_l-1) ,CRC校验,长度24\\ &0; && k=(K*r+K'_l) - (K*r+K-1) ,填充\\ \end{aligned} \right. Crk=⎩
⎨
⎧b(Kl′−L)∗r+k;Pr;0;k=(K∗r+0)−(K∗r+Kl′−L−1)k=(K∗r+Kl′−L)−(K∗r+Kl′−1),CRC校验,长度24k=(K∗r+Kl′)−(K∗r+K−1),填充
因此r= C p 1 C_{p1} Cp1~ ( C − 1 ) (C-1) (C−1)时:
C r k = { b ( K l ′ − L ) ∗ C p 1 + ( K h ′ − L ) ∗ ( r − C p 1 ) + k ; k = ( K ∗ r + 0 ) − ( K ∗ r + K l ′ − L − 1 ) P r ; k = ( K ∗ r + K h ′ − L ) − ( K ∗ r + K h ′ − 1 ) , C R C 校验,长度 24 0 ; k = ( K ∗ r + K h ′ ) − ( K ∗ r + K − 1 ) ,填充 C_{rk}=\left\{ \begin{aligned} &b_{(K'_l-L)*C_{p1}+(K'_h-L)*(r-C_{p1})+k}; &&k=(K*r+0) - (K*r+K'_l-L-1) \\ &P_{r}; &&k=(K*r+K'_h-L) - (K*r+K'_h-1) ,CRC校验,长度24\\ &0; && k=(K*r+K'_h) - (K*r+K-1) ,填充\\ \end{aligned} \right. Crk=⎩ ⎨ ⎧b(Kl′−L)∗Cp1+(Kh′−L)∗(r−Cp1)+k;Pr;0;k=(K∗r+0)−(K∗r+Kl′−L−1)k=(K∗r+Kh′−L)−(K∗r+Kh′−1),CRC校验,长度24k=(K∗r+Kh′)−(K∗r+K−1),填充
最终产生 22 Z c 22Z_c 22Zc或者 10 Z c 10Z_c 10Zc的CB序列,由于5G NR中,为了减少数据量,可以将CB内前 2 Z c 2Z_c 2Zc的数据进行打孔删除,LDPC也能完成译码,最终送到LDPC译码的数据为 20 Z c 20Z_c 20Zc或者 8 Z c 8Z_c 8Zc
3.4 LDPC编码输出数据
按 22 Z c 22Z_c 22Zc(BG1)或者 10 Z c 10Z_c 10Zc(BG2)输入到LDPC编码后输出最大为 68 Z c 68Z_c 68Zc(BG1)或者 52 Z c 52Z_c 52Zc(BG2),添加了 46 Z c 46Z_c 46Zc(BG1)或 42 Z c 42Z_c 42Zc(BG2)的校验数据,其中校验数据的长度mb可配置,最大为 46 46 46(BG1)或 42 42 42(BG2)。
进行打孔后LDPC编码后输出 ( 20 + m b ) Z c (20+mb)Z_c (20+mb)Zc(BG1)或者 ( 8 + m b ) Z c (8+mb)Z_c (8+mb)Zc(BG2),最大为 66 Z c 66Z_c 66Zc(BG1)或者 50 Z c ( B G 2 ) 50Z_c(BG2) 50Zc(BG2)
参考文件
3GPP TS38.212
www.sharetechnote.com
5G NR物理层设计与规划