在5G新空口(NR)标准中,低密度奇偶校验码(LDPC)被选为数据信道的核心编码方案,这主要得益于其在长码块下的优异性能表现。与4G时代广泛使用的Turbo码相比,LDPC码具有更低的解码延迟和更高的吞吐量,特别适合5G增强移动宽带(eMBB)场景下的高速数据传输需求。
LDPC码本质上是一种线性分组码,其核心特征在于稀疏的校验矩阵。这个矩阵中"1"的密度很低,就像一张大部分区域都是0的网格,只在特定位置有少量1值分布。这种稀疏性带来了两个关键优势:一是解码时可以并行处理多个校验方程,二是迭代解码时信息传递的效率更高。
在3GPP TS 38.212标准中,定义了两种基图(Base Graph):
每种基图实际上就是一个预设的校验矩阵模板,通过"提升"(lifting)操作可以生成不同大小的实际校验矩阵。提升大小z决定了最终的码块尺寸,标准中定义了从2到384共8组提升大小集合。
Arm RAN加速库对LDPC的实现严格遵循3GPP规范,同时针对Arm架构进行了深度优化:
实际测试表明,在Cortex-A77处理器上,该库的单核解码吞吐量可达1.2Gbps@2.5GHz,完全满足sub-6GHz频段的实时处理需求。
在开始编码前,需要确定几个关键参数:
c复制armral_ldpc_graph_t bg; // 选择基图类型(BG1或BG2)
uint32_t z; // 提升大小(参考TS 38.212表5.3.2-1)
uint32_t len_filler_bits; // 填充比特数
提升大小z的选择需要满足:
库提供了两个编码函数接口:
c复制// 常规版本(内部分配内存)
armral_status armral_ldpc_encode_block(
const uint8_t *data_in, armral_ldpc_graph_t bg,
uint32_t z, uint32_t len_filler_bits, uint8_t *data_out);
// 非分配版本(需预分配缓冲区)
armral_status armral_ldpc_encode_block_noalloc(
const uint8_t *data_in, armral_ldpc_graph_t bg, uint32_t z,
uint32_t len_filler_bits, uint8_t *data_out, void *buffer);
编码过程遵循标准中的系统化编码方案:
注意:编码器假设输入已经包含CRC校验位。对于BG1,CRC长度应为24A;BG2则使用16位CRC。
非分配版本需要预先计算工作缓冲区大小:
c复制uint32_t buffer_size = armral_ldpc_encode_block_noalloc_buffer_size(bg, z, len_filler_bits);
典型的内存需求如下表所示:
| 基图类型 | z值范围 | 典型缓冲区大小 |
|---|---|---|
| BG1 | 32-384 | 12-144 KB |
| BG2 | 16-192 | 6-72 KB |
在实际部署中,建议为每个编码线程预分配最大可能需要的缓冲区,避免运行时频繁申请释放内存。
Arm实现采用分层最小和(Layered Min-Sum)算法,相比传统的最小和算法有以下改进:
解码配置参数示例:
c复制uint32_t its_max = 8; // 最大迭代次数
uint32_t options = ARMRAL_LDPC_CRC_24A | ARMRAL_LDPC_CRC_EVERY_ITER;
核心解码函数同样提供两种变体:
c复制armral_status armral_ldpc_decode_block(
uint32_t n, const int8_t *llrs, armral_ldpc_graph_t bg,
uint32_t z, uint32_t len_filler_bits, uint8_t *data_out,
uint32_t its_max, uint32_t *its_out, uint32_t options);
// 非分配版本
armral_status armral_ldpc_decode_block_noalloc(
uint32_t n, const int8_t *llrs, ..., void *buffer);
输入LLR(对数似然比)的排列格式由options决定:
早期终止策略:
LLR量化:
并行计算:
速率匹配过程包括:
函数接口:
c复制armral_status armral_ldpc_rate_matching(
armral_ldpc_graph_t bg, uint32_t z, uint32_t e,
uint32_t nref, uint32_t len_filler_bits, uint32_t k,
uint32_t rv, armral_modulation_type mod,
const uint8_t *src, uint8_t *dst);
3GPP定义了4种RV模式(0-3),影响比特选择的起始位置:
| RV | 初始偏移 | 适用场景 |
|---|---|---|
| 0 | 0 | 初传 |
| 1 | 1/3 | 第一次重传 |
| 2 | 2/3 | 第二次重传 |
| 3 | 1 | 低码率场景 |
当接收端缓冲区有限时,需要通过nref参数限制最大软比特数:
code复制nref = min(Ncb, Nref)
其中Ncb = min(⌊Nsoft / Kc⌋, Kw)
Kc为码块组数,Nsoft为总软缓冲区大小。
在Arm Cortex-A77 @2.5GHz上的实测数据:
| 操作 | 码长 | 吞吐量 | 延迟 |
|---|---|---|---|
| BG1编码 | 8448 | 3.2Gbps | 2.6μs |
| BG1解码(5次迭代) | 8448 | 1.1Gbps | 7.5μs |
| 速率匹配 | 8448 | 4.8Gbps | 1.7μs |
解码失败率高:
内存越界错误:
性能不达标:
对于高信噪比(SNR>10dB)场景:
对于边缘小区用户(SNR<0dB):
在内存受限系统中:
在某5G小基站项目中的实施方案:
线程模型:
内存管理:
性能调优:
实测表明,相比标准实现,Arm RAN加速库可提升38%的吞吐量,同时降低22%的功耗。特别是在Massive MIMO场景下,多码块并行处理优势更为明显。