海明码计算及其纠错原理-网络文摘总结
异或算符的符号表示是⊕,圆圈中间一个加号。运算法则总结两句话就是:异为1,同为0。换言之,1⊕1=0,1⊕0=1。这种运算将在海明码纠错的过程中起到一个什么作用呢?S=a1⊕a2.........an-1⊕an=0,假设其中ak=0,那么当ak由0变为1时,S会怎样变化呢?这里很容易证明,S将由0跳变为1。如果数列中有两位数据发生变化呢?其实两位的话可以刚好抵消,但是这里我们是无需关心的,因为这里我们只讨论海明码纠正一位错的情况!海明码解说开始!
假设要传输的数据是a4a3a2a1,数据位长度为4位,设校验位长度为m,那么应该满足2^m-1>=m+4。解出,m=3。校验位为m位,那么,校验码可以表示的最大十进制数字为2^m-1,去掉一位的原因是全0表示传输的数据没有错误!校验码表示能够纠正的二进制数字位数,为了保证能够纠正数据位最高位。那么2^m-1至少应该大于等于数据位和校验位长度的总和! 好了,设校验码为r3r2r1。
根据海明码规定,校验位应放在数据位的2^i-1的位置,整理好后设为M7M6M5M4M3M2M1。
好了,最后的问题,怎么计算校验码呢?它怎么纠错呢?这里我们设海明码的监督关系式为S3 S2 S1。请大家仔细想一想,S1是不是代表三位二进制校验码的最低位,让我们看看有多少位数字参与了S1的运算,很容易看出M1、M3、M5、M7,所以S1=M1⊕M3⊕M5⊕M7(为什么是这样呢?M的下标,它代表的是数字在传输数据的第几位。7=4+2+1,5=4+1,3=2+1,1=1。可见,这几位数字均参与了第一位的运算,这样,S1=1就能代表数据位的第一位出错了!),同理,S2=M2⊕M3⊕M6⊕M7,S3=M4⊕M5⊕M6⊕M7。 我们再来看这三个监督关系式
上面我们说到,要想数据位没有错误,S3S2S1=000,通过这可以计算出r3r2r1,因为S1=0,根据异或运算,将M3⊕M5⊕M7看作一个整体,M1=M3⊕M5⊕M7,r1=M1。同理可以计算出r2r1。那么纠错到底是怎么实现的呢?请大家睁大眼睛仔细看上面三个监督表达式。正常情况下,S3S2S1均为0,我们假设M3出现了错误,发生了跳变,那么S2 S1将变成什么呢?由上面的监督关系式发现M3参与了S2S1的运算,所以在M3发生跳变的情况下S2S1也将发生跳变,由0变为1,但由于S3未参与M3的运算,其值不变,仍为0。所以监督关系式S3S2S1=011=3,所以在传输数据的第三位出现了错误。同理,可发现M6参与了S3S2的运算,当运算出错时,监督关系式为110=6,也刚好可以判断出是传输数据的第六位出错了。
海明码是一位纠错码,即如果数据在传输过程中有一位出错,则可以知道出错的位数并通过取反将其改正过来。海明码的基本意思是给传输的数据增加r个校验位,从而增加两个合法消息(合法码字)的不同位的个数(海明距离)。假设要传得信息有m位,则经海明编码的码字就有n=m+r位。
面试题:
把1K个苹果分到10个篮子里(当然苹果分到篮子里后就不能再动了,只能分一次)。
要求:
用这10个篮子能够组成1-1000任意一个数字 。
这是个考察二进制思想的题目,让每个篮子里的苹果数等于二进制位的权重就可以了,即分别放1,2,4,8,……。
换到海明码里也是这样,为了让r个校验码(r个篮子)表示n个信息位(n个苹果),且无论哪一位错误都能表示出来(能够组成任意一个数字),先将码字的位从左到右标号,分别为1,2,3,……。显然要将校验位安排在第1,2,4,8,……编号上,数据放在其他的编号上。为了能够将n位信息全部表示出来还应该有2r-1>=n。每个数据位影响几个校验位,譬如编号11
对应的数据影响编号1、2、8对应的校验位,因为11=1+2+8。为了更清楚理解上面的意思,让我们来看一个例子:将1001000编码成海明码。
因为编号1、2、4、8处是校验位,所以3、5、6、7、9、10、11处是数据位,将要传输的数据与编号对应如下:
3 5 6 7 9 10 11 1 0 0 1 0 0 0 |
数据位影响的校验位如下:
编号3处的数据位影响编号1、2处的校验位,编号7处的数据位影响编号1、2、4处的校验位,经偶校验的校验位1、2的值为0,校验位4的值为1,其他校验位均为0。所以对应的海明码 为:00110010000。
接受方通过检验校验位来计算出错的位,如果校验位i的奇偶性不正确,则将计数器的值加i,如果所有的校验位都检查完了,且计数器为0,则检查成功,否则计数器的值就是出错的位所对应的编号,并将该位取反。
PS:其实接受方可以不用检查校验位是否有正确的奇偶性,而是看它是否为1,若是则计数器加i,检查完所有的校验位,将计数器的值对应的信息位取反。
海明码校验是为了保证数据传输正确而提出的,本来就是一串要传送的数据,
如:D7,D6,D5,D4,D3,D2,D1,D0,这里举的是八位数据,可以是n位数据。就这样传送数据,不知道接收到后是不是正确的。所以,要加入校验位数据才能检查是否出错。这里涉及到一个问题,要多少位校验数据才能查出错误呢?
我们只要能检测出一位出错,则对于8位信息数据,校验位为4位。满足下列条件:2的k次方大于等于n+k+1,其中k为校验位位数,n为信息数据位位数。验证一下,2的4次方等于16,n+k+1等于8+4+1等于13。
8位信息数据与4位校验位总共有12位数据,怎么排列呢?我们先把校验位按P4,P3,P2,P1排列,用通式Pi表示校验位序列,i为校验位在校验序列中的位置。传送的数据流用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1表示,接下来的问题是如何用D7,D6,D5,D4,D3,D2,D1,D0与P4,P3,P2,P1来表M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1了。
校验位在传送的数据流中位置为2的i-1次方,则P1在M1位,P2在M2位,P3在M4位,P4在M8位。其余的用信息数据从高到低插入。传送的数据流为D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1。
接下来,我们要弄明白如何找出错误位的问题。引进4位校验和序列S4,S3,S2,S1。S4,S3,S2,S1等于0,0,0,0表示传送的数据流正确;如S4,S3,
S2,S1等于0,0,1,0则表示传送的数据流中第2位出错;如S4,S3,S2,S1等于0,0,1,1则表示传送的数据流中第3位出错;依次类推。
用M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1如何表示S4,S3,S2,S1呢,简单的方法就是S1=1时,S4,S3,S2从0,0,0到1,1,1的所有的Mx异或。
即S1等于M1异或M3异或M5异或M7异或M9异或M11。也就是S1等于P1异或D0异或D1异或D3异或D4异或D6。
S2=1时,S4,S3,S1从0,0,0到1,1,1的所有的Mx异或。即S2等于M2异或M3异或M6异或M7。
S3=1时,S4,S2,S1从0,0,0到1,1,1的所有的Mx异或。即S3等于M4异或M5异或M6异或M7异或M12。
S4=1时,S3,S2,S1从0,0,0到1,1,1的所有的Mx异或。即S4等于M8异或M9异或M10异或M11异或M12。这样,对于一串码流,知道几位校验位,可以很快确定哪一位出错。
而在发送端,可以根据S4,S3,S2,S1的表达式求出P4,P3,P2,P1的表达式,只要把式子右边的P4或P3或P2或P1移到左边替换掉S4或S3或S2或S1就
可以了。
下面举例说明:用^表示异或
D7,D6,D5,D4,D3,D2,D1,D0=11010001
S4=M8^M9^M10^M11^M12=D7^D6^D5^D4^P4; P4=D7^D6^D5^D4;
S3=M4^M5^M6^M7^M12 =D7^D3^D2^D1^P3; P3=D7^D3^D2^D1;
S2=M2^M3^M6^M7 = D3^D2^D0^P2; P2= D3^D2^D0;
S1=M1^M3^M5^M7^M9^M11=D6^D4^D3^D1^D0^P1; P1=D6^D4^D3^D1^D0;
所以,
P4=D7^D6^D5^D4=1^1^0^1=1
P3=D7^D3^D2^D1=1^0^0^0=1
P2= D3^D2^D0= 0^0^1=1
P1=D6^D4^D3^D1^D0=1^1^0^0^1=1
故,传送码流为D7,D6,D5,D4,P4,D3,D2,D1,P3,D0,P2,P1等于110110001111
若接收端收到110110001111,则
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^0^0^1=0
S2=M2^M3^M6^M7=0^0^1^1=0
S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
故,接收码流正确。
若M6出错,由0变为1。则
S4=M8^M9^M10^M11^M12=1^1^0^1^1=0
S3=M4^M5^M6^M7^M12=1^0^1^0^1=1
S2=M2^M3^M6^M7=0^1^1^1=1
S1=M1^M3^M5^M7^M9^M11=1^1^0^0^1^1=0
即S4S3S2S1=0110,此为十进制的6,说明第六位出错,也就是M6出错。完全符合。