3.1 信源编码与信道编码


3.1 信源编码与信道编码

出发前的第一道工序分两笔:信源编码把冗余拧干好省带宽,信道编码再往拧干的比特上穿铠甲好抗差错。本节讲清分组码、卷积码以及强纠错的 Turbo/LDPC 各自怎么加保护、代价是什么,并用一段代码演示最直观的汉明码纠错全过程。

学习目标

阅读完本节,你应当能够:

  1. 用一句话区分信源编码与信道编码的目标、方向与顺序。
  2. 说出分组码与卷积码各用什么思想加冗余,画一张能看清的结构示意。
  3. 解释 Turbo 码与 LDPC 码为何能逼近香农极限,以及它们的复杂度代价。
  4. 用手算或代码跑通一次汉明码检错纠错,体会"牺牲速率换可靠"的换算。

一、先问清楚了再码:这套装置要解决什么

很多人分不清两种"编码",一开口就败了。理清楚只需抓住两件事:这一步要省带宽还是保正确?信源编码站在省带宽这边——信号里有大量可预测、可压缩的结构(语音有停顿,图像局部很像),把它们除掉,用接近熵的最少比特表示。信道编码站在保正确这边——信道一肆虐,比特就翻脸,得给数据加水印,让接收端能发现甚至掰错误。

方向相反、目的相反,顺序却固定:先信源编码降冗余,再信道编码补冗余。通盘算总账还是赚——你宁可用"拧冗余省下的带宽"去"买纠错的花费",也不愿让裸露数据在衰路上裸奔。这就是香农那一章给的分工直觉的工程落地。

二、信道编码的三层进化

纠错防护按复杂度从便宜到昂贵排开,形成一条清晰的技术线:

分组码(以汉明码为代表)。把 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 只把账算得更漂亮。

四、给实践者的三句真话

  • 先拧再穿:信源编码省下的带宽,正是信道编码增冗余的"预算",顺序别乱。
  • 软的比硬的值钱:给译码器喂软决策(对数似然)能让迭代码多赚几个 dB,这正是接收端软译码存在的理由(第4章详述)。
  • 别把复杂度当免费:LDPC 逼近香农,前提是码长够长、迭代够多,硬件与功耗不是白给。短码、低延迟场景,反而别追求极限逼近,实用主义要对准负载选码。

本节要点回顾

  • 信源编码拧冗余省带宽,信道编码加冗余保正确,先拧后穿顺序固定。
  • 分组码块处理、卷积码滑处理,Turbo/LDPC 靠迭代逼近香农极限。
  • 汉明码演示了"冗余换纠错"的本钱,纠正 1 位错、耗费 3 校验位。
  • 软决策喂译码能多赚软件增益,是工程高价值点。
  • 选码看负载:高速长码选 LDPC,短码低延迟别硬凑极限逼近。

编码稳了比特,下一步把比特变成在频域耐看、在接收端好读的基带波形——数字调制与脉冲成形。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U