纠错编码–海明码
- 海明码:发现双比特,纠正单比特错
- 工作原理:动一发而牵全身
假设发送4位数据,在它上面加上冗余信息(冗余码,校验码),但是校验码很厉害,不但可以校验自身,同时还可以校验几位
发现有一些数据同时被几个校验码同时作用;
假如第3位数据在接收端的时候发生了错误,由原来的0变成了1,我们就可以通过校验码检测出是哪一位发生错误,检测发现第3位发生错误,它是被几位校验码牵制着,只要它产生错误都能对其他几位校验码产生影响,动一发而牵全身(改变一个数据或者一个数据发生错误,使得很多校验码察觉出来,这些校验码互相检查,最后确定出错的数据)
- 工作流程:
- 确定校验码位数r
海明不等式: 2^r-1>=k+r
r:为冗余信息
k:信息位
假设要发送数据:D=101101
数据的位数:k=6
满足不等式的最小r(冗余位)为4
也就是D=101101的海明码应该有6+4=10位
其中原数据6位,校验码4位
- 确定校验码和数据的位置
假设这4位校验码分别为P1,P2,P3,P4:数据从左到右为D1、D2、D3、D4、D5、D6
P的确定:放在2的几次方的位置(只能放在2^0 、2^1 、2^2、 2^3…对应数字为1、2、4、8…)
D的确定:把P填完剩下的空补上。
- 求出校验码的值
D=101101填入:
P1对应校验的二进制第一位为1(从右往左数),找所有二进制数第一位为1的数,
所以上面P1可以检验的有P1,D1,D2,D4,D5
如何处理以上数据呢?
令所有要校验的位异或=0(相同为0,不同为1)
代入数据
P2对应数据第二位为1,找第二位为1(从右往左数),找所有二进制数第而位为1的数,
所以上面P2可以检验的有P1、D1、D3、D4、D6
令所有要校验的位异或=0(相同为0,不同为1)
代入数据
P3同理:P3=0
P4:P4=1
综上所述:校验码为0001
所以101101的海明码为0010011101(P和D合并在表格中)
- 检错并纠错
假设海明码传输的过程中,第五位出错,因此接收到的数据位0010111101(由0变为1)。但是接收端不知道哪位出错,找出错误位。
如何找呢?
令所有要校验的位异或运算
校验位数的第三步一样,
P1:
P2:
P3:
P4:
P1P2P2P2=0101=5
所以出错位为第5位
把出错的位改为其反码,将1变为0