
“这个孔间距怎么来”我第一次听到有人把极化码的打孔和PCB包地打孔放在一起问的时候愣了几秒然后发现这个问题问得其实相当精准。做高速PCB的人都知道包地过孔不是随便打的间距要根据电磁波波长、回流路径和耦合需求来定打密了成本高、影响走线打稀了屏蔽效果直接崩做极化码速率匹配的人面对的问题几乎一模一样——删余位置选在哪儿、间隔怎么定直接决定了码率的灵活性、误码性能和译码复杂度。只是在编码领域这套“打孔间距”设计有一个专门的名字QUP准均匀打孔。这篇文章聊聊极化码里的缩短、打孔、删余特别是QUP这种准均匀打孔思路。面向做5G物理层、信道编码算法落地、或者正在啃Polar码的工程师和研究生目标是把“为什么要有速率匹配”“打孔和缩短到底什么区别”“QUP的孔间距到底是怎么来的”这几件事讲透。1. 极化码为什么需要速率匹配从一个“对不齐”的问题说起1.1 信道极化和极化码的编码基础极化码是Arikan在2008年提出的核心思想是利用信道极化现象把一组独立的二进制输入信道通过递归的极化变换变成一群容量两极分化的子信道——一部分子信道容量趋近于1另一部分趋近于0。编码的时候把信息比特放在容量高、可靠度高的子信道上把冻结比特放在可靠度低的子信道上接收端用SC或SCL译码器层层消除干扰还原出原始信息。这个编码框架本身很优雅极化码也是目前唯一一种被严格证明可以达到信道容量的编码方案这也是5G NR把Polar码选为控制信道编码方案的底气所在。但极化码有一个工程上绕不开的约束母码长度必须是2的幂次也就是N 2^n。这个约束来源于极化变换的递归结构——每次合并两个信道码长翻倍所以只有构造成2的幂次才能用统一的蝶形变换实现编码和译码。1.2 实际系统需要“任意码长”母码却只能“2的幂次”问题就出在“对齐”上。实际的通信系统里承载信息的比特数千变万化物理层控制信令可能只有32比特、40比特、72比特信道编码后的目标码长可能是48、64、96、128、144、256这些值它们中间有很大一部分不是2的幂次。比如目标码长是144比特直接用128码长不够用用256码长又多了112比特——这112比特不可能发出去因为时频资源是定死的多发比特就意味着占用额外资源在LTE和5G这种资源严格调度的系统里是不可接受的。那怎么办两种基本思路一种是在母码基础上做扩展也就是重复Repetition比特不够就复读几遍凑够另一种是做压缩也就是删余把母码中一部分比特在传输时去掉。前者适合码率特别低、冗余充分的情况后者适合大多数中高码率场景。所以速率匹配本质上就是解决“母码码长与资源承载码长不匹配”的问题打孔和缩短是删余的两种具体实现方式。提示极化码的速率匹配不是可选的优化项而是工程落地的必需步骤。只要你的系统不是恰好使用2的幂次码长就必然面对删余方案设计。2. 打孔与缩短删余的两种路线别混着用2.1 打孔的本质让接收端“当它不存在”打孔Puncturing是删余最直接的方式发射端把母码编码后的某些比特直接不发接收端在译码时对这些位置的比特做特殊处理——把它们的对数似然比LLR初始化为0也就是“收到一个完全不确定的比特”。LLR为0意味着什么它表示该比特为0和为1的概率各占一半没有任何信息量。但译码器仍然会在迭代过程中用极化码的结构约束来“补全”这些位置的信息所以打孔并不等于信息完全丢失而是把该比特的所有信息都寄托在与其相关的其它比特上。这也是为什么打孔位置的选择不能随意——如果打孔位置集中在码字的某个局部区域那一片比特的信息完全依赖少数几个相邻比特来恢复一旦这些依赖关系被极化结构削弱误码就会成片出现。2.2 缩短的本质把已知比特藏起来缩短Shortening的思路完全不同。它不是从编码后的任意位置删比特而是专门选择那些“收发两端都知道”的比特位置来删。具体做法是在编码前把这些位置上的比特固定为0作为冻结比特的一部分编码后把这些位置上的符号从发送序列中移除。接收端译码时对这些位置直接赋予LLR为一个很大的正值相当于告诉译码器“这个比特100%是0不用猜”。这就带来了一个显著的好处缩短不会破坏任何信息比特的传递通道因为被删的位置本来就没有承载信息。同时这些位置由于是已知的在译码过程中反而可以作为可靠的先验信息来辅助其它比特的译码而不是像打孔那样丢出一个个“未知空洞”。所以缩短的误码性能通常优于同等数量的打孔代价是它对删余位置有严格的限制——只能删冻结位不能碰信息位。2.3 两者怎么选可靠度损失、冻结位安排与译码复杂度实际工程里怎么选不是拍脑袋要看删余率和工作点。对比维度打孔缩短删余位置性质任意比特位置但一般不选信息位必须是冻结位已知比特接收端LLR处理初始化为0代表完全不确定初始化为极大值代表已知为0对可靠度的损失明显损失被删比特的邻域可靠度下降损失极小删的是已知冗余适用场景高码率、灵活删余比例、删余数量大中低码率、对性能敏感、删余数量适中硬件实现复杂度稍高需要维护打孔集合相对简单位置固定5G NR的Polar码速率匹配方案中控制信道采用了一种组合策略根据目标码率和删余数量的关系在缩短和打孔之间自动切换。设计逻辑其实很直白删余数量相对母码长度比较少时用缩短的收益更高删余数量接近一半时缩短已经找不到那么多可以牺牲的冻结位了往往退化为打孔。3. QUP准均匀打孔打孔位置也有“均匀分布”的讲究3.1 均匀打孔的直觉与误区说到打孔位置的选取一个最朴素的直觉是“均匀地删”。如果母码长度是1024要删256个比特那就每隔4个位置删1个听起来很公平但问题在于极化码的极化变换不是均匀作用于每个比特的。极化码的递归结构中不同级别的子信道经历的信道合并次数不同某些位置的比特在极化树中的“地位”天然就比其他位置更重要。如果只是按照码字索引做等间隔删余而不考虑极化变换的层级结构很可能一批关键位置恰好被打中导致性能悬崖式下跌。我见过不少初学者做仿真时随机生成打孔图样结果误码率曲线跑出来高得离谱第一反应是译码器写错了排查半天才发现是打孔位置太集中其实这就是均匀打孔直觉的第一个坑索引均匀不等于极化域均匀。3.2 QUP的核心思想让每个极化阶段“平均受伤”QUP全称是Quasi-Uniform Puncturing中文常译作准均匀打孔是王润鑫等人在2014年前后提出的一种针对极化码的删余方案。它的核心洞察在于打孔位置对码字的影响要通过极化变换来评估而不是只看索引距离。QUP要做的是让被删掉的比特在极化变换的每一层都尽量均匀分布而不是只在最终码字索引上均匀。怎么理解极化码的编码过程是把两个长度为N/2的子码通过异或和直传合并成N码长的过程。如果某个子码的某个局部区域被打孔那么该子码的整体可靠度会塌掉但如果我们把打孔位置分散在整个S极化结构的所有层级中每个层级受到的影响就是“轻微但均匀”的。打个比方一栋楼要拆掉一根柱子整栋楼可能晃如果每层都均匀地拆掉一小块墙体楼体整体承载虽然下降但不会塌——QUP就是后者。3.3 构造方法孔间距到底怎么定这里说说QUP在工程实践里怎么构造我直接用一套我实际仿真验证过的流程来说明。假设母码长度N 2^n目标码长MM N需要删余P N - M个比特。第一步把打孔点均匀铺在码字索引区间[1, N]上。核心递推方式是逐级二分第一个打孔点取在第N/2个位置然后在这一个点的左右两侧各取中点得到第二和第三个打孔点依此类推每个新打孔点都落在已有打孔点间隔最大的空隙中央。这个过程重复执行直到选出P个位置为止。第二步记录下每一轮选取的位置索引得到打孔集合S_QUP。这个集合的性质是任意时刻已选出的打孔点在索引上是近似均匀的最大间隔与最小间隔的比值不超过2。第三步也是最关键的一步用选出的打孔集合重新计算各子信道的可靠度。因为打孔点对应的LLR是0这些位置的比特无法直接提供信息极化变换后凡是与该位置存在依赖关系的子信道可靠度都会下降。所以可靠度排序必须基于打孔后的等效信道来计算不能直接沿用母码的排序结果。为什么说QUP是“准”均匀而不是“严格”均匀因为码长和删余数是整数打孔点的精确等间距在大多数情况下做不到比如N1024、P300平均间隔是3.41个比特不可能做到每个间隔完全相等。QUP用二分递推得到的是“尽可能均匀”的近似解因此冠以“准”字。注意QUP打孔集合的构造独立于具体的信息位集合但信息位的选择必须依赖打孔后的可靠度计算。两者不是先后孤立的两步而是“先定打孔集合再重新算可靠度最后选信息位”的联动关系。这个顺序搞反了性能立刻打回原形。4. 实操细节信息位选择、LLR初始化与硬件实现4.1 信息位选择与打孔位置的联动计算信息位选择的本质是在所有N个子信道中挑出可靠性排名前K个作为信息传输位置其余作为冻结位。没有打孔时各子信道的可靠度可以用巴氏参数Z(W)、密度进化或者高斯近似来计算得到的是一个固定排序表。加入打孔后这个排序表必须重算。原因在于打孔位置上的比特LLR被强制置为0在SC译码的逐步消除过程中这些位置的LLR为0会沿着极化树的路径向后续位传播。简而言之一个打孔点不仅在自身位置造成“信息空洞”还会连坐一串与之存在依赖关系的后续子信道。实操中我习惯这么做先跑一遍高斯近似可靠度计算对母码的N个子信道的噪声方差做初始化。将打孔集合S_QUP中每个位置的LLR初始化为0然后逐层计算各子信道的等效噪声方差。用修正后的方差排序选出前K个位置作为信息位。检查信息位集合与打孔集合是否重叠——理论上打孔位置不可能被选为信息位但如果可靠度计算精度不够可能出现边界位置的误判需要加一个强制排除规则。4.2 接收端LLR初始化的三种情况译码端拿到接收符号后需要区分三种比特位置分别做不同的LLR初始化正常传输比特根据调制方式和信道噪声计算LLR例如BPSK下LLR 2y/σ²打孔比特LLR直接置0表示完全无信息缩短比特LLR置为一个很大的正数比如100或按定点精度取最大值表示该比特确定为0。这里有个容易被忽略的点缩短比特在编码前就已经固定在冻结位但它在极化变换中依然参与了异或运算。把它设为极大的LLR相当于给译码器提供了一个强约束这种先验约束在低信噪比下能明显提升纠错能力。而打孔比特的LLR0则完全没有约束力纯粹靠码字结构来恢复。4.3 5G NR中的实际取舍与组合策略5G NR里Polar码速率匹配的实现并不是纯QUP或纯缩短而是一个分段决策的过程。NR协议中定义了基于打孔和缩短的组合方案当目标码长与母码长度差距较大时采用打孔方式差距较小时采用缩短方式。具体切换点由协议参数决定而仿真验证中一般会以误块率BLER曲线作为最终评判标准。这种组合策略的精髓在于扬长避短缩短性能好但可删位置有限打孔灵活但可靠度损失偏大。把两者混合使用让删余数量落在缩短的舒适区时优先缩短落在打孔的舒适区时再启用打孔整体性能曲线就能保持平滑不会因为某一段码长出现断崖式恶化。关于定点实现还有一点值得提醒硬件里LLR定点化时打孔位置置0是容易的缩短位置置极大值就需要考虑数据位宽比如8比特量化时最小值是-127最大值是127缩短位置就写成127或者-127取决于0映射的是正还是负。不要写一个中间值否则缩短的先验约束会被削弱一半误码率可能因此抬升0.1到0.2 dB。5. 常见问题与调试经验总结5.1 打孔后性能突然恶化先查是不是“可靠度重算”漏了不少人在做极化码仿真时第一步用现成的可靠度排序表选信息位第二步随便挑了一个打孔图样然后跑仿真发现BLER曲线陡得没法看。90%的情况是第一步和第二步之间缺失了“基于打孔图样的可靠度重算”。母码排序表只在无打孔时有效一旦引入了删余子信道可靠度必须基于等效信道重算。排查方法很简单写一个函数对比打孔前后各子信道的等效噪声方差看看被打孔影响的子信道数量是否和预期吻合。如果发现部分信息位恰好落在打孔邻域且方差变化超过阈值那说明信息位选得太激进需要削减对应位置的排序权重。5.2 打孔集合与信息位边界重叠可靠度计算方法不能“一刀切”QUP虽然保证了打孔位置在索引上的均匀分布但在可靠度重算之后仍然可能出现距离打孔位置很近的子信道排名偏高的情况。原因在于高斯近似的精度有限尤其是短码长场景N256时误差更明显。如果边界上的信息位恰好和打孔点有强依赖关系误码率会莫名其妙地变高。我的处理习惯是用密度进化做一次精算或者在高斯近似结果的基础上对打孔位置的依赖节点施加一个惩罚项。具体做法是将打孔点在各层的关联子信道的方差额外乘一个1.1到1.3的系数把边界位置“压”到冻结位去。这样做会牺牲少量吞吐率但BLER曲线会稳定得多。5.3 短码长和长码长的仿真差异QUP不是万能的短码长N32、64打孔时因为子信道数量少每个打孔点的影响范围相对更大QUP的“均匀”优势不如长码时明显。这时候更可靠的做法是直接遍历所有可能打孔图样做穷举搜索或者采用与深层信息位距离最大化的启发式规则。长码长N1024及以上时QUP的二分递推效率很高性能也接近穷举结果可以放心使用。这个差异也解释了为什么5G NR里不同码长参数下会选择不同的速率匹配策略。做方案选型时不要迷信某一种删余方式把N64、128、256、512、1024的BLER曲线都跑一遍选全局最优而不是只看某一档的表现。5.4 硬件实现中索引映射的坑软件仿真里信息位、冻结位、打孔位都是抽象索引错了还能查数组但硬件实现里这些索引要映射到存储器的物理地址和译码器的蝶形网络路由。常见错误是删余位置集合给了编码器但没有同步给译码器导致译码端把打孔位当真实比特处理LLR没有归零性能自然不对。我建议在硬件设计阶段就在接口上定死一个“配置帧”包含码长、删除数量、删余模式打孔还是缩短、打孔索引表编码器和译码器共用同一份配置。仿真时也要写一个校验脚本逐比特比对编码器的打孔索引和译码器的LLR初始化索引是否完全一致。这个坑我在联调时踩过不止一次每次都花了半天才定位到是配置不同步而不是算法本身的问题。另外关于定点精度LLR0的位置在定点化后就是0但缩短位置设置极大值时要确保后续迭代运算中这个极大值不会被饱和截断成一个小值。很多定点运算单元在两次迭代之间会做限幅如果限幅太小缩短位置的优势在几轮迭代后被抹平性能损失是“温水煮青蛙”式的很难一眼看出来。建议在定点仿真中单独统计缩短位置经过所有迭代后的LLR变化确保余量足够。6. 收尾的一点体会回到开头那个问题——孔间距怎么来。不管是PCB包地打孔还是极化码删余孔间距都不是拍脑袋定的它由对方对“影响范围”的分析决定。PCB里间距对应电磁耦合的抑制半径编码里间距对应极化变换的依赖深度。QUP之所以好用就是因为它把“间距”这个概念从索引域搬到了极化结构域用逐级二分实现了对整棵极化树的均衡打击。我个人在实际操作中的体会是脱离开具体的信噪比、码长、删余率谈打孔方案基本等于耍流氓。同样的QUP集合在N256和N1024下的增益差别非常大同样的删余比例在码率0.5和0.8时最优方案也不一样。所以写代码跑仿真时永远要把码长、删余率、信息位个数这三组参数摆在一起看跑出一张完整的BLER矩阵再来下结论。最后分享一个调试小技巧做极化码速率匹配仿真时不要只画BLER曲线把“打孔位置邻域子信道的平均可靠度下降量”也作为一个中间指标打出来。这个指标能帮你快速判断打孔图样是否合理——如果某个局部邻域的下降量明显高于全局平均值那就是图样扎堆了调整策略而不是盲目地堆译码迭代次数。这个习惯帮我省下了大量定位问题的时间。