主要内容

对 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 码字的接收方。下面的原理图描述了两个信道的处理过程。

请参阅 nrDLSCHnrULSCH 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 错误。对于无噪声信道,这会实现传输块的无错恢复和解码,符合预期。

请参阅 nrDLSCHDecodernrULSCHDecoder System object,它们封装每个码字的接收段处理,并对重发进行额外的软组合以提高性能。

另请参阅

函数

主题