汉明码或者海明码的计算或者纠错

  • 汉明码简介:汉明码又叫海明码是在1950年被Richard Hamming提出的,目前仍是广泛采用的一种有效的校验码。汉明码实际上是一种多重奇偶校验。
  • 校验原理:在有效信息位中加入几个校验位形成汉明码,使码距比较均匀地拉大,并把汉明码的每一个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错误,还可以指出错误发生的位置,为自动纠错提供了依据。
  • 海明码能检测出2位错误,并能纠正1位错误
  • 汉明码纠错应满足的条件:设K为有效信息的位数,r为校验位的位数,则整个码字的位数N应满足不等式:NKr ≤2r1(是2的r次方)。若要求海明码能检测出2位错误,则再增加1位校验位。
  • 计算海明码的步骤:

            A、确定海明码校验位的位数

                设K为有效信息的位数,r为校验位的位数,则整个码字的位数N应满足不等式:NKr ≤2r1(是2的r次方)。若要求海明码能检测出2位错误,则再增加1位校验位。

例如:二进制编码位10101100,共8位所以K=8,可以得出校验位r的位数为4位。

           B、确定校验位的位置

               位号(1~N)是那些权值为2的那些位,即2^0、2^1、2^2、……、2^r-1的位置作为校验位,记作P1、P2、P3、……、Pr余下的为有效信息位。

校验位P1=2^(1-1)其他校验位同理。

D8D7D6……D2D1对应数据10101100

海明码 P5 D8 D7 D6 D5 P8 D4 D3 D2 P4 D1 P2 P1
位号 H13 H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
数据填入   1 0 1 0   1 1 0   0    
求得的海明码                          

           ​​C、分组

               将N位分为r组,第i位由校验位号之和等于i的那些校验位所校验。

               个人是这样分组的(Pi校验的位是从Mi开始连续i位,然后间隔i位,再校验连续i位,再间隔…….)

海明码 P13 D8 D7 D6 D5 P8 D4 D3 D2 P4 D1 P2 P1
位号 H13 H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
校验位P8                
校验位P4                
校验位P2              
校验位P1              

由表可以看出:

P1校验数据位 H1,H3,H5,H7,H9,H11,…

P2校验数据位 H2,H3,H6,H7,H10,H11,…

P4校验数据位 H4,H5,H6,H7,H12,…

P8校验数据位 H8,H9,H10,H11,H12,…(注意:P的下标对应的是海明码的下标)

           ​​D、校验位的形成

              校验位的形成是由海明码的所有位求异或得到的例如:

P1=H1⊕H3⊕H5⊕H7⊕H9⊕H11
P2=H2⊕H3⊕H6⊕H7⊕H10⊕H11
P4=H4⊕H5⊕H6⊕H7⊕H12
P8=H8⊕H9⊕H10⊕H11⊕H12

             为了能检验两个错误,增加一位校验位Pr+1,放到最高位。

Pr+1=所有位求异或

例子:求10101100的海明码

海明码 P5 D8 D7 D6 D5 P8 D4 D3 D2 P4 D1 P2 P1
位号 H13 H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
数据填入   1 0 1 0   1 1 0   0    
求得的海明码 1 1 0 1 0 0 1 1 0 1 0 1 1

 

P1=H1⊕H3⊕H5⊕H7⊕H9⊕H11

=1⊕0⊕0⊕1⊕0⊕1=1

P2=H2⊕H3⊕H6⊕H7⊕H10⊕H11

=0⊕1⊕1⊕1⊕0=1
P4=H4⊕H5⊕H6⊕H7⊕H12

=0⊕1⊕1⊕1=1
P8=H8⊕H9⊕H10⊕H11⊕H12

=0⊕1⊕0⊕1=0

将数据填入表中即可得到最终的海明码,但是为了检验2给错误,我们再把求得的海明码的所有位在求一次异或

P13=1⊕0⊕1⊕0⊕0⊕1⊕1⊕0⊕1⊕0⊕1⊕1=1

  • 海明码纠错

现在假设第5位出错了,也就是第五位在传输的过程中被改为“1“了(D5由0变为1)。即得到的数据为(1 1011 0110 1011)。现在要找出错误的位置(假设现在不知道出错的位置)。

S1=P1⊕D1⊕D2⊕D4⊕D5⊕D7 = 1
S2=P2⊕D1⊕D3⊕D4⊕D6⊕D7 = 0
S3=P4⊕D2⊕D3⊕D4⊕D8 = 0
S4=P8⊕D5⊕D6⊕D7⊕D8 = 1
S5=Pv⊕D1⊕D2⊕D3⊕D5⊕D6⊕D8 = 0

然后将S5S4S3S2S1 = 01001 转为十进制 = 9,即求得(1 1011 0110 1011)第9位出错,将1改为0完成纠错

你可能感兴趣的:(汉明码或者海明码的计算或者纠错)