海明码是一种可以发现双比特位错误,纠正单比特位错误的纠错编码。
冗余码的位数
在检错编码中我们用到了二进制异或的运算方式,海明码也用到了这种方式。只是它的冗余码位数并不是像奇偶校验时固定的帧首的0或1。通过海明不等式来求海明码的冗余码的位数
例如:
已经知道信息位的个数为6时,通过海明不等式可以求出来冗余信息位个数为4。
可能有一些小伙伴会疑惑为什么这样求冗余码的个数,在下面了解原理后或许就会懂了。
冗余码的位置
为了能够找到单比特位错误的位置,海明码的冗余码是在二进制数的每一位上,即2的几次方的位置(或许这么说不好理解,我在这里举一个二进制数的例子,其实说人话就是1,2,4,8......二的n次方)
例如:
数据信息 101101 我们在上面求过了冗余码的个数,这里可以知道冗余码的个数为4.
- 冗余码是在二进制数的每一位上,二进制的数第一位就是000001,那么第一位冗余码p1应在第一位
- 二进制数的第二位是000010,那么第二位冗余码p2就应在第二位。
- 二进制数的第三位是000100,那么第三位冗余码p3就应在第四位。
- 二进制数的第四位是001000,那么第四位冗余码p4就应在第八位
即下图中的p1,p2等等所在的位置。
剩下的位置由数据信息顺序填满,即D1,D2等等位置。
那么现在有个新的问题出现了:只有数据部分有实际值(即我们的数据101101),我们只求了冗余码的位置,没有求冗余码的值,那里仍然是空的,下面我们就要求冗余码的实际值了。
冗余码的实际值
以上面图为例,我们来学习怎么求冗余码的值。
第n位冗余码的实际值:通过这个公式计算实际值:
二进制数第n处所有为1的实际值进行异或后结果为0
- 以第一位为例冗余码P1的实际值:1⊕3⊕5⊕7⊕9=0(二进制数第一位为1的数,他们的二进制数为看上图第一行的共性为第一位为1——xxx1)即P1=1⊕0⊕1⊕0=0,所以冗余码P1的实际值为0
- 第二位冗余码的实际值:P2⊕3⊕6⊕7⊕10(二进制数第二位为1的数,他们的二进制数为看上图第一行的共性为第二位为1——xx1x)即P2=1⊕1⊕1⊕1=0,所以冗余码P2的实际值为0
- 同理第三位冗余码的实际值为想x1xx进行异或和,为P3=0⊕1⊕1=0,冗余码第三位的实际值为0
- 第四位冗余码为1xxx进行异或和,为P4=0⊕1=1,冗余码第四位的实际值为1
所以我们就可以得到下表,知道了冗余码的实际值就得到了海明码。
上例中的海明码为0010011101,4位冗余码与6位数据部分。得到了海明码,发送端将其发送到接收端。
接收端接收后的处理
接收端接收到海明码以后,会和我们求冗余码的实际值一样做一个相同的操作——求所有位二进制数某一位的异或和(上例中的xxx1,xx1x,x1xx,1xxx)因为我们求冗余码时令所有的异或和结果为0,如果某一位发生跳变,那么那一位的异或和结果将会为1,如果没有发生跳变正常传输,那么结果就正常为0。
纠正单比特跳变
我们举一个发生单比特位跳变的例子来看。假设第五位发生了跳变——0101位发生跳变,在上面的例子中原来该处的实际值为0,现在跳变成1.
- 0101位,即二进制的第一位和第三位。
- 冗余码第一位在原来第五位(0101)为0时异或和为0,发生跳变后异或和结果应为1
- 冗余码第二位与二进制第二位为1的其它数进行异或和运算与0101无关(就不管XX1X的事情嘛),异或和结果为0
- 同理冗余码第三位在0101位没有发生跳变时异或和为0,发生跳变后异或和结果应为1
- 第四位与第二位原因相同,异或和结果为0
- 所以我们接收到的海明码进行处理后得到0101(第一位冗余码为个位,其次向上)
- 即发现第五位发生跳变可以进行纠正
发现双比特位错误
我们在上面单比特跳变时候举了第五位发生跳变,这里举例5,6发生了跳变
第五位(0101)发生跳导致——处理结果第一位与第三位受到影响
第六位(0110)发生跳变——处理结果第二位与第三位受到影响
所以异或和后的结果应该是第一位和第二位受到影响,即0011,但我们的第三位并没有发生跳变。因此在发生双比特位跳变的情况下,我们并不能确定发现错误的位置,只能知道发生了错误
这里有了一个新的问题——我们不知道海明码传输到底发生了几位错误,即上面单比特第五位0101错误时,我们不知道到底是发生了双比特错误还是第五位发生了跳变。
这可以通过海明校验与奇偶校验结合使用,我们在最后一位加上一位奇偶校验码。
检测的时候会计算出海明码的校验码E+奇偶校验码P,有以下四种情况:
1/ E=0,P=0 没有错误皆大欢喜
2/ E≠0,P=1 有一位错,并可以纠正错误
3/ E≠0,P=0 有两位错,但不能纠正
4/ E=0, P=1 奇偶校验位出错
缺点:海明校验的本质仍然是每一步使用的奇偶校验,如果第3位(0011),第五位(0101),第六位(0110)都发生跳变时,海明校验的结果仍为0000,会产生错误的判断,即上述的情况4
,