纠错编码
最常见的纠错编码是海明码。这一节有两样东西要带走:码距决定检错和纠错能力的那条公式,以及海明码校验位数的不等式
机制
海明码的思路:让每一位参加几个检验组
海明码的实现原理是:在有效信息位中加入几个检验位形成海明码,并把海明码的每个二进制位分配到几个奇偶检验组中。某一位出错后,就会引起有关的几个检验位的值发生变化——这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。
对比奇偶检验码:它只有一个检验组,所有位都在里面,所以只能知道”组里有奇数个错”,不知道是哪一位。海明码让不同位参加不同组合的检验组,于是”哪几个组出了问题”就唯一对应”哪一位错了”。
码距:检错与纠错能力从哪里来
任何一种编码的检错能力和纠错能力都与该编码的最小距离有关。码距(也称海明距离)是指两个码字对应位取值不同的比特数。计算码距的一种方法是对两个位串进行异或运算,结果中 1 的个数即为码距。例如
在一个编码集中,任意两个码字的码距的最小值称为该编码集的码距。 例如编码集 {10011, 01011, 11110, 00001},尽管 11110 和 00001 的码距为 5,但 10011 和 01011 的码距为 2,取最小值,所以该编码集的码距为 2。
根据纠错理论,编码方案的检错能力和纠错能力与码距
考虑
- 为了检测
位错误,需要码距为 的编码方案。 一个有效码字发生 位错误时,不可能变成另一个有效码字。可见,码距为 1 的编码方案无法检测任何错误。 - 为了纠正
位错误,需要码距为 的编码方案。 一个有效码字发生 位错误时,它仍然离原来的码字最近,从而能确定原来的码字,达到纠错的目的。
第二条的直观理解:把每个有效码字想成一个点,出错就是从点出发走了几步。要检出错,只要走
海明码的编码过程
海明码具有 1 位纠错能力。以数据 1010 为例:
(1)确定海明码的位数。 设信息位有
(2)确定检验位的分布。 规定检验位
(3)分组,形成检验关系。 每个数据位用多个检验位进行检验,条件是:被检验数据位的海明位号,等于检验该数据位的各检验位海明位号之和。检验位不需要再被检验。
| 数据位 | 所在位置 | 位号分解 | 由谁检验 |
|---|---|---|---|
于是第 1 组(
(4)检验位取值。
所以 1010 对应的海明码为
(5)检验原理。 每个检验组用检验位和参与形成该检验位的信息位进行奇偶检查,构成
若
计算模板:海明码
- 求检验位数:找最小的
使 。 - 放检验位:
放在第 位(1、2、4、8…),数据位按顺序填满其余位置。 - 分组:把每个数据位的位号写成 2 的幂之和,出现哪个幂,就归哪个检验位管。
- 算检验位:
= 它所管的数据位的异或。 - 纠错:收到后算
,非零时的值就是出错位号。
| 信息位 | 1 | 2~4 | 5~11 | 12~26 | 27~57 |
|---|---|---|---|---|---|
| 检验位 | 2 | 3 | 4 | 5 | 6 |
例(王道 3.3.3 第 4 题):10 位数据采用海明码需要增加几位冗余信息?
例(纠错):收到 1110010。按上面的分组,
边界
码距为 3 时是”检 2 位或纠 1 位”,不是”检 2 位同时纠 1 位”。 公式
海明码只能纠 1 位错。 两位同时出错时,
检验位的位置是
计网与计组用的是同一套海明码。 计组第 2 章讲校验码时有更完整的推导,两边的位号约定一致。
对照速查
| 需求 | 最小码距 |
|---|---|
| 检测 | |
| 纠正 | |
| 纠正 |
| 说法 | 对错 |
|---|---|
| 码距为 1 的编码不能检测任何错误 | ✅ |
| 码距为 3 的编码能检 2 位错且同时纠 1 位错 | ❌(二者只能取其一) |
| 纠错能力可以大于检错能力 | ❌ |
| 海明码能纠正 1 位差错 | ✅ |
| 4 位数据需要 3 位海明检验位 | ✅ |
考点
- 码距 = 异或结果中 1 的个数;编码集码距取最小值
;检 位需 ,纠 位需- 海明码校验位数:
在第 位;数据位位号 = 检验它的各检验位位号之和- 检验结果
即出错位号,取反纠错
链接
- 🏠 返回总览:计算机网络第 3 章:数据链路层总览
- ⬅️ 上一节:3.3.1 检错编码
- ➡️ 下一节:3.4.1 流量控制与滑动窗口机制
- 📖 名词库:第 3 章名词库