海明校验码校验码
一、海明校验码原理
合理地增大校验位、增大码距,能够提高校验码发现错误的能力。因此如果在奇偶校验的基础上增加校验位的位数,构成多组奇偶校验,就能够发现更多位的错误并可自动纠正错误。这就是海明校验码(Hamming Code)的实质所在
海明编码的实现原理是:在数据编码中加入几个校验位,并把数据的每一个二进制位分配在几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验组的值发生变化,这样不但可以发现出错,还能指出是哪一位出错。
二、编码方式
设有效信息位的位数为n,校验位的位数为k,则组成的海明校验码共长n+k位。
校验时需进行k组奇偶校验,将每组的奇偶校验结果组合,可以组成一个k位的二进制数,共能够表示2^k种状态。在这些状态中,必有一个状态表示所有奇偶校验都是正确的,用于判定所有信息均正确无误,剩下的 (2^k - 1) 种状态可以用来判定出错代码的位置。
因为海明校验码共长n+k位,所以校验位的位数k与有效信息位的位数n应满足关系:
2^k - 1 ≥ n + k (2-14)
三、案例分析
假设原始数据为 01101110
位置 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
数据位 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
1.根据2^k - 1 ≥ n + k计算出K=4
2.确定校验码的位置,海明校验码放在索引号为2^(i - 1)的位(i = 0,1,2,...,k)上
本例中k=4,所以校验位的索引为第1,2,4,8位。即校验码的位置一般在1,2,4,8,16,32上,位置不大于加入校验码后新的编码。
在1, 2, 4, 8位置上,分别设校验码为H1,H2,H4,H8,并把原始信息位插入,得到新的信息位:
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
新的信息位 | 0 | 1 | 1 | 0 | H8 | 1 | 1 | 1 | H4 | 0 | H2 | H1 |
3.计算校验位的值
数据位的应当由比它小的若干个校验位所校验,即看数据位位数可以由哪些校验位位数相加得到。
比如数据位3=1+2, 7=1+2+4,说明3号数据位应当由1,2号校验位校验,7号数据位应当由1,2,4号校验位校验。
数据位位数 | 12 | 11 | 10 | 9 | 7 | 6 | 5 | 3 |
校验位 | H4+ H8 | H1+H2+H8 | H2+ H8 | H1+ H8 | H1+H2+H4 | H2+ H4 | H1+ H4 | H1+ H2 |
统计各个校验位负责校验的数据位位置,对位置数进行异或运算,得到该位校验位信息。
校验位 | 出现的位置 | 对应位置上的值异或 | 结果 |
H1 | 3,5,7,9,11 | 0⊕1⊕1⊕0⊕1 | 1 |
H2 | 3,6,7,10,11 | 0⊕1⊕1⊕1⊕1 | 0 |
H4 | 5,6,7,12 | 1⊕1⊕1⊕0 | 1 |
H8 | 9,10,11,12 | 0⊕1⊕1⊕0 | 0 |
校验码H8 H4 H2 H1 = 0101
4.最终的信息位为
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
最终信息位 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
四、接收端如何检验和纠错
假设 0110 0111 1001传输为 0111 0111 1001
011 1 0111 1001 按上文重新算出校验码:H8H4H2H1=1100
出错的位数 = 原信息的校验码 ⊕ 出错后信息校验码
0101⊕1100=1001 转化为10进制就是第9位,属于出错位