分类:
2009-04-15 14:44:45
那么得到的海明码是
H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D7 D6 D5 D4 P4 D3 D2 D1 P3 D0 P2 P1
自己可以列个校验关系表
H1(P1) 1 P1
H2(P2) 2 P2
H3(D0) 1+2 P1,P2
H4(P3) 4 P3
H5(D1) 1+4 P1,P2
H6(D2) 2+4 P2,P3
H7(D3) 1+2+4 P1,P2,P3
H8(P4) 8 P4
H9(D4) 1+8 P1,P4
H10(D5) 2+8 P2,P4
H11(D6) 1+2+8 P1,P2,P4
H12(D7) 4+8 P3,P4
P1校验 P1,D0,D1,D3,D4,D6
P2校验 P2,D0,D2,D3,D5,D6
P3校验 P3,D1,D2,D3,D7
P4校验 P4,D4,D5,D6,D7
要知道海明码Hi由哪些校验组校验
可以把i化成 二进制数 数中哪些位k是1,就有哪些Pk校验
如H7 7=0111 所以由P1,P2,P3
H11 11=1011 所以由P1,P2,P4
H3 3=0011 所以由P1,P2
P1=D0 xor D1 xor D3 xor D4 xor D6
P2=D0 xor D2 xor D3 xor D5 xor D6
P3=D1 xor D2 xor D3 xor D7
P4=D4 xor D5 xor D6 xor D7
其中xor是异或运算
其实也很简单. 先做下面运算.
G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6
G2 = P2 xor D0 xor D2 xor D3 xor D5 xor D6
G3 = P3 xor D1 xor D2 xor D3 xor D7
G4 = P4 xor D4 xor D5 xor D6 xor D7
当不全为0表示有错 G4G3G2G1
如 G4G3G2G1
把它求反就可以纠正错误了.
设数据为01101001,试用4个校验位求其偶校验方式的海明码.
传输后数据为011101001101,是否有错?
=1 xor 0 xor 1 xor 0 xor 1
=1
=1 xor 0 xor 1 xor 1 xor 1
=0
=0 xor 0 xor 1 xor 0
=1
=0 xor 1 xor 1 xor 0
=0
0 1 1 0 0 1 0 0 1 1 0 1
G1 = P1 xor D0 xor D1 xor D3 xor D4 xor D6
=1
=0
=0
=1
011001001101 和我们算的一样.
由此可见 海明码 不但有检错还有纠错能力
CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码.
现在简单介绍下它的原理:
可以证明(数学高手自己琢磨证明过程)存在一个最高次幂为 n-k=r
根据g(x)可以生成k位信息的校验码,g(x)被称为 生成多项式
把C(x)左移r位,就是相当于 C(x)*pow(2,r)
给校验位空出r个位来了.
C(x)*pow(2,r) / g(x) = q(x) + r(x)/g(x)
所以有C(x)*pow(2,r) = q(x)*g(x) + r(x)
C(x)*pow(2,r) + r(x)就是所求的n位CRC码,由上式可以看出它是生成多项式g(x)的倍式.
所以如果用得到的n位CRC码去除g(x)如果余数是0,就证明数据正确.
否则可以根据余数知道 出错位 .
所以上式等价于C(x)*pow(2,r) + r(x) = q(x)*g(x)
1.多项式和二进制编码
x的最高次幂位对应二进制数的最高位.以下各位对应多项式的各幂次.
有此幂次项为1,无为0. x的最高幂次为r时, 对应的二进制数有r+1位
例如g(x)=pow(x,4) + pow(x,3) + x + 1
对应二进制编码是 11011
是发送方和接受方的一个约定,也是一个二进制数,在整个传输过程中,这个数不会变.
在发送方,利用 生成多项式 对信息多项式做 模2运算
在接受方利用 生成多项式 对收到的 编码多项式
生成多项式应满足:
a.生成多项式的最高位和最低位必须为1
b.当信息任何一位发生错误时,被生成多项式模2运算后应该使余数不为0
c.不同位发生错误时,应该使余数不同.
d.对余数继续做模2除,应使余数循环.
不过不用我们生成
下面给出一些常用的生成多项式表
n k 二进制码(自己根据 多项式和二进制编码 的介绍转)
7 4 1011 或 1101
7 3 11011 或 10111
15 11 1011
31 26 100101
a.加减法法则
0 +/- 0 = 0
0 +/- 1 = 1
1 +/- 0 = 1
1 +/- 1 = 0
注意:没有进位和借位
利用模2加求部分积之和,没有进位
利用模2减求部分余数
没有借位
每商1位则部分余数减1位
余数最高位是1就商1,不是就商0
当部分余数的位数小于余数时,该余数就是最后余数.
1011)1100000
1011
1110
1011
1010
1011
0010(每商1位则部分余数减1位,所以前两个0写出)
0000
010(当部分余数的位数小于余数时,该余数就是最后余数)
最后商是1110余数是010
好了说了那么多没用的理论.下面讲下CRC的实际应用
例: 给定的生成多项式g(x)=1011, 用(7,4)CRC码对C(x)=1010进行编码.
由题目可以知道下列的信息:
C(x)=1010,n=7,k=4,r=3,g(x)=1011
C(x)*pow(2,3)=1010000
C(x)*pow(2,3) / g(x) = 1001 + 011/1011
所以r(x)=011
所以要求的编码为1010011
例2: 上题中,数据传输后变为1000011,试用纠错机制纠错.
1000011 / g(x) = 1011 + 110/1011
不能整除,所以出错了. 因为余数是110
查1011出错位表可以知道是第5位出错.对其求反即可.