对 DL-SCH 和 UL-SCH 的 LDPC 处理
此示例重点介绍了 5G NR 下行链路和上行链路共享传输信道(DL-SCH 和 UL-SCH)的低密度奇偶校验 (LDPC) 编码链。
共享信道参数
此示例使用 DL-SCH 来介绍处理,这也适用于 UL-SCH。
为在下行链路共享信道 (DL-SCH) 上发送的传输块选择参数。
rng(210); % Set RNG state for repeatability A = 10000; % Transport block length, positive integer rate = 449/1024; % Target code rate, 0<R<1 rv = 0; % Redundancy version, 0-3 modulation = 'QPSK'; % Modulation scheme, QPSK, 16QAM, 64QAM, 256QAM nlayers = 1; % Number of layers, 1-4 for a transport block
DL-SCH 编码参数是使用 nrDLSCHInfo 函数根据所选的传输块长度和目标编码率确定的。
% DL-SCH coding parameters cbsInfo = nrDLSCHInfo(A,rate); disp('DL-SCH coding parameters') disp(cbsInfo)
DL-SCH coding parameters
CRC: '24A'
L: 24
BGN: 1
C: 2
Lcb: 24
F: 244
Zc: 240
K: 5280
N: 15840
DL-SCH 支持多码字发送(即两个传输块),而 UL-SCH 仅支持单个码字。除了上面针对 DL-SCH 列出的内容之外,UL-SCH 还支持 pi/2-BPSK 调制。
使用 LDPC 编码处理传输块
从 MAC 层传送到物理层的数据称为传输块。对于下行链路共享信道 (DL-SCH),传输块会经历以下处理阶段:
CRC 附加、
代码块分割和代码块 CRC 附加、
使用 LDPC 进行信道编码、
码率匹配和代码块串联
然后,它被传递到物理下行链路共享信道 (PDSCH) 进行加扰、调制、层映射和资源/天线映射。每个阶段都由一个函数执行,如下所示。
% Random transport block data generation in = randi([0 1],A,1,'int8'); % Transport block CRC attachment tbIn = nrCRCEncode(in,cbsInfo.CRC); % Code block segmentation and CRC attachment cbsIn = nrCodeBlockSegmentLDPC(tbIn,cbsInfo.BGN); % LDPC encoding enc = nrLDPCEncode(cbsIn,cbsInfo.BGN); % Rate matching and code block concatenation outlen = ceil(A/rate); chIn = nrRateMatchLDPC(enc,outlen,rv,modulation,nlayers);
码率匹配和代码块串联过程的输出比特数必须与 PDSCH 的比特容量相匹配,具体视可用资源而定。在此示例中,由于没有对 PDSCH 进行建模,因此这被设置为基于先前选择的传输块大小来实现目标码率。
类似的处理也适用于 UL-SCH,其中物理上行链路共享信道 (PUSCH) 是 UL-SCH 码字的接收方。下面的原理图描述了两个信道的处理过程。

请参阅 nrDLSCH 和 nrULSCH System object,它们用于封装每个传输块的处理,并为重发提供额外支持。
信道
此示例中使用了一个不含噪声的简单两极信道。对于完整的 PDSCH 或 PUSCH 处理,还可以考虑衰落信道、AWGN 和其他 RF 损伤。
chOut = double(1-2*(chIn));
使用 LDPC 解码的接收端处理
DL-SCH 信道的接收端处理包含与发送端对应的双重操作,其中包括
码率恢复
LDPC 解码
代码块反分割和 CRC 解码
传输块 CRC 解码
每个阶段都由一个函数执行,如下所示。
% Rate recovery raterec = nrRateRecoverLDPC(chOut,A,rate,rv,modulation,nlayers); % LDPC decoding decBits = nrLDPCDecode(raterec,cbsInfo.BGN,25); % Code block desegmentation and CRC decoding [blk,blkErr] = nrCodeBlockDesegmentLDPC(decBits,cbsInfo.BGN,A+cbsInfo.L); disp(['CRC error per code-block: [' num2str(blkErr) ']']) % Transport block CRC decoding [out,tbErr] = nrCRCDecode(blk,cbsInfo.CRC); disp(['Transport block CRC error: ' num2str(tbErr)]) disp(['Recovered transport block with no error: ' num2str(isequal(out,in))])
CRC error per code-block: [0 0] Transport block CRC error: 0 Recovered transport block with no error: 1
如结果所示,在代码块和传输块级别都没有 CRC 错误。对于无噪声信道,这会实现传输块的无错恢复和解码,符合预期。
请参阅 nrDLSCHDecoder 和 nrULSCHDecoder System object,它们封装每个码字的接收段处理,并对重发进行额外的软组合以提高性能。
另请参阅
函数
nrLDPCEncode|nrRateMatchLDPC|nrRateRecoverLDPC|nrLDPCDecode|nrDLSCHInfo|nrCRCEncode|nrCRCDecode|nrCodeBlockSegmentLDPC|nrCodeBlockDesegmentLDPC|nrULSCHInfo|nrDLSCHDecoder|nrDLSCH|nrULSCH|nrULSCHDecoder