1.原理
海明校验码的实现原理是:在数据位中加入几个校验位,将数据代码的码距均匀地拉大,并把数据的每个二进制位分配在几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错误,还能指出是哪一位出错,为进一步自动纠错提供了依据。
2.编码规则
若海明码的最高位号为m,最低位号为1,即HmHm-1…H2H1,则海明码的编码规则是:
(1)校验位与数据位之和为m,每个校验位Pi在海明码中被分在位号2i-1的位置上,其余各位为数据位,并按从低向高逐位依次排列的关系分配各数据位。
(2)海明码的每一位位码Hi(包括数据位和校验位)由多个校验位校验,其关系是被校验的每一位位号要等于校验它的各校验位的位号之和。
3.增添校验位
假设欲检测的有效信息为n位,需增加的校验位为k位,则校验码的长度为n+k位。校验位的状态组合,应当具有指出n+k位中任一位有错或无错的能力,即需要区别出n+k+1种状态。应满足以下关系式:
2k≥n+k+1
这个关系式称为海明不等式,若信息位长度n确定后,由此可得到校验位k的最短长度。
确定校验位后,就可以与信息位组成海明校验位。假设数据位是7位二进制编码,据上所述,校验位的位数k为4,故海明码的总位数为11。它们的排列关系可表示为:
海明码位号: H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
海明码: D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
可知: 每个校验位由其本身校验;
每个数据位由若干校验位校验。
4.校验位校验任务的分配
根据海明码的编码规则,每一位海明码都有多个校验位校验,且被校验的每一位的位号等于参与校验它的几个校验位的位号之和。
占据各权位上的校验位按权组成的8421码,正好等于海明码的位号,即海明码的位号Hi正好等于要校验它的校验位所占权位权值之和。
例如:H11=P4×23+P2×21+P1×20
这说明了H11位将由 P4、P2、P1进行校验。
校验位P1可以校验:H1 、H3、H5 、H7 、H9、H11、H13、H15
校验位P2可以校验:H2 、H3、 H6、H7 、H10、H11、H14 、H15
校验位P3可以校验:H4 、H5、 H6、 H7 、H12、H13、H14 、H15
校验位P4可以校验:H8、H9、 H10、H11、H12、H13、H14 、H15
根据校验时偶校验,可以写出相应的校验方程。
例:设有一个7位信息码位0110001,求它的海明码。
解: 此例中,信息位n=7,根据海明不等式,可求得校验位最短长度k=4。
其海明码先表示如下:
海明码位号:H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
海明码: 0 1 1 P4 0 0 0 P3 1 P2 P1
按偶校验写出校验方程为:
H1 H3H5 H7 H9H11=0 (P1=H1)
H2 H3 H6H7 H10H11=0 (P2=H2)
H4H5 H6H7=0 (P3=H4)
H8H9 H10H11=0 (P4=H8)
由此可得:P1=0、P2=0、P3=0、P4=0,所以0110001的海明码为01100000100。
方法:将错了的码字重新代入校验方程校验一次即可。假设上面例子中的海明码01100000100传送后,若H6位发生了错误,变成了01100100100,这时把它们代入上面的偶校验校验方程,如下:
H1H3H5H7H9H11=0 1 0010 = 0 = E1
H2 H3 H6H7 H10H11=0 11010= 1 = E2 H4H5 H6 H7=0 0 1 0 = 1 = E3
H8H9 H10H11=0 1 1 0 = 0 = E4
可以把E4E3E2E1= 0110看成一个“错误字”,因为其二进制码为0110,说明H6出了错,是H6错成了1,所以要纠错,纠错时将H6位取反值,即让它恢复到正确值0。这样纠错后即可得到正确的海明码01100000100。