纠错编码-海明码

一.海明码

海明码只能发现双比特错误,纠正单比特错误

二.工作原理

“动一发而牵全身”,因为海明码是一个多重校验码,也就是码字中的信息码位同时被多个校验码进行校验

三.工作流程

1.确定校验码位数

海明不等式2^r>=k+r+1,r为冗余信息位,k为信息位
eg:要发送的数据为D=101101
则数据的位数k=6
满足的不等式最小r为4
也就是D=101101的海明码应该有6+4=10位,其中原始数据6位,校验码4位

2.确定校验码和数据的位置

还是上面的那个例子D=101101,假设这4位校验码分别为P1,P2,P3,P4,数据从左往右为D1,D2...D6
校验码必须是在2n次方位置,如第1、2、4、8、16、32,...位(对应2^0 2^1 2^2 2^3 2^4 2^5……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,...位(是从最左边的位数起的)

                     
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 1 0 1 1 0 1

3.求出校验码的值

                                                D=101101
                     
二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 0 0 1 0 0 1 1 1 0 1

可以看出P1对应的二进制第一位为1(看二进制是几位的话就看最后一个数据位是几位二进制格式)可以发现D1,D2,D4,D5对应的二进制第一位也是1,则P1代码校验的数据为D1,D2,D4,D5
令所有要校验的位异或=0(即同0异1)
1 0 1 0
P1⊕D1⊕D2⊕D4⊕D5⊕=0 可推出P1=0
1 0 0
同理P2对应的二进制第二位是1,则P2代码校验的数据为D1,D3,D4,D6
1 1 1 1
P2⊕D1⊕D3⊕D4⊕D6⊕=0 可推出P2=0
0 1 0
同理P3对应的二进制第三位是1,则P3代码校验的数据为D2,D3,D4
0 1 1
P3⊕D2⊕D3⊕D4=0 可推出P3=0
1 0
同理P4校验的数据为D5,D6
0 1
P3⊕D5⊕D6=0 可推出P4=0
1
具体的计算方法我参阅了http://www.cnblogs.com/scrutable/p/6052127.html,即

p1(第1个校验位,也是整个码字的第1位)的校验规则是:从当前位数起,校验1位,然后跳过1位,再校验1位,再跳过1位,....。这样就可得出p1校验码位可以校验的码字位包括:第1位(也就是p1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,...。然后根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p2(第2个校验位,也是整个码字的第2位)的校验规则是:从当前位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。这样就可得出p2校验码位可以校验的码字位包括:第2位(也就是p2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p3(第3个校验位,也是整个码字的第4位)的校验规则是:从当前位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。这样就可得出p4校验码位可以校验的码字位包括:第4位(也就是p4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p4(第4个校验位,也是整个码字的第8位)的校验规则是:从当前位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。这样就可得出p4校验码位可以校验的码字位包括:第8位(也就是p4本身)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,...。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

综上所述101101的海明码为0010011101

4.检验并纠错

                                               D=101101
                     
二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
数据位 1 2 3 4 5 6 7 8 9 10
代码 P1 P2 D1 P3 D2 D3 D4 P4 D5 D6
实际值 0 0 1 0 0 1 1 1 0 1

故101101的海明码为0010011101
假设第五位出错,因此接收到的数据位为00101111101
对所有要校验的位异或运算
0 1 1 1 0
P1⊕D1⊕D2⊕D4⊕D5⊕=1
1 0 1 1

0 1 1 1 1
P2⊕D1⊕D3⊕D4⊕D6=0
1 0 1 0

0 1 1 1
P3⊕D2⊕D3⊕D4=1
1 0 1

1 0 1
P3⊕D5⊕D6=0=0
1 0
从P4往P1写可得到0101,即二进制序列为0101,恰好对应的二进制5,这样就找到了出错的位置,即出错位是第五位

你可能感兴趣的:(纠错编码-海明码)