5G NR物理层:基于MATLAB的5G NR PDSCH信道编码(LDPC)与调制映射仿真
扫描二维码
随时随地手机看文章
在5G NR基站与终端的研发中,物理下行共享信道(PDSCH)是实现高速数据传输的核心。其采用的低密度奇偶校验码(LDPC)相比4G的Turbo码,具有更低的错误平层(Error Floor)和更高的并行译码效率。本文将利用MATLAB 5G Toolbox,实战演示PDSCH从信息比特到调制符号的完整仿真流程。
一、PDSCH处理链概览
PDSCH的典型处理流程为:传输块(TB)→ CRC附着 → LDPC编码 → 速率匹配 → 加扰 → 调制映射。MATLAB工具箱将这些步骤封装为高度优化的函数,非常适合算法验证。
二、LDPC编码与速率匹配
5G NR的LDPC码采用了准循环(QC)结构,支持非常灵活的码长和码率。
2.1 参数配置与编码
首先定义5G NR的关键参数,并生成随机传输块。
% --- 5G NR PDSCH参数配置 ---
carrier = nrCarrierConfig;
carrier.NSizeGrid = 52; % 带宽:52个RB (106个SC)
carrier.SubcarrierSpacing = 30; % 子载波间隔:30kHz
pdsch = nrPDSCHConfig;
pdsch.Modulation = '256QAM'; % 调制方式
pdsch.NumLayers = 2; % 层数
pdsch.NID = 42; % 小区ID
pdsch.RNTI = 1; % UE RNTI
% --- 生成传输块 (TB) ---
tbLen = 10000; % 传输块长度 (比特)
transportBlock = randi([0 1], tbLen, 1);
% --- CRC附着 ---
tbWithCRC = nrCRCEncode(transportBlock, pdsch.RNTI);
% --- LDPC编码 ---
% 获取目标码率 (例如 0.526)
targetCodeRate = 0.526;
% 计算编码后的比特数 (考虑调制阶数和层数)
modOrder = 8; % 256QAM -> log2(256)=8 bits/symbol
codedBitsLength = nrPDSCHCodewordLength(carrier, pdsch, modOrder);
% 执行LDPC编码
codedBits = nrLDPCEncode(tbWithCRC, codedBitsLength, targetCodeRate);
2.2 速率匹配与加扰
编码后的比特需要通过速率匹配适配物理资源,并进行加扰以对抗突发干扰。
% --- 速率匹配 (Rate Matching) ---
% 将编码比特映射到实际分配的RE上
rateMatchedBits = nrRateMatchLDPC(codedBits, carrier, pdsch);
% --- 加扰 (Scrambling) ---
ncellid = pdsch.NID; % 小区ID作为加扰种子
scrambledBits = nrScramble(rateMatchedBits, ncellid, pdsch.RNTI, 'PDSCH');
三、调制映射与OFDM符号生成
3.1 调制映射
将二进制比特流映射为复数调制符号。
% --- 调制映射 (Modulation Mapping) ---
symbols = nrSymbolModulate(scrambledBits, pdsch.Modulation);
% --- 层映射 (Layer Mapping) ---
% 将符号分配到多个传输层
layeredSymbols = nrLayerMap(symbols, pdsch.NumLayers);
% --- 预编码 (Precoding) ---
% 简单的空间复用(非波束赋形)
precodedSymbols = nrPrecode(layeredSymbols, pdsch.PRBSet, pdsch.NumLayers);
3.2 OFDM调制
将符号放置到资源网格并生成时域波形。
% --- 资源网格填充 ---
grid = nrResourceGrid(carrier);
[~, ~, dmrsIndices, dmrsSymbols] = nrPDSCHIndices(carrier, pdsch);
grid(dmrsIndices) = dmrsSymbols; % 插入DM-RS
dataIndices = nrPDSCHIndices(carrier, pdsch, 'Data'); % 获取数据RE索引
grid(dataIndices) = precodedSymbols; % 填充数据符号
% --- OFDM调制 ---
[waveform, info] = nrOFDMModulate(carrier, grid);
% --- 添加AWGN信道 ---
rxWaveform = awgn(waveform, 20, 'measured'); % SNR = 20dB
四、接收端处理与BLER曲线绘制
为了评估性能,我们需要构建接收端并进行蒙特卡洛仿真,绘制BLER(Block Error Rate)曲线。
% --- 接收端同步与解调 ---
[rxGrid, ~] = nrOFDMDemodulate(carrier, rxWaveform);
rxDataIndices = nrPDSCHIndices(carrier, pdsch, 'Data');
rxSymbols = rxGrid(rxDataIndices);
% --- 均衡 (简化版,假设理想信道) ---
% 在实际中需要利用DM-RS进行信道估计和均衡
equalizedSymbols = rxSymbols;
% --- 解调与解扰 ---
demodulatedBits = nrSymbolDemodulate(equalizedSymbols, pdsch.Modulation);
descrambledBits = nrDescramble(demodulatedBits, ncellid, pdsch.RNTI, 'PDSCH');
% --- LDPC解码 ---
% 使用BP (Belief Propagation) 算法
decodedBits = nrLDPCDecode(descrambledBits, codedBitsLength, targetCodeRate);
% --- CRC校验 ---
ber = sum(transportBlock ~= decodedBits(1:tbLen)) / tbLen;
bler = ~isequal(transportBlock, decodedBits(1:tbLen)); % 块错误
% --- 绘制BLER曲线 (循环不同SNR) ---
snrRange = -5:2:15; % dB
blerResults = zeros(size(snrRange));
for i = 1:length(snrRange)
% 在此循环中重复发送、加噪、接收和解码过程
% ... (省略重复代码) ...
blerResults(i) = currentBler;
end
figure;
semilogy(snrRange, blerResults, 'o-', 'LineWidth', 1.5);
grid on;
xlabel('E_s/N_0 (dB)');
ylabel('BLER');
title('5G NR PDSCH LDPC Performance (256QAM)');
legend('Simulation');
五、结语
通过MATLAB 5G Toolbox,工程师可以快速验证PDSCH的LDPC编码与调制方案。重点在于理解QC-LDPC的结构特性及其在不同码率下的瀑布区(Waterfall Region)表现,以及256QAM等高阶调制对SNR的苛刻要求。这套仿真流程是算法迭代和链路预算估算的基石。





