海明码是一种多重奇偶检错系统,用于检错和纠错。
以下内容都以 例题:“设8位有效信息为01101110,写出它的的海明校验码” 为例。
1.校验位的位数
设海明校验码Hn…H2H1共有n位,原始有效信息Dk…D2D1共k位,称为(n,k)码,校验位Pr…P2P1,包含r个偶校验组,n = k + r 。
为了能指出n位海明码中的所有一位错,每个原始数据位至少位于两个以上的校验组,这样才能通过检错码Gr…G2G1对照检错。
n,k,r应满足:n = k + r <= 2 r - 1
表为 k 与 r 不同组合的关系
| k | 1 | 2 ~ 4 | 5 ~ 11 | 12 ~ 26 | 27 ~ 57 |
|---|---|---|---|---|---|
| r | 2 | 3 | 4 | 5 | 6 |
例题原始信息共8位,k = 8, r = 4 ,n = 12 , 称为(12 ,8)码。
2.编码规则
1.校验位在海明码中的映射
校验位P1-4对应在海明码H1-12中位置的关系为 2 n - 1 (n为P中的1~4),如P1 对应H(21-1) 就是H1,P2 对应H(22-1) 就是H2 ,P3 对应H(23-1) 就是H4,P4 对应H(24-1) 就是H8 。(详见下表)
所有校验位都应该存放在 幂次方 位上,校验位位置映射完成后,将原始数据位D1D2…Dk依次填入即可。
所以海明码H1H2…H12就是 P1P2D1P3D2D3D4P4 D5D6D7D8
校验位的逻辑表达式
注:” ⊕ “ 符号为异或,相同取0,不同取1 。
P1 = D1 ⊕ D2 ⊕ D4 ⊕ D5 ⊕ D7 = 1( D1、…、D7为下表中P1所对应的G1校验组中标记过的原始数据位,以下同理)
P2 = D1 ⊕ D3 ⊕ D4 ⊕ D6 ⊕ D7 = 1
P3 = D2 ⊕ D3 ⊕ D4 ⊕ D8 = 0
P4 = D5 ⊕ D6 ⊕ D7 ⊕ D8 = 1
代入数据,所以原始数据01101110的海明码为 110011011110
2.校验组(G1 ~ 4)
在G1行中共有6个 “ √ ” 标记,其对应的海明码分别为H1、H3、H5、H7、H9、H11 ,它们所对应的检错码均为 “ ###1 ”(第四位数为1),代表H1、H3、H5、H7、H9、H11 都参与了校验组G1的校验。 (详见下表)
在G3行中共有5个 “ √ ” 标记,其对应的海明码分别为H4、H5、H6、H7、H12 ,它们所对应的检错码均为 “ #1## ”(第二位数为1),代表H4、H5、H6、H7、H12 都参与了校验组G3的校验。
校验组G2、G4 同理。
校验组分组为:
G1 :P1 D1 D2 D4 D5 D7
G2 :P2 D1 D3 D4 D6 D7
G3 :P3 D2 D3 D4 D8
G4 :P4 D5 D6 D7 D8
校验组的逻辑表达式:
G1 = P1 ⊕ D1 ⊕ D2 ⊕ D4 ⊕ D5 ⊕ D7 = 0
G2 = P2 ⊕ D1 ⊕ D3 ⊕ D4 ⊕ D6 ⊕ D7 = 0
G3 = P3 ⊕ D2 ⊕ D3 ⊕ D4 ⊕ D8 = 0
G4 = P4 ⊕ D5 ⊕ D6 ⊕ D7 ⊕ D8 = 0
表为例题(12,8)码对应的编码规则
| 海明码 | H1 | H2 | H3 | H4 | H5 | H6 | H7 | H8 | H9 | H10 | H11 | H12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 映射关系 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 | D7 | D8 |
| 检错码 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 |
| G1 | √ | √ | √ | √ | √ | √ | ||||||
| G2 | √ | √ | √ | √ | √ | √ | ||||||
| G3 | √ | √ | √ | √ | √ | |||||||
| G4 | √ | √ | √ | √ | √ |
3.检错与纠错
在接收端收到海明码后,按上述分组检验每组的正确性,每组异或为0则该组没出错,否则该组出错。
若G4G3G2G1 = 0000 ,则大概率没有出错。
若G4G3G2G1 = 1010 ,则G4和G2出错,只有D6和D7都参与了检验组G4和G2的校验,但D7还参与了检验组G1的校验,如果D7出错,检验组G1也应该出错,所以出错的位置是D6 ;也可理解为1010的十进制是10,则海明码H10(数据D6)出错,将H10取反即可。
注:若十进制对应的位置是校验位P出错,不需要纠正,因为我们只需要确保数据不出错就可以。
若例题中接收方收到的有效信息变为01101111,则G4G3G2G1 = 1100 , 海明码H12(数据D8)出错,将H12取反为0即可。