Hamming码是一种多重(复式)奇偶检错系统,是由Richard Hamming于1950年提出、目前还被广泛采用的一种很有效的校验方法。它将信息用逻辑形式编码,只要增加少数几个校验位,就能检测出一位出错并自动改正,即实现自动纠错。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
一.校验位的位数
校验位的位数与有效信息的长度有关。设N为校验码的位数,K是有效信息位,r为校验位,若要能够自动纠正一位传输错误,海明码应满足N=K+r≤2r-1。若r=3,则N=K+r≤7,所以K≤4;若要传输的是7位ASCII码,则需要至少4位校验位。
二.分组原则
在海明码中,位号数(1、2、3、……、n)为2n的那些位,即:1(20)、2(21)、4(22)、8(23)、…2r-1位,作为奇偶校验位,记作: P1、P2、P3 、P4、…Pr,余下各位则为有效信息位。
例如:当N=11,K=7,r=4时,相应海明码可示意为:
位号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
P占位 | P1 | P2 | × | P3 | × | × | × | P4 | × | × | × |
其中×均为有效信息,海明码中的每一位分别被P1,P2,P3,P4,…,Pr中的若干位所校验,其规律是:第i位由校验位位号之和等于i的那些校验位所校验。如第7位,由P1,P2,P4(因为7 = 1 + 2 + 4)所检验。
从而,可以得出每个检验位检验的位号如下表所示:
检验位位号 | 被检验位位号 |
P1 | 1, 3, 5, 7, 9, 11 |
P2 | 2, 3, 6, 7, 10, 11 |
P3 | 4, 5, 7, 7 |
P4 | 8, 9, 10, 11 |
三.编码、查错、纠错原理
1.编码原理(采用偶校验)
若有效信息为1001000,先将它们依次填入3,5,6,7,9,10,11位。
位号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
P占位 | P1 | P2 | 1 | P3 | 0 | 0 | 1 | P4 | 0 | 0 | 0 |
再依次计算P1,P2,P3,P4的值。如P1的取值应保证1, 3, 5, 7, 9, 11这6个位上1的个数为偶数,故P1的值应为0;类似的P2,P3,P4的值分别为0,1,0。
位号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
P占位 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
2.查错与纠错
因为分四组校验,每组产生一位检错信息,共4位检错信息,构成一个指误字,记为:G4G3G2G1。其中:Gi由被Pi所检验的那些位中1的个数来决定,若1的个数为偶数,则Gi的值为0(因为编码时采用的是偶检验),否则为1。如G1由1, 3, 5, 7, 9, 11位中1的个数来决定。
若G4G3G2G1=0000,则表示没有出错;如有错,则G4G3G2G1形成的十进制数,即为错误所在位。由于每一位要么为0,要么为1,故可以实现自动纠正。
假设接受方收到的数据为:00110010000,计算可得G1G2G3G4=0000,表明数据是正确的,去掉校验位后,可得实际数据为:1001000。
假设接受方收到的数据为:00110110000,计算可得G4G3G2G1=0110,表明第6位出现了错误,故可纠正为0。
注意:Hamming纠错码只能准确纠正仅有一位出错的情况。