海明码由 Richard Hamming 于 1950 年提出,是既能检错又能纠错的编码方式。核心思想:用 r 个校验位覆盖不同的数据位组合,通过校验结果(称为伴随式/症候字)定位错误位置。
对于数据位 k 位、校验位 r 位,满足海明不等式:
$$2^r \geq k + r + 1$$
| 数据位 k | 校验位 r | 总码长 n=k+r | $2^r$ |
|---|---|---|---|
| 1 | 2 | 3 | 4 |
| 4 | 3 | 7 | 8 |
| 8 | 4 | 12 | 16 |
| 16 | 5 | 21 | 32 |
| 32 | 6 | 38 | 64 |
| 64 | 7 | 71 | 128 |
校验位 $P_i$ 放在位号为 $2^i$ 的位置(从 1 开始编号):
每个校验位 $P_i$ 负责校验所有位号二进制表示中第 i 位为 1 的位置:
Step 1:确定位置分配
| 位号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 类型 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 数据 | 1 | 0 | 1 | ? | 0 | ? | ? |
Step 2:计算校验位(偶校验)
Step 3:编码结果
海明码 = 1010010。
接收码字 = 1011010(假设位号 4 出错,0 → 1):
伴随式 $S_3S_2S_1 = 100_2 = 4_{10}$ → 位号 4 出错,取反即可纠正。
若 2 位同时出错(位号 4 和位号 6),伴随式可能恰好为 0 或其他值,无法正确纠错。
$$\eta = \frac{k}{k+r}$$
| 能力 | 条件 |
|---|---|
| 纠 1 位错 | $2^r \geq k+r+1$ |
| 检 2 位错 + 纠 1 位错 | 增加 1 位全校验位 |
在标准海明码基础上增加 1 位全局奇偶校验位:
| 伴随式 S / 全局校验 P | 结论 |
|---|---|
| $S=0, P=0$ | 无错 |
| $S \neq 0, P=1$ | 1 位错,S 指出错误位置 |
| $S \neq 0, P=0$ | 2 位错,只能报告不能纠正 |
| $S=0, P=1$ | 校验位本身出错 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。