1.汉明码实质及原理
汉明码实质上是多重奇偶校验,其实现原理是:在有效信息位中加入几个校验位形成汉明码,使码距比较均匀的拉大。具有检验并纠正一位错误的能力。
2.核心公式介绍
2^k >= N+K+1
其中,K
代表校验位的位数,N
代表信息位的位数
下面是 信息位N值与校验位K值的对应关系表(重要)
信息码位数(N) | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
---|---|---|---|---|---|---|
校验码位数(M) | 2 | 3 | 4 | 5 | 6 | 7 |
3.确定校验位的位置
根据上表确定校验码位数之后,将它插入到信息码中(这里信息码用D表示,校验码用P表示),规则是:
- 校验码Pi 必须是在2的i-1次方位置,即只能放在H1,H2,H4,H8…
- 这里指的位置都是从右向左排序(信息码和校验码都一样)
举个例子,现有一个4位信息码(D1,D2,D3,D4)
,它的排列是这样的:
D4 D3 D2 P3 D1 P2 P1
知道位置之后,下一步就是确定校验位的值了
4.确定校验位的值(核心)
我之前是卡在这一步了,我觉得大部分博客没有直观的将这部分相关的知识讲到位,都是含糊其辞,其实用对方法后,是很简单的,下面是确定校验位值的思路:
- 根据校验位的位数,确定每个位置占用的校验位号
- 根据参与校验的信息位的位置,确定信息位的值(异或计算)
下面通过一个例子介绍,现在有一个二进制编码1011(D1,D2,D3,D4),求它的汉明码
-
首先确定校验位的位数及位置
信息码共
4
位,校验码通过公式计算为3
位,一共7
位,排列如下D4 D3 D2 P3 D1 P2 P1
它的校验位的对应表如下:
位置(从右至左) | 占用的校验位号 | 备注 |
---|---|---|
1 | 1 | 1=1 |
2 | 2 | 2=2 |
3 | 1,2 | 3=1+2 |
4 | 4 | 4=4 |
5 | 1,4 | 5=1+4 |
6 | 2,4 | 6=2+4 |
7 | 1,2,4 | 7=1+2+4 |
-
确定校验位的值(敲黑板)
确定各校验码 的参与校验位的信息位的位置,如下表
校验码名称(位置) | 参与校验码的信息位的位置 |
---|---|
P1 (位置为1) | 1,3,5,7 (1出现过的位置) |
P2 (位置为2) | 2,3,6,7 (2出现过的位置) |
P3 (位置为4) | 4,5,6,7 (4出现过的位置) |
现在就可以根据上表确定各校验位的值了(异或运算):
P1 = D1⊕D2⊕D4 = 1⊕0⊕1 = 0
P2 = D1⊕D3⊕D4 = 1⊕1⊕1 =1
P3 = D2⊕D3⊕D4 = 1⊕0⊕1 = 0
异或运算简单来说,就是两个相同的数结果为0,不同的数结果为1,这里看1的个数就成,偶数为0,奇数就是1
所以生成的海明码为
D4 D3 D2 P3 D1 P2 P1
1 1 0 0 1 1 0
5.汉明码纠正
假设传输中H6(D3)发生了错误,原码就变为:
1 0 0 0 1 1 0
检错过程很简单,将接收到的码字重新进行奇偶校验 :
S1 = P1⊕D1⊕D2⊕D4 = 0⊕1⊕0⊕1 = 0
S2 = P2⊕D1⊕D3⊕D4 = 1⊕1⊕0⊕1 = 1
S3 = P3⊕D2⊕D3⊕D4 = 0⊕0⊕0⊕1 = 1
所以真值为S3,S2,S1
,即110,转换为十进制为6,即第六位发生了错误,纠正
1 1 0 0 1 1 0