--本文摘自网络--
海明码是由R·hamming 在1950所提出的,它可以纠正一位差错的编码,但它的编码效率要比正反码高,现以奇偶校验码为例,
a0=a1⊕a2⊕a3⊕…⊕an-1
其中a0 是校验码,接收时可按关系式
S= a0⊕a1⊕a2⊕a3⊕…⊕an-1
进行计算时,若S=0则无差错,若S=1则表明出错,则上面的S式子称为监督关系式,S称为校正因子。
在奇偶校验的情况下,只有一个监督关系式和一个校正因子,其取值只有两种可能(0或1),分别表示正确和出错两种情况,而不能指出出错的位置。若有两个校正因子,则有四种可能,一种表示无错,另三种表示出错,并可以指出出错的位置。
一般来说,若信息位为k位,冗余位为r位,则数据位n=k+r,用r的监督关系式来产生r个校正因子,区分无错和在n个不同的位置的一位错,则要求满足公式
2 r ³ n+1 或 2 r ³ k+r+1
此式子称为海明公式,r叫海明距离,若k=4时则r>=3,当取r=3时,n=k+r=4+3=7
1.编码步骤
(1)根据信息位数,确定校验位数,2r≥k+r+1,其中,k为信息位数,r为校验位数。求出满足不等式的最小r,即为校验位数。
表 1-2有效信息位数k与校验位位数r的对应关系
k值 | r最小值 |
1~4 | 3 |
5~11 | 4 |
12~26 | 5 |
27~57 | 6 |
58~120 | 7 |
(2)计算机校验位公式。
表1-3其实可以当成一个公式来套用,如有已经编码的数据 1100 1001 0111。我们只需把这些数据填充到校验公式,即可得到信息位与校验位。
表1-3 校验位公式表
… | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
… | I8 | I7 | I6 | I5 |
| I4 | I3 | I2 |
| I1 |
|
| 信息位 |
… |
|
|
|
| r3 |
|
|
| r2 |
| r1 | r0 | 校验位 |
填充的方法是这样的,首先看数据的最低位(即右边第1位),最低位为1,把1填充在公式表的r0位置,接着取出数据的次低位数据(即右边第2位),把它填充到r1位置,把右边第3位数填充到I1位置。依此类推,我们可以得到表1-4。
表1-4 校验位公式实例表
… | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
… | 1 | 1 | 0 | 0 |
| 0 | 0 | 1 |
| 1 |
|
| 信息位 |
… |
|
|
|
| 1 |
|
|
| 0 |
| 1 | 1 | 校验位 |
表中第2行数据为1100 001 1,这就是数据1100 1001 0111的编码信息,而表格第3行是1 011,这便是校验位。
注意:
·校验位rn 所在位数为2n,其余由信息位从右至左填充;
·信息位下标从1开始,而校验位下标从0开始。
例如:I8 对应的第十二位12=23+22,I7,对应的第十一位11=23+21+20,I6 对应的第十位10=23+21,I5 对应的第九位9=23+20,一直写到I1对应的第三位。
(可以看出它们都可写成8、4、2、1这几个数之和。12=8+4;11=8+2+1;10=8+2;9=8+1。。。)
校验位rn 由前面位数写成2的幂之和中包含2n 的位数对应的信息位之和构成
例如:
r3=I8⊕ I7 ⊕I6⊕ I5
(r3看成23,然看23参与组成了哪些位。发现它参与组成I8,I7,I6,I5)
注意:其中“⊕ ”是异或运算,在异或运算中:
0⊕ 1=1; 1⊕ 0=1; 0⊕ 0=0; 1 ⊕1=0;
(3)求校验位。根据上面我们所说的计算公式可以求出校验位。
(4)求海明码。根据上面的表格填充后,写出海明码。
2.纠错步骤
(1)根据海明码的信息位和校验位的分布规则,找出接收到的数据的信息位以及校验位。
表1-5校验位公式表
… | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
… | I8 | I7 | I6 | I5 |
| I4 | I3 | I2 |
| I1 |
|
| 信息位 |
… |
|
|
|
| r3 |
|
|
| r2 |
| r1 | r0 | 校验位 |
如有已经编码的数据 1100 1001 0111,则可以根据上表得到编码的信息为:1100 001 1;校验位为:1 011,详细过程在“编码步骤”已详细说明。
2)接收端对校验位进行验证
Sn= rn ( 校验)⊕ rn (接收)
(3)判断校正因子是否有错,并改正。
Sn Sn-1 Sn-2……S0二进制转成十进制对应的是哪位就是哪位出错,将其改正完成纠错。如1001为第九位,将第九位1变0 (或0变1) 即可。
例题1 求信息1011的海明码。
解答:
我们可以按照上面所说的编码步骤进行解题:
(1)2r≥4+r+1,确定校验们为3位23≥4+3+1。
(2)列出公式表格。
表1-6校验位公式表
7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
I4 | I3 | I2 |
| I1 |
|
| 信息位 |
|
|
| r2 |
| r1 | r0 | 校验位 |
(校验位rn 所在位数为2n( 因校验位是3位,所以n=0,1,2)从而算出校验位为第4,2,1位。)
7=22+21+20,6=22+21,5=22+20,3=21+20
r2=I4⊕ I3⊕I2
r1= I4⊕ I3⊕I1
r0= I4⊕ I2⊕I1
(3)根据公式得r 2 =0,r1 =0,r0=1。过程如下:
r2=I4⊕ I3⊕I2=1⊕0⊕1=0
r1= I4⊕ I3⊕I1=1⊕0⊕1=0
r0= I4⊕ I2⊕I1=1⊕1⊕1=1
(4)加入表格。
表1-7 对表1-6填充数据后的表格
7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
1 | 0 | 1 |
| 1 |
|
| 信息位 |
|
|
| 0 |
| 0 | 1 | 校验位 |
则海明码为1010101
例题2
信息位8位的海明码,在接收到报文110010100000,判断传输是否出错,并求出发送端发送的信息位。
解答:
2r≥8+r+1,确定校验位为4位24≥4+4+1。
表1-8校验位公式表
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
I8 | I7 | I6 | I5 |
| I4 | I3 | I2 |
| I1 |
|
| 信息位 |
|
|
|
| r3 |
|
|
| r2 |
| r1 | r0 | 校验位 |
按照上面的海明码信息位和校验位的分布情况表,对接收数据进行分解:
表1-9 对表1-8填充数据后的表格
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 位数 |
1 | 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 |
|
| 信息位 |
|
|
|
| 1 |
|
|
| 0 |
| 0 | 0 | 校验位 |
从而得到信息位为11000100,校验位为1000。
因为12=23+22 ;11=23+21; 9=23+20;7=22+21+20; 6=22+21 ;5 =22+20;3=21+20 ;
可得发送端校验位:
r3= I8⊕I7⊕ I6⊕I5;
r2= I8⊕ I4⊕ I3⊕ I2;
r1= I7⊕ I6⊕ I4⊕ I3 ⊕ I1;
r0= I7⊕ I5⊕ I4⊕I2⊕I1。
接收端可根据以下关系验证是否出错
S3= r3⊕ I8⊕ I7⊕I6 ⊕ I5;
S2= r2⊕ I8⊕ I4 ⊕ I3 ⊕I2;
S1= r1⊕ I7⊕ I6 ⊕ I4 ⊕ I3⊕ I1;
S0= r0⊕ I7⊕ I5 ⊕ I4 ⊕ I2⊕I1;
注意:其中的rn为接收端校验位。
由上面的算式得S3 S2 S1 S0=1001,将1001转成十进制是9,从而得知是原信息位第九位出错,所以正确的信息位为11010100。此外,若S3 S2 S1 S0全为0,则证明传输正确。
(原信息位第九位出错,通过查表1-8可知第九位是I5,将先前得到的信息位11000100从右往左数5位,发现是0,将它改为1,就得到正确的信息位11010100。)
例题3
若海明码的监督关系式为:
S0=a0⊕a3⊕a4⊕a5
S1=a1⊕a4⊕a5⊕a6
S2=a2⊕a3⊕a5⊕a6
接收端收到的码字为:a6a5a4a3a2a1a0=1010100
那最多一位错的情况下发送端的发送信息位是什么?
(附:海明码编码效率为:R=k/k+r,根据海明距离,信息位长度k越大,则R越高。如:k=4 r=3 R=4/7 k=7 r=4 R=7/11
用海明码只能纠正一位错。码距大于1,才能检错。码距大于d,才能检出 d 位错。纠错编码, 码距大于 2d , 可纠 d 位错。)
解答:将a6 a5 a4 a3 a2 a1 a0对应的数字代入上述监督关系式得:
S0=0⊕0⊕1⊕0=1
S1=0⊕1⊕0⊕1=0
S2=1⊕0⊕0⊕1=0
得出S2S1S0=001 根据值与错码位置的对应关系所以a0错误,发送端的发送信息应为1010101。
(从右至左排列为S2S1S0=001或说是从大至小排列为S2S1S0=001。将其转换为十进制为1,说明是第一位出错即a0出错。)