5G 信道编码深度解析:LDPC 与 Polar 的原理、工程抉择与 Python 仿真实战

发布时间:2026/9/4 0:36:52
5G 信道编码深度解析:LDPC 与 Polar 的原理、工程抉择与 Python 仿真实战 5G 靠什么在嘈杂信道里不传错LDPC 与 Polar 这对黄金组合管着数据信道与控制信道的生死。本文从香农极限讲到工程抉择并用可复现的 Python 仿真亲手跑通两种编码——还发现了一个只有跑代码才能看见的4-环教训。引子5G 在嘈杂信道里凭什么不传错你有没有想过手机在高速地铁里、在人山人海的演唱会上为什么打电话、刷视频偶尔卡一下但消息基本传不错答案藏在 5G 物理层最硬核的一环——信道编码Channel Coding。5G NR 里负责纠错的是一对黄金组合LDPC 码数据信道和Polar 码控制信道[1]。这篇文章把这件隐形但决定生死的事讲透为什么需要信道编码、LDPC 和 Polar 各自凭什么入选 5G、5G 为什么数据用 LDPC、控制用 Polar——以及最重要的用 Python 亲手把这两种编码跑起来。文中所有仿真代码我都本地运行验证过输出是真实的可直接复现。一、为什么需要信道编码从香农极限说起1.1 噪声是物理定律不是 bug任何物理信道都有噪声电磁干扰、热噪声、多径衰落。信号一旦发出去接收端拿到的永远是污染版。问题是如何在噪声里恢复原始比特香农在 1948 年给出理论回答只要码率 R 低于信道容量 C就存在某种编码让误码率任意小——这就是香农极限[2]。1.2 编码的本质用冗余换可靠性信道编码就是在原始数据后加冗余校验比特让接收端能发现甚至纠正错误原始数据 1011 → 加冗余 → 发送 1011 0110 → 噪声 → 接收 1011 0010 ↓ 译码 恢复 1011 ✓从 4G 到 5G数据信道编码经历了一次换代LTE 用Turbo 码5G NR 换LDPC 码控制信道引入全新的Polar 码[1]。这次换代背后是一场持续半个多世纪的容量可达竞赛。二、LDPC 码从 1962 到 5G 数据信道2.1 历史三幕LDPCLow-Density Parity-Check低密度奇偶校验码的故事像一部被埋没又翻红的电影[3][4]年代事件1962Gallager 提出 LDPC但因硬件算力不足被忽略近 30 年1981Tanner 引入图表示Tanner 图1995MacKay/Neal 复兴证明逼近香农极限20183GPP Rel-15 定稿LDPC 成为 5G 数据信道编码2.2 原理稀疏校验矩阵与 Tanner 图LDPC 定义很朴素校验矩阵 H 中 1 的密度极低。编码输出 n 比特含 k 个信息比特H 是 (n-k)×n 矩阵满足任意合法码字 cH·c^T 0模 2[3]。低密度为什么重要因为稀疏性让迭代译码可行。H 可画成 Tanner 图左边变量节点比特右边校验节点方程每个校验节点对应一个校验方程若干比特异或为 0。译码时消息在图上反复传递这就是置信传播Belief Propagation, BP。2.3 5G NR 的 LDPC从概念到工程5G 用的是精心设计的准循环 LDPCQC-LDPC先定义一张小的基图Base Graph再用循环移位提升Lifting 参数 Z扩展成大矩阵[5][6]。5G 定义了两张基图[7]基图规模 (N, M)面向场景BG1(68, 46)大传输块、高速率BG2(52, 42)小块、低速率数据信道块长可达8448 比特大块长下 LDPC 的高吞吐、强并行、低时延优势发挥得淋漓尽致[1]。2.4 译码min-sum 置信传播LDPC 译码是迭代消息传递。假设接收端每个比特得到对数似然比LLR变量节点Mvc[i,j] Lc[i] Σ_{t≠j} Mcv[i,t] 校验节点Mcv[i,j] (∏_{t≠i} sign(Mvc[t,j])) · min_{t≠i} |Mvc[t,j]|min-sum 是标准 BP 的简化近似牺牲一点性能换实现简单是硬件主流选择。实战部分用代码完整复现。三、Polar 码信道极化的奇迹3.1 Arikan 2009第一个显式容量可达的码如果说 LDPC 是靠系综平均好Polar 码就是我构造的每一个码都好。2009 年 Erdal Arikan 提出信道极化方法构造出第一类显式构造、低复杂度、可证明容量可达的编码[8][9]。这是编码理论史上里程碑式的突破。3.2 信道极化把平均水平变成两极分化对 N 个独立信道副本做递归变换极化核 F [[1,0],[1,1]]合成 N 个合成比特信道总体能力守恒但分布极化一半信道更好一半更差。在好信道上传信息坏信道上放已知冻结位——整码性能逼近容量[8]。3.3 Bhattacharyya 参数怎么选信息位用Bhattacharyya 参数 Z(W)度量信道可靠度Z 越小越可靠。对二进制擦除信道BEC有漂亮的递归[8][10]坏信道 W^-Z(W^-) 2Z - Z² 好信道 W^Z(W^) Z²选 Z 最小的 K 个信道传信息位其余传冻结位。3.4 编码与 SC 译码编码信息位向量 u × 生成矩阵 G_N F^⊗nKronecker 幂译码SC连续消除复杂度 O(N log N)逐个判决、前面结果作为后续条件5G 实际用CA-SCLCRC 辅助 列表译码进一步提升短码性能[11]2016 年 3GPP 正式选定 Polar 作为 5G 控制信道编码PDCCH/PUCCH/PBCH[11]。四、为什么 5G 用 LDPC 做数据、Polar 做控制这是很多人最想知道的工程题。答案是块长、时延、硬件实现综合权衡的结果不是简单的好坏之分[1][7]。4.1 数据信道大块长 → LDPC高吞吐BP 译码天然可并行低时延并行度高时延可控逼近容量大块长下容量逼近能力完全释放4.2 控制信道短块 → Polar块很短几十到几百比特Polar 短码场景优势明显零错误平层Polar 无错误平层问题结构简单SC 译码器结构规整硬件友好4.3 一句话对比维度LDPC数据Polar控制3GPP 分工用户数据信道控制信道典型块长大可达 8448短几十~几百比特译码迭代 BPmin-sumSC / CA-SCL优势高吞吐、强并行、低时延短码优、零平层、结构简单容量可达性系综平均论证显式构造证明历史1962 Gallager → 1995 复兴2009 Arikan → 2016 入选五、实战用 Python 复现两种编码理论说得再多不如跑一段代码。以下代码全部本地运行验证Python numpy输出真实可复现。5.1 Polar 信道极化仿真BECε0.3、N16 各比特信道 Bhattacharyya 参数真实输出自然序 Z [0.997, 0.888, 0.821, 0.333, 0.700, 0.205, 0.131, 0.005, 0.530, 0.099, 0.058, 0.001, 0.032, 0.0003, 0.0001, 0.0000]部分 Z→1不可靠部分 Z→0可靠——信道极化。选 Z 最小的 K 个信道传信息位import numpy as np def z_concat(N, eps): BEC 下 Bhattacharyya 参数递归前半坏 W^-2z-z²后半好 W^z²。 z np.array([eps]) for _ in range(int(np.log2(N))): z np.concatenate([2*z - z*z, z*z]) return z z z_concat(16, 0.3) print(np.round(z, 4))工程细节若编码用 GF^⊗n无位反转可靠度需对 Z 做位反转置换再选信息位——仿真中容易踩的坑。5.2 Polar SC 译码块错误率随码长下降编码 BEC 擦除 SC 译码块错误率随 N 变化码率 1/2ε0.2真实输出码长 NSC 块错误率80.0157160.0213有限长波动320.0070640.0033核心结论整体趋势 N 越大错误率越低——极化越充分越接近容量。N16 的小幅回升是有限长极化码的真实特性极小 N 下 Bhattacharyya 构造并非严格最优恰恰说明容量可达需要足够大的 N。核心 SC 译码代码BEC 原生实现规避浮点 LLR 的 ±∞ 抵消def sc_decode_bec(y, n, info_mask, gens): y: -1擦除。返回译码 u。 E -1 def node(nl, yv, mask, gidx): if nl 1: if not mask[0]: return np.array([0]) # 冻结位0 return np.array([0 if yv[0] E else yv[0]]) # 信息位 half nl // 2 y1, y2 yv[:half], yv[half:] f np.where((y1 E) | (y2 E), E, (y1 ^ y2)) # u1·G x1⊕x2 u1 node(half, f, mask[:half], gidx-1) u1_enc (u1 gens[gidx-1]) % 2 g np.where(y2 ! E, y2, np.where(y1 ! E, (y1 ^ u1_enc), E)) # u2·G u2 node(half, g, mask[half:], gidx-1) return np.concatenate([u1, u2]) return node(1 n, np.array(y, dtypeint), info_mask, n)5.3 Hamming(7,4)伴随式译码LDPC 雏形汉明码 (7,4) 是最小的类 LDPC码。伴随式译码算 s r·H^T查表定位单错翻转。BSC 擦除概率 p译码后 BER原始误码率0.030.00740.030.050.01850.050.080.04400.08误码率显著下降单错全部纠正——加冗余换可靠性的直接证据。def syndrome_decode(r, H): 伴随式译码sr·H^T → 查表定位单错 → 翻转。 table {tuple(H[:, e] % 2): e for e in range(H.shape[1])} s (r H.T) % 2 if tuple(s) in table: r r.copy() r[table[tuple(s)]] ^ 1 return r5.4 min-sum vs 和积汉明码 4-环教训原创实验这是我最想分享的仿真发现。把两种 BP 译码——min-sum与和积tanh 规则——用在汉明码上逐一翻转单比特看能否纠正真实输出翻转bit0: min-sumOK 和积OK 翻转bit1: min-sumOK 和积OK 翻转bit2: min-sumOK 和积OK 翻转bit3: min-sumFAIL 和积OK 翻转bit4: min-sumOK 和积FAIL 翻转bit5: min-sumOK 和积FAIL 翻转bit6: min-sumOK 和积FAIL两种标准BP 译码器各有 1 个单错纠不回来原因汉明码 Tanner 图存在4-环——两个校验节点与两个变量节点围成环消息在环里打转无法传播足够外部信息陷入局部最优。这个失败是全文最重要的工程结论这就是为什么真实 LDPC 要避免短环围长 ≥ 6。5G 的 QC-LDPC 基图设计时严格规避 4-环[6]。汉明码作为LDPC 雏形能用配合随式译码完美工作但图结构不适合纯粹迭代译码——一个 60 年前的码教会了我们 21 世纪的 LDPC 设计原则。def min_sum_bp(y_llr, H, iters20): min-sum 置信传播。H: m×n 校验矩阵。 m, n H.shape Lc np.array(y_llr, dtypefloat) Mvc np.zeros((n, m), dtypefloat) for i in range(n): Mvc[i, H[:, i] 1] Lc[i] for _ in range(iters): Mcv np.zeros((n, m), dtypefloat) for j in range(m): # 校验节点min-sum idx np.where(H[j] 1)[0] for i in idx: others [t for t in idx if t ! i] sp 1.0; ma np.inf for t in others: sp * np.sign(Mvc[t, j]); ma min(ma, abs(Mvc[t, j])) Mcv[i, j] sp * ma if ma ! np.inf else 0.0 for i in range(n): # 变量节点 idx np.where(H[:, i] 1)[0] for j in idx: others [t for t in idx if t ! j] Mvc[i, j] Lc[i] sum(Mcv[i, t] for t in others) return ((Lc Mcv.sum(axis1)) 0).astype(int)六、总结与我的观点6.1 三条心得心得一容量可达 ≠ 工程可用。LDPC 1962 年就发明却等了 30 年才有硬件能跑Polar 理论漂亮落地也要靠 CA-SCL 和精心的速率匹配。理论边界和工程落地之间隔着硬件成本、时延、复杂度这座大山。心得二5G 的编码抉择是分场景优化。不是 LDPC 全面碾压 Polar而是数据大块长用 LDPC 吃吞吐、控制短块用 Polar 吃短码性能。理解了这个才算理解 5G 物理层为什么是今天这个样子。心得三亲手仿真才叫真懂。这次实验最意外的收获是 4-环教训——不跑代码我永远不会直观理解为什么 LDPC 要避免短环。理论告诉你结论仿真让你看见结论。6.2 展望面向 6G信道编码探索仍在继续更高速率的新构造、与 AI 结合的译码器神经网络 BP、面向新信道的编码……但无论怎么演进LDPC 与 Polar 在 5G 确立的迭代译码 显式构造两大范式仍是所有新编码的地基。建议先把本文仿真代码跑一遍改参数看现象再读 Arikan 2009 原文与 ETSI 138 212 规范——从会跑到懂原理中间只差亲手改一改。参考资料[1] Cambridge《An overview of channel coding for 5G NR cellular communications》二级2019[2] ETSI TS 138 212 V15.12.05G NR 复用与信道编码规范一级2021-10[3] Gallager, Low-Density Parity-Check Codes, IRE Trans. IT-8:21-28一级1962[4] 清华大学《Introduction to LDPC Codes》课件LDPC 历史三幕三级2018[5] 3GPP Spec ExplorerLDPCQC-LDPC、基图提升三级2026-08[6] nxgconnectLDPC Coding in 5G NRBG1/BG2 分工三级2026-01[7] arXiv 2502.11053《Demystifying 5G Polar and LDPC Codes》二级2025-02[8] Arikan, Channel Polarization, IEEE TIT 55(7):3051-3073一级2009[9] IEEE TechNavPolar Codes二级2026-07[10] 仿真本地验证BEC 下 Z 参数递归式见 polar_ldpc_sim.py[11] arXiv 2506.041633GPP 2016 选定 Polar 用于控制信道二级2026-05注仿真数据来自文章配套脚本polar_ldpc_sim.py本地运行输出可复现。