我是靠谱客的博主 干净山水,这篇文章主要介绍UCI和数据复用在pusch上传输(第六部分)---ldpc编码,现在分享给大家,希望可以做个参考。

ldpc编码针对的是上下行数据的编码,也是5G最重要的一种编码。

1 TB块添加CRC

这个是和UCI POLAR区别的一个地方,UCI是对每个cb块添加crc.
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% Get transport block size after CRC attachment according to 38.212 % 6.2.1 and 7.2.1, and assign CRC polynomial to CRC field of output % structure info if A > 3824 L = 24; info.CRC = '24A'; else L = 16; info.CRC = '16'; end **此处会对TB块进行crc的添加,具体添加crc的过程已经在上一篇文章 《UCI和数据复用在pusch上传输(第五部分)---polar编码》分享过了, 这里就不在做复述。**

2 graph选择

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
% LDPC base graph selection if A <= 292 || (A <= 3824 && R <= 0.67) || R <= 0.25 bgn = 2; else bgn = 1; end

3 cb块分段和cb块添加crc

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
具体添加crc的过程已经在上一篇文章
《UCI和数据复用在pusch上传输(第五部分)—polar编码》分享过了,
这里就不在做复述。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
% Get the maximum code block size if bgn == 1 Kcb = 8448; else Kcb = 3840; end % Get number of code blocks and length of CB-CRC coded block if B <= Kcb L = 0; C = 1; Bd = B; else L = 24; % Length of the CRC bits attached to each code block C = ceil(B/(Kcb-L)); Bd = B+C*L; end % Obtain the number of bits per code block (excluding CB-CRC bits) cbz = ceil(B/C); % Get number of bits in each code block (excluding filler bits) Kd = ceil(Bd/C); % Find the minimum value of Z in all sets of lifting sizes in 38.212 % Table 5.3.2-1, denoted as Zc, such that Kb*Zc>=Kd if bgn == 1 Kb = 22; else if B > 640 Kb = 10; elseif B > 560 Kb = 9; elseif B > 192 Kb = 8; else Kb = 6; end end Zlist = [2:16 18:2:32 36:4:64 72:8:128 144:16:256 288:32:384]; Zc = min(Zlist(Kb*Zlist >= Kd)); % Get number of bits (including <NULL> filler bits) to be input to the LDPC % encoder if bgn == 1 K = 22*Zc; %这块为啥一定要是Zc的倍数,这个是个问题? else K = 10*Zc; end

