5G LDPC编码工程实战:从协议矩阵到高效Matlab实现
在5G新空口(NR)标准中,低密度奇偶校验(LDPC)码作为数据信道的核心编码方案,其性能与实现效率直接关系到整个通信系统的吞吐量与可靠性。对于通信算法工程师和FPGA开发者而言,仅仅理解LDPC的理论原理是远远不够的,如何将3GPP协议中那看似抽象的校验矩阵,转化为实际可运行、高效率的编码器,才是工程落地的关键挑战。本文将深入5G NR LDPC(QC-LDPC)的编码核心,绕过教科书式的理论推导,直接聚焦于工程实现细节。我们将从协议中的基础矩阵(BG)和循环移位值(lifting size)出发,一步步构建出完整的Matlab编码仿真模型,并剖析其中提升计算效率的关键技巧。无论你是正在进行链路仿真验证,还是为硬件实现寻找算法原型,这里提供的思路和代码都将为你提供坚实的起点。
1. 5G NR LDPC结构解析:从协议表格到矩阵构建
5G NR采用的LDPC码属于准循环LDPC(QC-LDPC)家族。这种结构的精髓在于,庞大的校验矩阵 H 并非随意生成,而是由一个小巧的基础矩阵(Base Matrix) 通过“提升”(Lifting)操作扩展而来。这极大地降低了存储和描述的复杂度。
1.1 基础矩阵(BG1与BG2)的选择策略
3GPP TS 38.212协议定义了两个基础矩阵:BG1 和 BG2。选择哪一个,并非随意,而是由目标码块大小和码率共同决定的。
- BG1: 尺寸为 46 行 × 68 列。它支持更大的信息块长度(K)和更高的码率,主要用于eMBB(增强移动宽带)场景中,对吞吐量要求极高的业务。
- BG2: 尺寸为 42 行 × 52 列。它支持相对较小的信息块长度和更低的码率,专为URLLC(超高可靠低时延通信) 和部分eMBB控制信道设计,其结构更利于快速编码和译码。
选择准则 通常基于一个关键的阈值 K_c。协议给出了明确的公式和表格,但我们可以用一个简单的经验法则来概括:当信息比特数 K 大于某个门限(例如,对于大多数码率,K > 3840 时倾向使用BG1,否则使用BG2),并且目标码率 R 高于约 1/3 时,优先考虑BG1。具体选择需要查表,但理解其背后的逻辑是:BG1的矩阵更大,可以构造出更长、码率更高的码,但编码复杂度也相应增加;BG2则更紧凑、更高效。
注意:基础矩阵中的每个元素都不是简单的0或1,而是一个整数,它指示了后续循环移位操作的具体值。值为
-1表示对应位置是一个Z x Z的全零方阵。
1.2 提升因子(Lifting Size)Zc的确定
选定了基础矩阵 B 后,我们需要确定提升因子 Zc。Zc 决定了最终校验矩阵 H 的粒度,它必须是协议规定集合 Z = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, 104, 112, 120, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384} 中的一个。
确定 Zc 的步骤:
- 根据信息比特长度
K和目标码率R,计算初步的码块大小K_b。对于BG1,K_b = 22;对于BG2,K_b可能是10或8,具体取决于K。 - 计算
Z的候选值:Z' = ceil(K / K_b)。 - 在集合
Z中找到不小于Z'的最小值,即为Zc。
这个过程确保了扩展后的信息位长度 K_b * Zc 略大于或等于原始的 K,不足的部分将通过“缩短”(Shortening)操作补零。
% 示例:确定Zc的函数
function Zc = getLiftingSize(K, bg)
% K: 信息比特长度
% bg: 1 或 2, 代表 BG1 或 BG2
% 返回确定的提升因子 Zc
% 协议定义的提升因子集合
ZSet = [2:16, 18:2:24, 26:2:32, 36:4:48, 52:8:96, 104:16:192, 208:32:384];
if bg == 1
K_b = 22; % BG1 的列数
else
if K > 640
K_b = 10;
elseif K > 560
K_b = 9;
elseif K > 192
K_b = 8;
else
K_b = 6;
end
end
Z_prime = ceil(K / K_b);
% 找到ZSet中 >= Z_prime 的最小值
Zc = min(ZSet(ZSet >= Z_prime));
end
1.3 从基础矩阵到扩展校验矩阵
得到了基础矩阵 B(大小为 m_b x n_b)和提升因子 Zc 后,我们就可以构造最终的 H 矩阵(大小为 m_b*Zc x n_b*Zc)。规则如下:
- 对于
B中的元素B(i, j):- 若
B(i, j) = -1,则在H中对应位置放置一个Zc x Zc的全零矩阵。 - 若
B(i, j) >= 0,则在H中对应位置放置一个Zc x Zc的循环移位单位阵。这个矩阵是单位矩阵向右循环移位B(i, j) mod Zc位后得到的。
- 若
% 示例:构建QC-LDPC校验矩阵H
function H = constructParityCheckMatrix(B, Zc)
% B: 基础矩阵 (m_b x n_b)
% Zc: 提升因子
% H: 生成的校验矩阵 (m_b*Zc x n_b*Zc)
[m_b, n_b] = size(B);
H = sparse(m_b * Zc, n_b * Zc); % 使用稀疏矩阵存储,至关重要!
for i = 1:m_b
for j = 1:n_b
shi

&spm=1001.2101.3001.5002&articleId=152552415&d=1&t=3&u=aa0431d19a2946388b8d824781ff24f4)
646

被折叠的 条评论
为什么被折叠?



