海明码能发现几位错误,海明码能纠错几位
关于海明码的原理和计算
综合上面我们求一下信息1011的海明码是多少?
答:
我们知道信息位有4位,即为n=4,求得公式中校验位K=3。所以海明码一共7位:H7-H1 ; 信息位:D3-D0; 校验位:P3-P1。
求P3-P1在海明码中的位置。根据图中下面这句话。我们可以求得位置。
p1= 2的(1-1)次方=1
p2=2
p3=4
校验位在海明码中的位置:P1----1 P2----2 P3----4
现在我们需要求得P1-P3的值,我们的海明码就出来了。
eg: H7 下标为7, 校验码下标有1,2,4。 则需要7=4+2+1 。所以P1,P2,P3都参与了D3的校验。
接下来我们统计一个各个校验位校验的信号位有哪些。
P1----P1,D0,D1,D3
P2----P2,D0,D2,D3
P3----P3,D1,D2,D3
进行异或运算(相同为0,相异为1)
P1=D0⊕D1⊕D3=1 1 1=1
P2=D0⊕D2⊕D3=1 0 1=0
P3=D1⊕D2⊕D3=1 0 1=0
所以海明码为:1010101。
检错计算: 本来是1011,假如传过来的是1001。(D1出错了)
则从又到左D0=1 D1=0, D2=0, D3=1
G1=P1⊕D0⊕D1⊕D3=1 1 0 1=1
G2=P2⊕D0⊕D2⊕D3=0 1 0 1=0
G3=P3⊕D1⊕D2⊕D3=0 0 0*1=1
G3G2G1=101
如果是偶校验,则需要全部为0,如果是奇校验全部为1。
101的10进制。则是海明码里面的第5位出错。H5(D1)出错。则D1取反,得到。1001--1011 。 这样就实现了检错,改错了。
如何理解海明码可以发现双比特错,但是只能纠正单比特错?
纠错编码:
不仅可以发现错位,还可以指出错位的位置,为自动纠错提供数据。
海明码:
可以发现双比特错,但只能纠正单比特错。
海明码工作原理:
动一发而牵全身(在数据中有多个校验码,可能一个比特受多个校验码校验,当一个比特出了差错,可以通过校验码看出哪个比特出错)
海明码工作流程:
1.确定校验码位数r
n为有效信息的位数,k位校验码位数:
2^k=n+k+1;
例如:D=1010 (n=4)
带入上述公式得出 :
k = 3 得出对应的海明码位数为 4+3=7位
2.确定校验码和数据的位置
Note:二进制从0001开始,千万不要从0开始
校验码只能放在2的几次方的位置
p1 放在2的0次方 = 1p2 放在2的1次方 = 2p3 放在2的2次方 = 4D = 1 0 1 0 (D4--D1)| 二进制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 数据位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 码 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 实际值 | 1 | 0 | 1 | | 0 | | | 剩下的位置放置原数据
3.求出校验码的值
Note:二进制从0001开始,千万不要从0开始| 二进制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 数据位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 码 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 实际值 | 1 | 0 | 1 | | 0 | | | 以p1为例,p1二进制位末位是 1找所有二进制位位 1 的校验位 p1,D1,D2,D4 ==(?,0,1,1)
令所有要校验的位 异或 = 0: p1,D1,D2,D4 相互异或 (同0异1) 得到p1 = 0同理求出剩余
p2 找第二位是 1p3 找第三位是 1| 二进制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 数据位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 码 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 实际值 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
4.检错并纠错
| 二进制 | 0111 | 0110 | 0101 | 0100 | 0011 | 0010 | 0001 || 数据位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | | 代 码 | D4 | D3 | D2 | p3 | D1 | p2 | p1 | | 实际值 | 1 | 0 | 1-0 | 0 | 0 | 1 | 0 |假设D2从 1变成了0 接收端做第三步的逆操作
令所有要检验的位异或运算
p1 = (0,0,0,1) = 1p2 = 0p3 = 1可以看出出错的是第 三 位和第 一 位是 1 的数 也就是 D2 出错了 将D2改正
海明码纠错
1 0 0 0 1 0 1
对应 X7X6X5X4 X3 X2 X1
那么
C0=X1+X3+X5+X7 =1+1+0+1=1
C1=X2+X3+X6+X7 =0+1+0+1=0
C2=X4+X5+X6+X7 =0+0+0+1=1
此处按偶校验!
则C0C1C2=101,那么转换成10进制数就是5,证明第5位出错!
所以原码字就为1010101
答案选 D
简单理解海明校验码
二进制数据经过传送、存取等环节,会发生误码(1变成0或0变成1),这就有如何发现及纠正误码的问题。所有解决此类问题的方法就是在原始数据(数码位)基础上增加几位校验位。我们常使用的检验码有三种. 分别是奇偶校验码、海明校验码和循环冗余校验码(CRC)。
海明校验码是由RichardHamming于1950年提出、目前还被广泛采用的一种很有效的校验方法。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。但是因为这种海明校验的方法只能检测和纠正一位出错的情况。所以如果有多个错误,就不能查出了。
什么是码距?
两个码组对应位上数字的不同位的个数称为码组的距离,简称码距,又称海明(Hamming)距离。例如00110和00100码距为1,12345和13344码距为2,Caus和Daun码距为2。
海明校验码公式(假设为k个数据位设置r个校验位)
公式怎么得出来的呢?
假设有r个校验位,一个位子有0或1两种情况,r个位子就有2 r种排列情况,能表示2 r种状态。其中一个状态用来表示正确(没有错误发生)的这种情况。其余的2 r-1种状态来表示错误发生在哪一位。总共有k+r位,所以2 r-1一定要=总位子k+r。
按照该不等可以得出k与r的对应关系
注意:海明校验码是放在2的幂次位上的,即“1,2,4,8,16,32······”
实战求1011的海明码
第一步:求r的值(即校验位数)
直接根据公式代入得:
2^r-1 ≥ 4 + r
2^r-r ≥ 5
得到r最小为3
所以海明码的位数是4+3=7位
第二步:校验位和信息位对号入座
注意: 信息位的位置分配是从高位到低位依次存放
注意: 海明校验码是放在2的幂次位上的
位数|1|2|3|4|5|6|7
:-:|:-:|:-:|:-:|:-:|:-:|:-:
信息位|||1||1|0|1
校验位|r1|r2||r3|||
第三步:确定校验位的值
校验原则:被校验的海明位的下标等于所有参与校验该为的校验位的下标之和
然后将校验码校验的信息位的位置记录下来:
然后做对应信息位的异或运算(异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1))
代入表格得到
注意:按照从低位到高位的排列顺序得到海明码:1010101