0%

海明校验

海明码是一种多重奇偶检错系统,用于检错和纠错。

以下内容都以 例题:“设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 同理。

校验组分组为:

G :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即可。