一、什么是海明码
海明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。
能侦测并更正一个比特的错误;
若有两个比特出错,则只能侦测,不能更正;
若有三个或更多的比特出错,则不能侦测,更不能更正。
二、海明码简述
当 n = 8 时,则 k = 4 ;
当 n = 16 时,则 k = 5 。
如上:校验位p由自己校验,数据位H(x)由最靠近自己的校验位P(i)对应的数据位H(i)加上最近的检验位P(i)前面的校验位P(j)对应的数据位H(j),即H(x)=H(i+j)
如:H11前一位P4对应H8,则应该加上H3,由于H3是数据位,则往前推,加上H2和H1,分别对应P4 P2 P1
异或运算的规则是:
0 ⨁ 0 = 0 0 ⨁ 1 = 1
1 ⨁ 1 = 0 1 ⨁ 0 = 1
三、海明码纠错
接收端在接收到海明码后,对将校验位 P 与其相对应的数据位 D 进行异或运算,并根据运算结果生成编码结果 G4G3G2G1(这里还是以数据位 8 位时举例,若是 16 位,则结果为 G5G4G3G2G1)。
注意观察 P 和后面的 D 组数据之间的关系,如果进行偶检验,没有错误时,G4、G3、G2、G1 应该全为0( 奇校验时无错全为1 )。不全为0则说明发生了错误,且 G4、G3、G2、G1的值化成十进制值 m 就指出了海明码的第 m 个位置出现了错误,如 G4、G3、G2、G1 = 1110 说明海明码 H7出现了错误。
四、示例
若要传输的值为10101101,则根据上述校验值P(a)为0100,假设传输中出现差错,接收方,接收值为10100101,则当前校验值P(b)为0011,P(a)与P(b)异或运算后值G为0111,换算为十进制值为7,则可知第七位H7出错,将该位求反,即0求反为1,接收差错值可由10100101纠错为正确值10101101
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 | |
D7 | D6 | D5 | D4 | P4 | D3 | D2 | D1 | P3 | D0 | P2 | P1 | |
数据 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | ||||
校验值A | 0 | 1 | 0 | 0 | ||||||||
接收值 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | ||||
接收后校验值B | 0 | 0 | 1 | 1 | ||||||||
AB异或运算G | 0 | 1 | 1 | 1 |