海明码原理一- - 海明码是一位纠错码,即如果数据在传输过程中有一位出错,则可以知道出错的位数并通过取反将其改正过来。
海明码的基本意思是给传输的数据增加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,检查完所有的校验位,将计数器的值对应的信息位取反。
海明码的原理详解 1.海明码的概念海明码是一种可以纠正一位差错的编码。
它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位
置的一位错。
它必需满足以下关系式:2r>=n+1 或 2r>=k+r+1 海明码的编码效率为: R=k/(k+r 式中 k为信息位位数 r为增加冗余位位数 2.海明码的生成与接收方法一: 1海明码的生成。
例1.已知:信息码为:"0010"。
海明码的监督关系式为: S2=a2+a4+a5+a6 S1=a1+a3+a5+a6 S0=a0+a3+a4+a6 求:海明码码字。
解:1由监督关系式知冗余码为a2a1a0。
2冗余码与信息码合成的海明码是:
"0010a2a1a0"。
设S2=S1=S0=0,由监督关系式得: a2=a4+a5+a6=1 a1=a3+a5+a6=0 a0=a3+a4+a6=1 因此,海明码码字为:"0010101" 2海明码的接收。
例2.已知:海明码的监督关系式为: S2=a2+a4+a5+a6 S1=a1+a3+a5+a6 S0=a0+a3+a4+a6 接收码字为:"0011101"(n=7 求:发送端的信息码。
解:1由海明码的监督关系式计算得S2S1S0=011。
2由监督关系式可构造出下面错码位置关系表: S2S1S0 000 001 010 100 011 101 110 111 错码位置无错 a0 a1 a2 a3 a4 a5 a6 3由S2S1S0=011查表得知错码位置是a3。
4纠错--对码字的a3位取反得正确码字:"0 0 1 0 1 0 1" 5把冗余码
a2a1a0删除得发送端的信息码:"0010" 方法二:(不用查表,方便编程 1海明码的生成(顺序生成法)。
例3.已知:信息码为:" 1 1 0 0 1 1 0 0 " (k=8 求:海明码码字。
解:1把冗余码A、B、C、…,顺序插入信息码中,得海明码码字:" A B 1 C 1 0 0 D 1 1 0 0 " 码位: 1 2 3 4 5 6 7 8 9 10 11 12 其中A,B,C,D分别插于2k位
(k=0,1,2,3。
码位分别为1,2,4,8。
2冗余码A,B,C,D的线性码位是:(相当于监督关系式 A->1,3,5,7,9,11; B->2,3,6,7,10,11; C->4,5,6,7,12;(注 5=4+1;6=4+2;
7=4+2+1;12=8+4 D->8,9,10,11,12。
3把线性码位的值的偶校验作为冗余码的值(设冗余码初值为0:A=∑(0,1,1,0,1,0=1 B=∑(0,1,0,0,1,0=0 C=∑(0,1,0,0,0 =1
D=∑(0,1,1,0,0 =0 4海明码为:"1 0 1 1 1 0 0 0 1 1 0 0" 2海明码的接收。
例4.已知:接收的码字为:"1 0 0 1 1 0 0 0 1 1 0 0"(k=8 求:发送端的信息码。
解:1设错误累加器(err初值=0 2求出冗余码的偶校验和,并按码位累加到err中:
A=∑(1,0,1,0,1,0=1 err=err+20=1 B=∑(0,0,0,0,1,0=1 err=err+21=3 C=∑(1,1,0,0,0 =0
err=err+0 =3 D=∑(0,1,1,0,0 =0 err=err+0 =3 由err≠0可知接收码字有错, 3码字的错误位置就是错误累加器(err的值3。
4纠错--对码字的第3位值取反得正确码字:"1 0 1 1 1 0 0 0 1 1 0 0" 5把位于2k位的冗余码删除得信息码:"1 1 0 0 1 1 0 0"。