5G 业务信道LDPC 信道编码
1 NR LDPC 编码
1.1 CRC 和 码块分割
NR 中支持两种graph, 第一种graph 支持最大的码块大小为8448, 第二种graph支持的最大码块大小为3840.这两种大小也跟两种graph的核心矩阵对应,在提升因子最大为zc = 384时, 8448 = 384 * 22; 3840 = 3840 * 10; 提升因子如下图所示:
对于PUSCH,根据38.212 6.2.1节, 当TB payload A > 3824, 添加24bit CRC, CRC 效验方程为Gcrc24A. 其他情况下,添加16bitCRC , 效验方程为Gcrc16;
根据A的大小以及码率,选择graph1/2:
根据5.2.2 节,根据选择的graph, 确定最大的cb块的size ,则进行码块分割,确定码块数量和码块的大小,提升因子Zc。
码块大小K = 22Zc (for graph1 )
K = 10Zc (for graph2)
填入K’-24个原始Bit,添加24bitCRC, 不足Kbit的位置上填0.
1.2 编码
1.2.1 H 矩阵架构
在Table 5.3.2-2 中定义了8个基础矩阵中的每一个元素的移位因子。每一行对应的有效列位置根据列索引得到。其示意图如下图所示:
将上述矩阵分成如下6个子矩阵,如下图所示:
其中,核心矩阵AB, 维度为4*26,具有较多的非零元素,B 矩阵第一列含有3个非零元素,除了首尾两个位置非零之外,其他行任意位置有一个非零元素,B矩阵可以将第一列向量和后面3列向量分开,B= [b1,b2], C 是全0 矩阵; F是对角矩阵,对角上的非零元素实际值是0。
对于稀疏矩阵H,有列索引的是有Zc * Zc 单位矩阵的,无索引的是Zc * Zc全0矩阵。列上对应的数字表示Z *Z 单位矩阵的右移次数,0表示不右移。每一个具体的数值是对单位矩阵进行循环移位的提升值.
根据协议,BG1 和BG2的pattern 分别如下:
1.2.2 编码步骤
在确定了H矩阵之后,按照线性码的编码方式,计算出N-K个效验bit.
Step1: 根据原始TB块大小确定是否分割码块,码块添加CRC, 码块大小为K,确定每个码块的graph 和K 的大小,输出码块bit为dk.
对于单个码块,K个bit中包含了K’_L个原始bit ,K’ = B’/C, L 个CRCbit, K-K‘个’padding bit ,
Setp2: 从原始码块中取值生成dk, 将ck 从2Zc 开始一直填充到K -2Zc个bit,作为dk的输出,填充到d0 ---d(K-2Zc)
这里相当于将2Zc个bit 打掉。
Setp3: 根据校验矩阵产生N- (K-2 * Zc)个校验Bit。
根据第一个公式,根据系统bit 和矩阵A,B,计算得到P1对应的效验bit.P1包含4bit的效验Bit, 具体的计算过程如下:
------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- -------------------------------------
%% 0423:by clarilb 以BG1为例,分块矩阵[A,B.C; D,E,F]; 其中,C 是全0矩阵,F是单位矩阵, A*S'+B*P1' = 0; D*S'+E*P1' + F*P2' = 0.
%% step1, 利用核心矩阵A 【4 *22】的矩阵和系统Bit序列 c ,zc = 192, length(c)= 4224,在GF(2)计算下,第一个校验bit序列(Zc长度) = A矩阵和系统bit 求和的结果
% A*S'+B*P1' = 0;, 其中B 具有准对角结构,根据GF(2)的计算,得到在GF(2)计算下,P1中第一个校验bit序列(Zc长度) = A矩阵和系统bit 求和的结果
v = [ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
[307, 19, 50, 369, nan, 181, 216, nan, nan, 317, 288, 109, 17, 357, nan, 215, 106, nan, 242, 180, 330, 346];
[76, nan, 76, 73, 288, 144, nan, 331, 331, 178, nan, 295, 342, nan, 217, 99, 354, 114, nan ,331, nan, 112];
[205, 250, 328,nan, 332, 256, 161, 267, 160,63, 129, nan, nan, 200, 88, 53, nan, 131, 240, 205, 13 , nan];
[276, 87, nan, 0, 275, nan, 199, 153, 56, nan, 132, 305, 231, 341, 212, nan, 304, 300, 271, nan , 39, 357]]
d = reshape(c,192,22)
%% 矩阵A 和 序列C 以ZC为单位进行相乘,C的序列被分成ZC小段,每一个小段乘上A矩阵里的元素相当于小段进行左移对应的mod(V(i,j),Zc)位。
for v_index = 1:4
for index = 1:size(d,2)
if ( ~isnan(v(v_index+1,index)))
ff(:,index)= circshift(d(:,index),-mod(v(v_index+1,index),192)) %% 左移对应的长度
else
ff(:,index) = 0;
end
end
for index = 1:size(d,1)
g(v_index,index) = mod(sum(ff(index,:)),2)
end
end
p0 = mod(sum(g),2)'
%% 求出P0之后,继续求P1 A 矩阵的第一行和C序列的求和结果 = P0 左移1bit + P1, 则P1 = 求和结果 +P0左移1bit
p1 = mod(g(1,:)' + circshift(p0,-1), 2)
% 求出P1 之后,继续求p3; A 矩阵的第4行和C序列的求和结果 = p0 左移1bit + p3,
p3 = mod(g(4,:)' + circshift(p0,-1), 2)
% 最后求P2, A 矩阵的第3行和C序列的求和结果 = p2 + p3,
p2 = mod(g(3,:)' + p3, 2)
%% step2: 求取p2的校验bit, 校验矩阵中的分块矩阵D,E,F 分别和S,P1,P2相乘,得到 D*S'+E*P1' + F*P2' = 0. F 是单位矩阵,根据GF(2).P2 = D*S'+E*P1'. 后续就是乘加模2操作了
------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- ------------------------------------- -------------------------------------
计算A矩阵和系统bit的矩阵乘时,利用如下方式可以简化计算:
校验矩阵的每一个Zc*Zc的单位矩阵经过右移位mod(Vij,Zc)之后的矩阵 *( Zc个系统Bit)列向量 =(Zc个系统bit)列向量左移对应的位数。
在P1 计算出来之后,根据第二个公式计算P2效验Bit,从而得到所有的效验bit.
-------------------------------------
浙公网安备 33010602011771号