海明校验码

来源:互联网 发布:部落冲突药水升级数据 编辑:程序博客网 时间:2024/05/02 04:25

本博客为http://winda.blog.51cto.com/55153/1072629的精简与补充。


海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码。

基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。

步骤:计算校验位数确定校验码位置确定校验码实现校验和纠错-->产生原码

1.    计算校验位数

设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=Kr≤2r1。

2.确定校验码位置

校验码必须是在2n次方位置。原8位:10011101 加入校验码:??10011101

3.    确定校验码

原则是:第i位校验码从当前位开始,每次连续校验i(这里是数值i,不是第i位,下同)位后再跳过i位,然后再连续校验i位,再跳i位,以此类推。最后根据所采用的是奇校验,还是偶校验即可得出第i位校验码的值。

校验码计算示例

   同样举上面的例子来说明,码字为??10011101

   先求第1个“?”(也就是p1,第1位)的值,因为整个码字长度为12(包括信息码长和校验码长),所以可以得出本示例中p1校验码,校验的位数是1、3、5、7、9、11共6位。这6位中除了第1位(也就是p1位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验(全部亦或),从已知的5位码值可知,已有3个“1”,所以此时p1位校验码的值必须为“1”,得出p1=1。

   再求第2个“?”(也就是p2,第2位)的值,根据以上规则可以很快得出本示例中p2校验码校验的位数是2、3、6、7、10、11,也是一共6位。这6位中除了第2位(也就是p2位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验,从已知的5位码值可知,也已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p2=1。

   再求第3个“?”(也就是p3,第4位)的值,根据以上规则可以很快得出本示例中p3校验码校验的位数是4、5、6、7、12,一共5位。这5位中除了第4位(也就是p3位)不能确定外,其余4位的值都是已知的,分别为:0、0、1、1。现假设采用的是偶校验,从已知的4位码值可知,也已有2个“1”,所以此时p2位校验码的值必须为“0”,得出p3=0。

   最后求第4个“?”(也就是p4,第8位)的值,根据以上规则可以很快得出本示例中p4校验码校验的位数是8、9、10、11、12(本来是可以连续校验8位的,但本示例的码字后面的长度没有这么多位,所以只校验到第12位止),也是一共5位。这5位中除了第8位(也就是p4位)不能确定外,其余4位的值都是已知的,分别为:1、1、0、1。现假设采用的是偶校验,从已知的4位码值可知,已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p4=1。

   最后就可以得出整个码字的各个二进制值码字为:111000111101(带阴影的4位就是校验码)。

4.    实现校验和纠错

现假设整个码字一共是18位,根据表5-1可以很快得出,其中有5位是校验码,再根据本节前面介绍的校验码校验规则可以很快得出各校验码所校验的码字位,如表。



两个规律:

l  所有校验码所在的位是只由对应的校验码进行校验,如第1位(只由p1校验)、第2位(只由p2校验)、第4位(只由p3校验)、第8位(只由p4校验)……。也就是这些位如果发生了差错,影响的只是对应的校验码的校验结果的产生,不会影响其它校验码的校验结果。这点很重要,如果最终发现只是一个校验组中的校验结果不符,则直接可以知道是对应校验组中的校验码在传输过程中出现了差错

2  所有信息码位均被至少两个校验码进行了校验,也就是至少校验了两次。查看对应的是哪两组校验结果不符,然后根据表就可以很快确定是哪位信息码在传输过程中出了差错。

确定是哪位信息码在传输过程中出了差错:

G1=p1b1b2b4b5⊕……

G2=p2b1b3b4b6b7b10b11⊕……

G3= p3b2b3b4b8b9b10b11⊕……

G4= p4b5b6b7b8b9b10b11⊕……

G5= p5b12b13b14b15b16b17b18b19b20b21b11b23b24b25b26⊕……

......

现在举一个例子来说明,假设传输的海明码为111000111101(一共12位,带阴影的4位就是校验码),从中可以知道它有四个校验组:G1、G2、G3、G4,然而到达接收端经过校验后发现只有G4=1(也就是只有这组校验结果不等于0),通过前面介绍的校验规律可以很快地发现是G4校验组中的p4校位码(也就是整个码字中的第8位)错了(因为只有一组校验结果出现差错时,则肯定只是对应的校验位出了差错),也就是最终的码字变成了:111000001101。

    再假设G3、G4两个校验值都不为0,也就是都等于1。通过表5-2中比较G3、G4两个校验组(注意本示例中码字长度一共才12位,只需要比较前12位)中共同校验的码位可是以很快发现是b8,也就是第12位出现了差错,也就是最终的码字变成了:111000011100

    【经验之谈】在这里一定要注意,最终有多少个校验组出现差错也不是随意的,一定要结合实际传输的码字长度来考虑。如上例是一共12位,如果换成了是16位的码字,且当b9位出现差错时,则G1、G3、G4一定会同时出现错误,因为b9这个位是三个校验组同时校验的,只要它一出错,肯定会同时影响这三个校验组的值。同理,如果是b11位出现了差错,因为它同时受G1、G2、G3、G4四个校验组校验,所以这四个校验组结果都将出现错误。

    2)海明码的差错纠正

    检测出了是哪位差错还不够,因为海明码具有纠正一位错误的能力,所以还需要完成纠错过程。这个过程的原理比较简单,就是直接对错误的位进行取反,或者加“1”操作,使它的值由原来的“1”变成“0”,由原来的“0”变成“1”(因为二进制中每一位只能是这二者之一)。

原创粉丝点击