4 UL_SCH的通道编码(这是编码最难的部分需要进一步搞清楚)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
% Get lifting set number ZSets = {[2 4 8 16 32 64 128 256],... % Set 1 [3 6 12 24 48 96 192 384],... % Set 2 [5 10 20 40 80 160 320],... % Set 3 [7 14 28 56 112 224],... % Set 4 [9 18 36 72 144 288],... % Set 5 [11 22 44 88 176 352],... % Set 6 [13 26 52 104 208],... % Set 7 [15 30 60 120 240]}; % Set 8 for setIdx = 1:8 % LDPC lifting size set index if any(Zc==ZSets{setIdx}) break; end end % Pre-stored H types for each BGN and setIdx pair % 这个是怎么来的不知道,需要进一步看看 Htype = {3, 3, 3, 3, 3, 3, 2, 3; 4, 4, 4, 1, 4, 4, 4, 1}; % Get the matrix with base graph number 'bgn' and set number 'setIdx'. % The element of matrix V in the following is H_BG(i,j)*V(i,j), where % H_BG(i,j) and V(i,j) are defined in TS 38.212 5.3.2; if V(i,j) is not % defined in Table 5.3.2-2 or Table 5.3.2-3, the elements are -1. % %这个就是协议中的v_ij switch bgn case 1 switch setIdx case 1 V = bgs.BG1S1; case 2 V = bgs.BG1S2; case 3 V = bgs.BG1S3; case 4 V = bgs.BG1S4; case 5 V = bgs.BG1S5; case 6 V = bgs.BG1S6; case 7 V = bgs.BG1S7; otherwise % 8 V = bgs.BG1S8; end Nplus2Zc = Zc*(66+2); otherwise % bgn = 2 switch setIdx case 1 V = bgs.BG2S1; case 2 V = bgs.BG2S2; case 3 V = bgs.BG2S3; case 4 V = bgs.BG2S4; case 5 V = bgs.BG2S5; case 6 V = bgs.BG2S6; case 7 V = bgs.BG2S7; otherwise % 8 V = bgs.BG2S8; end Nplus2Zc = Zc*(50+2);%为啥要求这和? end P = nr5g.internal.ldpc.calcShiftValues(V,Zc);%根据V和Zc得到P P=mod(V,Zc) % The element of matrix P in the following is P(i,j) in TS 38.212 5.3.2 % when V(i,j) are defined in Table 5.3.2-2 or Table 5.3.2-3. If not % defined, the elements are -1. P = zeros(size(V)); for i = 1:size(V,1) for j = 1:size(V,2) if V(i,j) == -1 P(i,j) = -1; else P(i,j) = mod(V(i,j),Z); end end end P1 = P(:,1:(size(P,2) - size(P,1)));%取了P的前面(52-42)或者(67-45)行,为啥要取这个? C = size(infoBits,2); %获取层数 codewords = zeros(Nplus2Zc,C); % Get shift values matrix P = nr5g.internal.ldpc.calcShiftValues(V,Zc); P1 = P(:,1:(size(P,2) - size(P,1))); C = size(infoBits,2); codewords = zeros(Nplus2Zc,C); for r = 1:C % Per code-block processing only infoVec = reshape(infoBits(:,r),Zc,[]);%将信息bit(协议中的C_k)变成Zc行,K/Zc列。 d = blockMultiply(P1,infoVec); d0 = d(:,1:4); % Solve 4 equations for Htype * m = d0 switch Htype{bgn,setIdx} case 1 % H1 = [ 1 0 -1 -1; % -1 0 0 -1; % 0 -1 0 0; % 1 -1 -1 0 ]; m1 = sum(d0, 2); m2 = d0(:,1) + m1([2:end 1]); m3 = d0(:,2) + m2; m4 = d0(:,3) + m1 + m3; case 2 % H2 = [ 0 0 -1 -1; % 105 0 0 -1; % -1 -1 0 0; % 0 -1 -1 0 ]; m1 = sum(d0, 2); shift = mod(105, Zc); if shift > 0 m1 = m1([(end-shift+1):end 1:(end-shift)]); end m2 = d0(:,1) + m1; m4 = d0(:,4) + m1; m3 = d0(:,3) + m4; case 3 % H3 = [ 1 0 -1 -1; % 0 0 0 -1; % -1 -1 0 0; % 1 -1 -1 0 ]; m1 = sum(d0, 2); m2 = d0(:,1) + m1([2:end 1]); m3 = d0(:,2) + m1 + m2; m4 = d0(:,3) + m3; otherwise % == 4 % H4 = [ 0 0 -1 -1; % -1 0 0 -1; % 1 -1 0 0; % 0 -1 -1 0 ]; m1 = sum(d0, 2); m1 = m1([end 1:(end-1)]); m2 = d0(:,1) + m1; m3 = d0(:,2) + m2; m4 = d0(:,4) + m1; end % Get other parity bits P3 = P(5:end,size(P1,2)+(1:4)); p = blockMultiply(P3, [m1 m2 m3 m4]) + d(:,5:end); % Form codeword and assign to output codewords(:,r) = [infoBits(:,r); mod([m1; m2; m3; m4; p(:)],2)]; end end

5 速率匹配

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
% Get code block soft buffer size if ~isempty(Nref) fcnName = 'nrRateMatchLDPC'; validateattributes(Nref, {'numeric'}, ... {'scalar','integer','positive'},fcnName,'NREF'); Ncb = min(N,Nref); else % No limit on buffer size Ncb = N; end % Get starting position in circular buffer if bgn == 1 if rv == 0 k0 = 0; elseif rv == 1 k0 = floor(17*Ncb/N)*Zc; elseif rv == 2 k0 = floor(33*Ncb/N)*Zc; else % rv is equal to 3 k0 = floor(56*Ncb/N)*Zc; end else if rv == 0 k0 = 0; elseif rv == 1 k0 = floor(13*Ncb/N)*Zc; elseif rv == 2 k0 = floor(25*Ncb/N)*Zc; else % rv is equal to 3 k0 = floor(43*Ncb/N)*Zc; end end % Get rate matching output for all scheduled code blocks and perform % code block concatenation according to Section 5.4.2 and 5.5 out = []; for r = 0:C-1 if r <= C-mod(outlen/(nlayers*Qm),C)-1 E = nlayers*Qm*floor(outlen/(nlayers*Qm*C)); else E = nlayers*Qm*ceil(outlen/(nlayers*Qm*C)); end out = [out; cbsRateMatch(in(:,r+1),E,k0,Ncb,Qm)]; %#ok<AGROW> end end function e = cbsRateMatch(d,E,k0,Ncb,Qm) % Rate match a single code block segment as per TS 38.212 Section 5.4.2 % Bit selection, Section 5.4.2.1 k = 0; j = 0; e = zeros(E,1,class(d)); while k < E if d(mod(k0+j,Ncb)+1) ~= -1 % Filler bits e(k+1) = d(mod(k0+j,Ncb)+1); k = k+1; end j = j+1; end % Bit interleaving, Section 5.4.2.2 e = reshape(e,E/Qm,Qm); e = e.'; e = e(:); end

最后

以上就是干净山水最近收集整理的关于UCI和数据复用在pusch上传输(第六部分)---ldpc编码的全部内容,更多相关UCI和数据复用在pusch上传输(第六部分)---ldpc编码内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部