ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

非二进制LDPC的EXIT图分析:互信息估计与蒙特卡洛仿真实践

非二进制LDPC的EXIT图分析:互信息估计与蒙特卡洛仿真实践 简介一套面向非二进制LDPC码NB-LDPCEXIT特性分析的MATLAB源码包适用对象为通信、纠错编码方向的研究者、研究生与通信算法工程师。资源围绕非二进制EXIT图这一核心展开既包含非二进制互信息函数的理论计算也涵盖稀疏校验矩阵构造、消息传递算法迭代解码、EXIT曲线绘制以及不同信噪比或迭代次数下的性能仿真可以从仿真层面还原非二进制LDPC解码过程并评估系统潜在性能。压缩包为RAR格式共34个文件主体为30个m脚本另有2个mat数据文件和2个txt说明文件整体大小约362KBm脚本按计算、构造、解码、绘图、仿真等模块划分mat用于加载已有的多项式/概率数据txt提供使用说明或来源信息目录结构便于按需调用。已有227人学习/下载。通过该代码库可以深入理解非二进制信道解码器与译码器之间的信息交换机制并为码字构造、迭代解码优化、EXIT图对比分析等后续研究提供可直接运行的基础工具。1. 非二进制LDPC的EXIT图分析为什么二进制LDPC上验证过的收敛性预测方法换到GF(q)码上就不能直接照搬在LDPC码型设计里EXIT图外部信息转移图一直比误码率曲线更早给出判断不用跑完整个译码仿真把变量节点和校验节点之间的互信息传递画成两条曲线交叉点的位置就能告诉你这个码能不能收敛、收敛门限在哪。二进制LDPC的这套方法已经非常成熟J函数、高斯近似、解析绘制整套流程在一小时内能跑完。但一旦把校验矩阵定义到GF(4)、GF(8)甚至GF(16)上消息结构从单个LLR变成q维概率向量对称高斯假设也不再成立原来的EXIT分析直接搬过去就会画出一条过度乐观的曲线。这篇文章讲的是非二进制LDPCNonBinaryLDPC的EXIT图怎么算蒙特卡洛仿真怎么设定参数、符号级互信息怎么估计、变量节点和校验节点的EXIT曲线怎么拼以及实际实现里会踩到的几个坑。适合正在评估NB-LDPC码、想在设计阶段快速筛掉差码的从业者。2. 从二进制EXIT图到非二进制LDPC不能照搬的三个关键点2.1 二进制EXIT图的原理为什么两条曲线能预测收敛二进制LDPC的迭代译码可以拆成两个独立的子系统变量节点解码器VND和校验节点解码器CND。EXIT图的做法是分别测量这两个子系统的“输入先验互信息I_A”和“输出外部互信息I_E”然后画在同一张图上。VND曲线通常从某个初始值向上爬CND曲线从高位下降两条曲线的相对位置决定译码是否收敛。关键判据是如果VND曲线始终压在CND曲线上方两条曲线之间形成一条“开放通道”每一轮迭代都让互信息往更大的方向走译码会最终收敛到高可靠区域。如果两条曲线在某个点交叉后VND曲线掉到CND下方那么交叉点之后互信息不再增长译码就卡死了。在实际使用中人们不直接跑完整译码过程而是给某个子系统注入一个统计分布已知的合成先验消息测出该子系统的传递函数。这就是EXIT图能做“门限预测”而不必跑完整蒙特卡洛仿真的原因。二进制情况下这个互信息有解析近似。信道LLR在对称高斯假设下有I J(σ)这个经典关系VND的传递函数可以写成若干J函数的组合CND的传递函数则通过对偶关系套用同一组公式。解析法的价值在于快适合在码搜索阶段扫描大量候选码型缺点是它对LLR分布的形状有强假设。蒙特卡洛法慢很多但统计的是真实消息流的互信息不依赖分布假设。在二进制LDPC上两种方法通常能对上所以大家默认这条路径是通的。2.2 非二进制LDPC下的三个关键变化从标量消息到概率向量第一个变化是消息维度。二进制LDPC的BP消息是一个实数LLR表示“这一位是0或1的似然差”。非二进制LDPC在GF(q)上工作每个符号有q种取值BP消息是一个长度为q的概率向量实际实现里为了数值稳定通常存成q个LLR。消息从标量变成向量不是多做几个循环那么简单而是所有概率运算都必须满足归一化所有更新都要考虑联合分布。第二个变化是互信息的定义。二进制LDPC的I_A和I_E都是比特级互信息。非二进制LDPC研究里更常用的是符号级互信息I(X; L)其中L是对应GF(q)符号的LLR向量。它衡量的是“看到q个LLR之后对整个符号X知道多少”。比特级互信息是把符号拆成log2(q)个比特逐比特算符号级是把符号当成一个整体。二者并不等价当后验概率集中在某几个符号上时比特级互信息会被比特间相关性拉低符号级互信息仍然能反映符号判决的确定性。画EXIT图时如果选错定义曲线和实际误码率行为会对不上。第三个变化是高斯对称性假设崩塌。二进制EXIT图的关键简化之一是LLR分布具有对称性于是I_A只需一个参数σ就能描述先验消息的统计特性J函数可以直接套。非二进制情况下q维LLR向量的联合分布不具备这种对称性即使消息来自高斯信道经过GF(q)上的校验节点更新后对应的等效分布也不再有解析表达式。结果是解析法在NB-LDPC上基本只能退化成一个粗糙的上界估计蒙特卡洛仿真成了唯一可靠的手段。2.3 什么阶段用什么方法解析法做初筛蒙特卡洛做裁决我的习惯是码搜索的第一轮用解析近似扫全空间但会明确标注这是初筛结果不拿它当作门限结论。进入候选列表之后的码全部换成蒙特卡洛EXIT仿真做精确评估。反过来做会非常浪费时间——先花一周在解析模型上调一个不存在的对称性假设最后发现曲线和仿真对不上等于白干。具体到参数选择如果码长很短几百个符号量级、或者码率偏离1/2比较多、或者用的是GF(8)以上高阶域我建议直接跳过解析法上蒙特卡洛。因为短码的有限长效应会让EXIT曲线的形状偏离渐近值高阶域的消息分布更复杂解析近似在这些场合几乎没有参考价值。3. 用蒙特卡洛仿真计算非二进制LDPC的EXIT曲线从互信息估计到曲线拼接3.1 参数怎么设码长、信噪比、帧数、估计方法蒙特卡洛EXIT仿真本质上是把真实BP译码过程跑若干帧在每一轮迭代后统计变量节点和校验节点输出消息的互信息。参数设置直接影响曲线质量和耗时我常用的默认值如下参数典型值说明符号码长N10002000按符号计不是比特域阶数q4、8、16GF(4)调试最快GF(16)才有明显误差底信噪比Eb/N01.04.0 dB扫门限时步进0.2 dB蒙特卡洛帧数20005000帧数不足时曲线抖动明显最大迭代次数50100NB-LDPC收敛慢迭代太少曲线不完整互信息估计方式直方图法无分布假设稳妥这里有个基本设定要注意发射符号怎么选。LDPC是线性码理论上可以用全零码字假设来减少仿真量。二进制情况下这个假设在对称信道上严格成立但在非二进制场合要格外小心——GF(q)符号经过星座映射后全零符号对应的调制点未必和信道的对称性匹配。如果星座映射的顺序没配对全零码字假设会直接污染互信息统计画出来的曲线比真实情况高出一截。3.2 符号级互信息估计一段可以直接用的MATLAB函数互信息估计是整条链路里最容易被低估的一步。我见过很多团队在译码器上花了一周优化互信息估计却用了个简化公式最后曲线趋势全错。符号级互信息的定义是I(X; L) H(X) - H(X|L)对等概率符号H(X) log2(q)问题就落在条件熵上。条件熵可以用蒙特卡洛均值近似对每一帧取真实符号对应的后验概率p_true计算log2(1/p_true)的均值。function I sym_mutual_info(L, X) % 输入 % L: q x N 矩阵第k列是对应符号x_k的q维LLR % X: 1 x N 向量真实发射符号取值0到q-1 % 输出 % I: 符号级互信息单位 bit/sym % q size(L, 1); N length(X); % softmax把LLR转回后验概率每列减去最大值防止exp溢出 L_s L - max(L, [], 1); P exp(L_s); P P ./ sum(P, 1); % 归一化得到概率质量函数 % 取真实符号对应的后验概率 idx sub2ind([q, N], X(:) 1, 1:N); p_true P(idx); % 符号级互信息 log2(q) - 条件熵的蒙特卡洛均值 I log2(q) - mean(log2(1 ./ p_true)); end这段代码的逻辑是先用softmax把LLR向量转成后验概率然后只取真实符号位置的概率。如果译码器对某个符号很有把握p_true接近1log2(1/p_true)接近0条件熵小互信息高如果后验分布在q个符号上摊平p_true接近1/qlog2(1/p_true)接近log2(q)互信息趋近0。用这种估计方式不需要任何分布假设收敛性只和帧数有关。参数上要注意两点。第一max减法那行不能省LLR绝对值能到几十甚至上百直接exp会溢出成Inf。第二X的取值必须是0到q-1的整数索引GF(q)元素和索引的映射关系在译码器里就要约定好否则sub2ind取错位置互信息会严重偏低。3.3 变量节点和校验节点的EXIT统计完整的跟踪式仿真骨架得到互信息估计函数之后下一步是在BP译码循环里周期性统计。这里我用的方法是“跟踪式EXIT”——直接跑真实BP译码每一轮迭代结束后分别统计变量节点输出消息和校验节点输出消息的互信息两条序列就构成EXIT轨迹。这种做法不需要额外合成先验消息实现最直接也最能复现真实译码器的行为。function [I_V, I_C] nb_ldpc_exit_track(H, X, L_ch, max_iter) % 输入 % H: GF(q)上的校验矩阵M x N稀疏存储 % X: 1 x N 真实发射符号 % L_ch: q x N 信道LLR % max_iter: 最大迭代次数 % 输出 % I_V: 每轮迭代后变量节点输出消息的互信息 % I_C: 每轮迭代后校验节点输出消息的互信息 q size(L_ch, 1); N length(X); [M, ~] size(H); % 变量节点消息初始化为信道LLR M_v L_ch; M_c2v zeros(q, N); % 从校验节点来的先验消息首轮为零 I_V zeros(1, max_iter); I_C zeros(1, max_iter); for it 1:max_iter % ---- 变量节点更新信道LLR 校验节点先验 ---- % 严格的外部消息应减去目标边自身路径 % 这里用全消息统计EXIT曲线会略微偏乐观后续可再精确化 M_v_out L_ch M_c2v; I_V(it) sym_mutual_info(M_v_out, X); % ---- 校验节点更新GF(q)域上的消息合并 ---- M_c_out zeros(q, N); for m 1:M % 找参与该校验的变量节点集合 edges find(H(m, :)); dc length(edges); % 对每条边计算排除自身后的校验消息 % gf4_check_node_update 是GF(q)专用实现 % 内部做符号置换、域上卷积和逆置换 msg_tmp gf4_check_node_update(M_v_out(:, edges), H(m, edges)); M_c_out(:, edges) M_c_out(:, edges) msg_tmp; end I_C(it) sym_mutual_info(M_c_out, X); M_c2v M_c_out; % 作为下一轮变量节点的先验 end end这段骨架有几点需要说明。第一它假设你已经有一个可用的BP译码器gf4_check_node_update是校验节点更新的核心——在GF(q)上做符号置换、概率卷积和逆置换。如果从零开始实现GF(4)的校验节点更新可以写成四点的概率卷积GF(16)就得考虑用快速沃尔什-哈达玛变换或者对数域简化否则复杂度会随q平方增长。第二M_c_out的累加方式需要和你的译码器一致。有些实现会在这里做归一化有些不会。归一化不影响相对趋势但会影响跨帧统计的一致性建议在统计EXIT之前先归一化。第三变量节点更新里我注释提到“全消息”和“外部消息”的区别。严格EXIT图要求统计外部消息——即排除目标边自身的贡献。工程上如果只想看趋势全消息统计也能用但曲线会整体偏高门限估计偏低。这是个需要记住的偏差来源。4. 非二进制LDPC的EXIT分析避坑手册五条踩坑记录4.1 现象帧数加大后互信息曲线还在抖动而且偏高一截有的人在画EXIT曲线时发现曲线抖动严重加大帧数到一万帧还在抖而且互信息值明显比特么仿真的误码率表现要好。原因绝大多数出在互信息估计上直方图法在样本量不足时会有偏置LLR向量维度越高需要的样本量越大。GF(16)的16维LLR向量比GF(4)的4维分布要难估计得多。解决方法是两步。第一步用我前面写的sym_mutual_info这种基于经验后验均值的估计方式它比直方图法收敛快。第二步对每条曲线至少跑2000帧如果信噪比接近门限区域建议加到5000帧以上。另外不要在同一个信噪比上反复试错先跑一个信噪比点看方差方差大到不能接受再加帧数。4.2 现象exp溢出导致互信息计算出NaN曲线直接断裂GF(q)的LLR在迭代中会变得很大尤其是高信噪比时某些符号的LLR可能到几十甚至上百。如果直接expMATLAB里返回Inf除法和log都会出问题。这个坑在二进制LDPC里也存在但非二进制因为多了一个softmax归一化步骤更容易触发。解决方法是所有涉及exp的地方都先减最大值。除了互信息估计函数里的max减法校验节点更新里如果也做概率换算同样要先减最大值再exp。另外概率域运算会频繁出现“概率乘到接近0”的情况这时对数域加法是更好的选择。我建议在GF(4)阶段就用对数域实现后面扩到GF(8)、GF(16)不会返工。4.3 现象Windows下编译C/MEX时报cl.exe failed with exit status 2很多NB-LDPC的快速仿真代码依赖C扩展或MEX文件。在Windows上用Visual C编译时经常遇到这类错误error: command c:\users...\cl.exe failed with exit status 2。这个错误本身很笼统真正原因要看它前面的编译日志。常见的三类原因一是Visual C编译器版本和MATLAB不匹配二是路径里有空格或中文导致include目录找不到三是代码里用了C99特性而编译器默认没开。我的处理顺序是先确认MATLAB的mex -setup指向了正确的编译器版本——GBK路径很容易出问题建一个纯英文路径的项目目录是省心的做法。然后检查编译选项是否缺少-stdc99或-stdc11。如果日志里出现ld returned 1 exit status多半是链接阶段的.lib路径没配好去查MATLAB的mex配置里linker的include和lib路径。4.4 现象校验节点EXIT曲线不下降始终贴在1.0附近校验节点输出互信息理论上从高位随迭代下降或保持高位但如果在仿真中它一直饱和在1.0附近整条曲线没有可用信息EXIT图无法判断交叉点。最常见的原因是信噪比设置得过高——在校验节点看来消息可靠度已经足够高互信息直接饱和。解决方法是压低信噪比重新扫描。我通常先用理论门限减去0.51.0 dB作为起点然后以0.2 dB步进向上扫直到两条曲线出现交叉。另外要注意迭代次数不能太少NB-LDPC收敛比二进制慢通常要50轮以上曲线才会进入稳定形状只跑20轮会得到一条不完整的轨迹。4.5 现象EXIT曲线趋势正常但预测的门限和误码率仿真差0.5 dB以上如果把符号级互信息换成比特级互信息去画EXIT图会出现一个典型矛盾曲线形状看着合理预测门限却比实际误码率仿真乐观半dB以上。这是因为比特级互信息在消息分布不均匀时会被比特间相关性压低估导致曲线下降区域的位置偏移。解决方法是检查你统计的到底是I(X;L)还是逐比特互信息的叠加。在非二进制LDPC语境里EXIT图应该用符号级互信息。如果确需比特级指标做参考那就不要拿它的曲线交叉点去预测门限它只适合做相对比较。5. 用EXIT图做NB-LDPC参数筛选把门限预测当码搜索的第一道闸EXIT曲线最有价值的用法不是画完了看个趋势而是把它当作码搜索流程里的第一道筛子。误码率仿真要跑到10^-6量级才可靠时间成本很高EXIT仿真跑到几万帧、几十轮迭代就能判断一个候选码型值不值得继续投入。我自己的流程是先在GF(4)上验证EXIT门限和误码率仿真的一致性确认方法没问题之后再把这个流程推广到GF(8)和GF(16)去扫描度分布和行重。具体操作上我习惯固定码率和码长逐个扫描行重dv、dc的组合。每个组合只要跑一个低信噪比点的EXIT曲线记录曲线是否开放、交叉点位置对应的信噪比。所有组合跑完之后按门限从低到高排序只取排名前五的候选做完整误码率仿真。这一套筛下来通常能把候选数量从几十个压缩到个位数省掉大量仿真机时。还有一个细节EXIT曲线的“开口宽度”也是一种特征指标。开口越宽说明收敛余量越大对信道估计误差和数值实现的容忍度越高。两个门限接近的码型我优先选开口宽的因为实际系统里的实现损耗会让窄开口的码型吃亏。这个排序规则我用下来比只看门限更稳定。最后提一个习惯每次改仿真参数之前我会先在同一个信噪比下单独跑一次互信息估计函数人为构造一组已知互信息的消息来验证估计结果对不对。比如构造理想后验p_true 1和完全不确定的消息p_true 1/q确认函数返回log2(q)和0。这一步只需要几分钟能避免整个EXIT仿真做完才发现互信息估计有bug的尴尬。这个验证方法帮我挡过很多次“曲线形状很漂亮但结论全错”的翻车。EXIT图这个东西做二进制LDPC的时候觉得玄学真上手非二进制LDPC之后才知道它的边界在哪里。没有对称性可依赖没有解析J函数可套老老实实跑蒙特卡洛把互信息估计做扎实曲线自然会给出门限的可靠回答。希望这些实践记录对你有帮助。本文还有配套的精品资源点击获取
返回列表