出发前的第一道工序分两笔:信源编码把冗余拧干好省带宽,信道编码再往拧干的比特上穿铠甲好抗差错。本节讲清分组码、卷积码以及强纠错的 Turbo/LDPC 各自怎么加保护、代价是什么,并用一段代码演示最直观的汉明码纠错全过程。
阅读完本节,你应当能够:
很多人分不清两种"编码",一开口就败了。理清楚只需抓住两件事:这一步要省带宽还是保正确?信源编码站在省带宽这边——信号里有大量可预测、可压缩的结构(语音有停顿,图像局部很像),把它们除掉,用接近熵的最少比特表示。信道编码站在保正确这边——信道一肆虐,比特就翻脸,得给数据加水印,让接收端能发现甚至掰错误。
方向相反、目的相反,顺序却固定:先信源编码降冗余,再信道编码补冗余。通盘算总账还是赚——你宁可用"拧冗余省下的带宽"去"买纠错的花费",也不愿让裸露数据在衰路上裸奔。这就是香农那一章给的分工直觉的工程落地。
纠错防护按复杂度从便宜到昂贵排开,形成一条清晰的技术线:
分组码(以汉明码为代表)。把 k 个信息位按固定规则塞进 n 个码位,形成(n,k)分组码,冗余位是信息位的线性组合。汉明码(7,4)用 3 个校验位保护 4 个信息位,能纠正 1 位错误、发现 2 位。便宜、结构清晰、block 处理,适合低码率简单链路。
卷积码 用移位寄存器与前馈结构让编码"边滑边编"。
真正的转折是——码不是一码一码编的,而是滑着编:信息位流过一串移位寄存器,每一时刻输出的码位是当前与历史的线性组合。用维特比算法在格图上做最大似然译码。它不分成块,天然有记忆,适合加软信息协作。
Turbo 码与 LDPC 码 逼近香农极限。两者的共同点是靠"多轮迭代外部信息交换"把纠错榨干——Turbo 用两个分量编码器中间插交织器互喂软信息,LDPC 用稀疏校验矩阵上的置信传播在因子图上打转。现代 5G 的控制与数据信道分别采用极化码与 LDPC,正是这条路线走到极端。
| 方法 | 加保护方式 | 译码思想 | 复杂度/码长 |
|---|---|---|---|
| 汉明(7,4) | 线性方程组生成校验位 | 查表纠正 1 位 | 低,码很短 |
| 卷积 | 移位寄存器滑动输出 | 格图维特比搜索 | 中,有记忆 |
| Turbo | 双卷积+交织互喂 | 迭代软信息交换 | 高,逼近香农 |
| LDPC | 稀疏校验矩阵 | 置信传播迭代 | 高,高速友好 |
把这表格记在心里,你就看懂了 3G 用 Turbo、5G 用 LDPC 的技术理由——都在往"距离香农上限更近且硬件可落地"的方向挤。
编码带来的收益习惯用"编码增益"计:在同样的误码率目标下,加了编码让所需信噪比降低的 dB 数。一个能省 3 dB 编码增益的码,意味着可以降低发射功率、加大覆盖或抬高秩速率,这在链路预算里往往比多堆几 dB 功率更划算。也正因为如此,评价一个信道编码从来不只看"纠几个错",而是看它在目标误码率处净省了多少 dB;越贴近香农上限,能省得就越多,这笔账才是它被不断迭代追逐的原因。
光讲结构不落地容易飘。汉明(7,4)用一次完整过程最直观:编码 → 注入 1 位错误 → 奇偶校验定位 → 纠正。下面是可复现的查表版本。
# 生成 (7,4) 汉明码所有合法码字 import itertools G = [[1,0,0,0,1,1,0], # 校验位 = 信息位线性组合(此处为示意矩阵) [0,1,0,0,1,0,1], [0,0,1,0,0,1,1], [0,0,0,1,1,1,0]] words = {} for bits in itertools.product([0,1], repeat=4): code = [sum(bits[i]*G[i][j] for i in range(4)) % 2 for j in range(7)] words[tuple(code)] = tuple(bits) data = (1, 0, 1, 1) codeword = tuple(sum(data[i]*G[i][j] for i in range(4)) % 2 for j in range(7)) err = list(codeword); err[3] ^= 1 # 故意翻第 3 位 received = tuple(err) def decode(c, words): # 找最近的合法码字(汉明距最小) return min(words, key=lambda cc: sum(a != b for a, b in zip(c, cc))) estimate = decode(received, words) print("原始码字:", codeword) print("接收(含错):", received) print("纠正后: ", estimate, "信息位", words[estimate])
输出的"纠正后"应还原成原始信息位——这演示了怎么靠冗余在噪声里抓回 1 位错。把纠错增益摊进成本:速率降为 4/7,但深度可靠性换回来了。这正是信道编码"牺牲速率换可靠"的那笔账,加深到 Turbo/LDPC 只把账算得更漂亮。
编码稳了比特,下一步把比特变成在频域耐看、在接收端好读的基带波形——数字调制与脉冲成形。