检验码的检错和纠错原理
码距:任何编码都由一组码字(code word)组成,两个码字间变化的二进制位数称为码距(code distance)
例如:
若用1位长度的二进制编码。A=1,B=0。则A和B之间最小的码距为1
若用2位长度的二进制编码。A=11,B=00。则A和B之前最小的码距为2
若用3位长度的二进制编码。A=111,B=222。则A和B之间最小的码距为3
码距与检错和纠错之间的关系
若在一个码组内为了检测e个误码,最小的码距d应该满足 d>=e+1
若在一个码组内为了纠正t个误码,最小的码距d应该满足 d>=2t+1
若在一个码组内为了纠正t个错误,同时检测e(e>=t)个错误,要求最小码距d满足 d>t+e+1
循环冗余校验码CRC
循环冗余检验码在进行编码时,其编码的结果有数据位+校验位组成,其中数据位在前,校验位在后
ps:用到了模2除法
①:信息码 K
②:检验码 R
③:编码长度N=K+R
④:生成的多项是为G(X),最高次幂是R,多项式一共有R+1项
⑤:多项式转化为二进制序列,一共R+1位二进制,用来做除数,我们把它叫多项式的二进制除数
⑥:在信息码(原始报文)的后面加上R个0,。我们把它叫做加0的原始报文。
⑦:用加0的原始报文 对多项式的二进制序列做模2除法,得到余数(余数的位数和R的位数是一样的,要是几个都是几个)
⑧:把余数加在原始报文的后面(把原始报文左移),得到总的编码 余数就是校验码
⑨:接收端对数据的校验: 除数不变,用模2除法,验证余数是否为0,若为0则说明数据帧没有出
海明码校验
① 计算校验码位数
N 整个传输信息的二进制位数
K有效信息的位数
R校验位的位数
它们之间的关系满足 N=K+R<=2^n - 1 (确定了校验位的位数)
有效信息位数 | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
校验码位数 | 2 | 3 | 4 | 5 | 6 | 7 |
②确定校验位的位置
校验码Pi 必须是在2的n次方位置,即只能放在H1,H2,H4,H8...(1、2、4、8、16)
③计算校验位 Pi
1101 -----即: D3 D2 D1 D0 = 1 1 0 1
整理可得: H7 H6 H5 H4 H3 H2 H1
= D3 D2 D1 P3 D0 P2 P1
代入数字 = 1 1 0 P3 1 P2 P1
根据:H3 = H1+H2 (右下标之和等于左下标。)
H5 = H1+H4
H6 = H2 + H4
H7 = H1 + H2 + H4
可得:P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或,即:与H1有关的信息码进行异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7
计算可得:P1 = 0,P2 = 1,P3 = 0
所以:最终海明码: H7 H6 H5 H4 H3 H2 H1 = 1 1 0 0 1 1 0
④纠错和检错
设检测位G1,G2,G3:
则有:G1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;
G2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;
G3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;
当偶校验时:G3 G2 G1 值皆为0则数据无误,若G3 G2 G1不全为0说明数据传输有误,且其十进制指出了错误发生的位置。
(例:G3 G2 G1 = 101,其十进制为 5 ,即:H5 发生了错误,H5的位置为D1,则说明D1传输错误,则将D1的位置取反,即可纠错。)
所以海明码定义:具有纠正一位错误的能力