LDPC码的解码算法仿真,尤以MS、OMS、NMS、BP四种算法放在同一套框架下对比并输出误码率曲线,几乎是通信方向做信道编码必过的一道坎。很多人第一反应是直接调用MATLAB通信工具箱里封装好的函数,但工具箱把解码过程封装得太死,你换不了迭代次数、改不了消息更新规则,更看不到某个改进算法到底改在哪一步、省在哪一步。这个项目之所以有价值,是因为它从H矩阵生成、编码、BPSK调制、AWGN信道到四种解码器全部手写实现,每一行运算都摊开在面前,最后用同一套仿真参数输出可复现的误码率曲线。
做这套源码和文档的初衷很简单:有些读研的学弟学妹要跑LDPC对比实验,有些工程师想快速评估Min-Sum类算法在工程实现上的性能折损,还有些初学者只是想弄懂迭代译码到底在迭代什么。无论是哪种需求,手写一遍四种算法都比直接调包更能建立直觉。这篇文章就围绕这个仿真工程,把算法原理、链路搭建、代码逻辑、参数调优、常见坑位一次讲透。
1. 这个对比仿真真正要回答的三个问题
一个标题叫"MS,OMS,NMS,BP四种算法对比"的仿真,看起来只是画四条误码率曲线,但真正回答的其实是三个工程问题:四种算法性能上差多少、复杂度上差多少、实际选型时该怎么取舍。这三个问题不搞清楚,画出来的曲线只是一张图,没法指导任何决策。
1.1 四种算法的选取逻辑不是随机的
LDPC码从Gallager在1962年提出,到1996年被MacKay和Neal重新发现,再到今天成为5G NR、Wi-Fi 6/7、DVB-S2X等标准中的主流信道编码,核心优势就是性能逼近香农限且并行度高。但BP(置信传播)解码在硬件实现上很麻烦,校验节点更新涉及大量tanh和atanh运算,DSP上做查表、FPGA上做CORDIC,成本和吞吐都不理想。于是就有了Min-Sum(MS)近似,再进一步有了Offset Min-Sum(OMS)和Normalized Min-Sum(NMS)两种修正方案。
这套演进路线在学术论文里经常被一句话带过,但做仿真对比时你会发现一个有意思的现象:BP到MS的性能差距不是固定的,它跟迭代次数强相关。迭代次数越少,MS差距越大;迭代次数多了,差距会缩小但不消失。OMS和NMS则是在几乎不增加复杂度的前提下,把MS的损失往回拉了一大截。这篇源码就是要用仿真曲线把这个"拉回多少"量化出来。
1.2 仿真链路完整,后续扩展空间大
这个工程不是只写一个解码函数就交差,而是从发射端到接收端搭了一条完整的基带仿真链路:随机信息位生成、LDPC编码、BPSK映射、AWGN加噪、LLR初始化、迭代解码、误码统计。链路完整意味着你可以在任何一个环节做替换实验,比如换成QPSK调制,或者改成瑞利信道,或者把解码器里的NMS改成自适应归一化最小和,改动都只局限在对应模块内部,不会牵一发动全身。
从这个角度说,源码的定位不只是"交作业用",而是一个可复用的LDPC仿真框架。理解了链路里每个模块的接口约定,后续无论做高阶调制联合仿真,还是做HARQ重传机制验证,都可以在这个骨架上长出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法原理:BP到Min-Sum的两级简化
要让误码率曲线有说服力,得先理解四条曲线背后的计算逻辑差异。这四种算法之间不是并列关系,而是递进关系:BP是起点,MS是BP的简化,OMS和NMS是对MS的两个修正方向。
2.1 BP:在Tanner图上传递概率置信
LDPC码由稀疏校验矩阵H定义,H每一行对应一个校验方程,每列对应一个码字比特。把矩阵画成Tanner图,行对应校验节点,列对应变量节点,非零位置就是两者之间的一条边。BP解码的过程,就是在这些边上迭代交换软信息,用LLR(对数似然比)表示。
校验节点j发给变量节点i的消息为:
R_ji = 2 * atanh( prod_{i'∈N(j)\i} tanh(Q_i'j / 2) )
变量节点i发给校验节点j的消息为:
Q_ij = LLR_i + sum_{j'∈N(i)\j} R_j'i
其中LLR_i是信道先验信息。关键在于"排除自身"这个操作:变量节点更新时不能把自己刚传给校验节点的消息原样收回来,校验节点更新时也要排除当前目标边的消息,否则信息会在环路上自我强化,导致错误收敛。这个"外信息原则"是所有消息传递类算法的基础,后续MS、OMS、NMS都保留了这个结构。
BP的数值问题集中在tanh和atanh上。当LLR绝对值很大时,tanh趋近±1,atanh(±1)直接等于无穷大,仿真里不截断就会出现NaN。后面第6节会专门讲怎么处理。
2.2 MS:把tanh融合退化成"最小值+符号"
BP校验节点更新慢,核心原因是tanh和atanh运算没有简单的硬件实现。MS算法的出发点是一个数学观察:多个tanh乘积再atanh回来的结果,主要由绝对值最小的那个输入决定,其他输入的影响呈指数级衰减。于是就有了近似公式:
2 * atanh( prod tanh(x_i/2) ) ≈ sign(prod sign(x_i)) * min|x_i|
这个近似在直观上可以这样理解:一堆小于1的数相乘,结果比其中任何一个都小;atanh在自变量接近1时增长极快,所以乘积的大小主要被最小的那个因子卡住。用这个近似,校验节点更新从乘法加查表变成了求最小值加符号异或,硬件实现只需要比较器和异或门。
但近似是有代价的。MS给出的消息幅度偏大,因为它完全丢掉了其他因子共同作用造成的衰减。这个偏大在迭代中会累积,导致性能比BP差一截。
2.3 OMS与NMS:两个不同的修正思路
既然MS是"偏大",自然想到两种修正:把偏大的值压回去,或者直接减掉一个固定量。
NMS走的是乘法修正,把MS的结果整体乘一个小于1的归一化因子α:
R_ji = α * sign * min|Q|
OMS走的是加法修正,把最小值减掉一个正的偏移量β,减到负数就置零:
R_ji = sign * max(min|Q| - β, 0)
别小看这个区别。NMS的一个α乘法在定点实现里需要一个小乘法器,而OMS如果取β=0.5,可以用右移一位再相减来实现,连乘法器都省了。在FPGA资源受限的场景下,OMS的硬件友好度更高,这也是很多量产芯片里OMS依然有市场的原因。
两种方法的修正强度都是固定的,不随迭代次数或节点度数变化。后续很多改进算法做的是让α或β自适应,但这个工程先跑通固定参数版本,已经足够说明趋势。
2.4 复杂度与性能的初步判断
四种算法的复杂度和性能排序在理论上很清晰:
- BP:性能最优,校验节点需要tanh/atanh乘法运算,软硬件实现代价最大。
- NMS/OMS:性能接近BP,复杂度几乎和MS持平,只各多一个乘或减。
- MS:复杂度最低,但性能损失最大,尤其是在迭代次数受限时。
实际仿真里,OMS和NMS之间的性能差距很小,谁优谁劣跟码长、码率、迭代次数甚至α/β取值都有关系。论文里常见的说法是"NMS和OMS性能相当,均显著优于MS",这和你用具体参数跑出来的结果是一致的,只是差距的具体数值需要自己实测。
3. 仿真链路搭建:H矩阵、编码器和LLR初始化
解码算法本身只是接收机的一部分,要让解码器有东西可解,得先把发射链路搭对。链路里最容易出错的不是解码器,而是前面几步:H矩阵构错、编码矩阵生成错误、噪声方差换算错误,任何一个都会让误码率曲线偏离理论值。
3.1 选择QC-LDPC码并生成校验矩阵
仿真中常用的LDPC码有两类:随机构造的码和结构化构造的QC-LDPC码。这个工程建议使用QC-LDPC,原因有三:一是5G NR和802.11n标准里都是QC-LDPC,工程意义强;二是基矩阵加循环移位展开的结构便于在MATLAB里生成和验证;三是QC结构天然适合后面做分层调度等进阶优化。
以N=648、码率1/2的802.11n LDPC码为例,基矩阵大小为12×24,扩展因子Z=27,展开后
