感谢文章:说人话,人话!! 汉明码(海明码、hamming code)通俗易懂的解释,说人话!!!! 带给我的启发
1. 老鼠试药
先讲一个脑筋急转弯:假如现在有7瓶药,其中有且只有一瓶有毒,现在3只白老鼠,我们怎样找到那一瓶有毒的药呢?
处理的方法如图把小白鼠吃的药分组:
我们分为三个组,使得每一个 组交区域和单独区域都有且仅有一个标号,这样一来我们就能根据小白鼠的发病情况知道哪一瓶药有毒了。
我们再进一步思考?
三只白老鼠最多能测试7瓶药,那么四只白老鼠最多能测试几瓶药呢?…n只白老鼠能测试几瓶药呢?
这个计算是根据一定的规律来的,n瓶药,最多可以满足 组交区域和单独区域都有且仅有一个标号的情况测试: 2 n − 1 2^n-1 2n−1瓶药。
2. 海明编码的发送实现
海明编码的原理和这个脑筋急转弯有着异曲同工之妙,同理,我们先思考:我们有x位校验码的情况下最多能检验多少位的正常数据呢?
一样的,最多可检验 2 x − 1 2^x-1 2x−1位数据。(但是我们不要忘记这样一个约束:假设最多仅有一位发生错误)
海明编码因为能知道错的是哪一位,所以他可以具备纠错的能力,因此我们把海明编码叫做纠错编码。
我们每一位的校验码就是针对每一个组别的位编码出来得到的结果。
所以,我们先看下怎样对我们的数据进行分组。
比如说现在有4位的数据,那么我们将采用3位( 2 3 − 1 = 7 > 4 2^3-1=7>4 23−1=7>4) 的校验码来进行海明编码。
我们怎样分组才能达到:组交区域和单独区域都有且仅有一个标号 的情况呢?
我们观察标号满足这样的
- xx1:1,3,5,7
- x1x:2,3,6,7
- 1xx:4,5,6,7
假如现在我们要对 1101
我们规定海明编码的位置如下:(方便硬件实现)
【 P 1 】 【 P 2 】 D 1 【 P 3 】 D 2 D 3 D 4 【P_1】【P_2】D_1【P_3】D_2D_3D_4 【P1】【P2】D1【P3】D2D3D4
【 P 1 】 【 P 2 】 1 【 P 3 】 101 【P_1】【P_2】1【P_3】101 【P1】【P2】1【P3】101
如果要使得: P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 = 0 P_1\oplus D_1 \oplus D_2 \oplus D_4 =0 P1⊕D1⊕D2⊕D4=0,那么 P 1 = 1 P_1 = 1 P1=1
如果要使得: P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 0 P_2\oplus D_1 \oplus D_3 \oplus D_4 =0 P2⊕D1⊕D3⊕D4=0,那么 P 2 = 0 P_2= 0 P2=0
如果要使得: P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 = 0 P_3\oplus D_2 \oplus D_3 \oplus D_4 =0 P3⊕D2⊕D3⊕D4=0,那么 P 3 = 0 P_3= 0 P3=0
我们发送的海明编码就是: 1010101 1010101 1010101
3. 接收方的检验和纠错
假如对方接收到的是 1010111 1010111 1010111
先画出位置图和分组图:
- (P1)xx1:1,3,5,7
- (P2)x1x:2,3,6,7
- (P3)1xx:4,5,6,7
【 P 1 】 【 P 2 】 D 1 【 P 3 】 D 2 D 3 D 4 【P_1】【P_2】D_1【P_3】D_2D_3D_4 【P1】【P2】D1【P3】D2D3D4
针对我们得到的编码:
1010111
1010111
1010111
P
1
⊕
D
1
⊕
D
2
⊕
D
4
=
0
P_1\oplus D_1 \oplus D_2 \oplus D_4 =0
P1⊕D1⊕D2⊕D4=0,P1校验正确
P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 1 P_2\oplus D_1 \oplus D_3 \oplus D_4 =1 P2⊕D1⊕D3⊕D4=1,P2校验错误
P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 = 1 P_3\oplus D_2 \oplus D_3 \oplus D_4 =1 P3⊕D2⊕D3⊕D4=1,P3校验错误
看上面的分组图:P2和P3错误的话,也就是有6或者7错误了,但是P1正确,也就是7没错,那就是6错了
我们也可以利用: P 3 P 2 P 1 = 110 P_3P_2P_1 = 110 P3P2P1=110得到是第6位的错误
那就是 D 3 D_3 D3错了,所以纠错之后就是: 1010101 1010101 1010101 和发送的时候就一致了。
4. 海明距公式
需要纠错d位,需要的海明距为2d+1的编码方案,检错d位,需要的海明距为d+1