首页 > 技术文章 > [计算机组成原理] 海明校验码

iclaire 2020-04-06 15:23 原文

[计算机组成原理] 海明校验码

海明校验码是一种可以纠正一位差错的编码,采用分组奇偶校验

编码

1.计算校验位的位数

假设信息位为k位,增加r位校验位,构成n=k+r位海明码。因为海明码要纠正一位错误,n位每一位错加上n位全对共n+1种状态,用二进制编码,r位校验位可以表示2r个状态,则r满足:2r≥k+r+1

以下为几种k和r的对应关系:

k r最小值
1~4 3
5~11 4
12~26 5

2.确定有效信息和校验位的位置

设数据位为Di,校验位为Pj,构成的海明码的位置为Hk,海明码要求第i组的校验位必须位于2i-1的位置,比如1、2、4、8......

举个例子,k=8,r=4

H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1

3.分组

若Di=Hj,则Di参加那些位号之和(拆成2的幂)等于j的校验位的分组校验

举几个例子:

D1 在海明码中的位置为H3,3=1+2,D1参加第一组和第二组的校验

D2在海明码中的位置为H5,5=1+4,D2参加第一组和第四组的校验

D3在海明码中的位置为H6,6=2+4,D3参加第二组和第四组的校验

写成二进制,规律更明显:

数据位 海明码位置 海明码位置下标二进制
D8 H12 1100
D7 H11 1011
D6 H10 1010
D5 H9 1001
D4 H7 0111
D3 H6 0110
D2 H5 0101
D1 H3 0011

P1校验第一组,包含的数据的海明码位置的二进制的第一位是1:D7D5D4D2D1

P2 校验第二组,包含的数据的海明码位置的二进制的第二位是1:D7D6D4D3D1

P3校验第三组,包含的数据的海明码位置的二进制的第三位是1:D8D4D3D2

P4:校验第四组,包含的数据的海明码位置的二进制的四位是1:D8D7D6D5

4.计算校验位,得出海明码

假设是偶校验,加上校验位使该组的1的个数为偶数,可以用异或计算

P1= D7⊕D5⊕D4⊕D2⊕D1

P2 =D7⊕D6⊕D4⊕D3⊕D1

P3=D8⊕D4⊕D3⊕D2

P4=D8⊕D7⊕D6⊕D5

算出校验位后,按2中的位置填入相应数字,得到海明码

译码

在接收端收到海明码后,按上述分组检验每组的正确性,每组异或为0则该组没出错,否则该组出错

S4=P1⊕ D7⊕D5⊕D4⊕D2⊕D1

S3=P2 ⊕D7⊕D6⊕D4⊕D3⊕D1

S2=P3⊕D8⊕D4⊕D3⊕D2

S1=P4⊕D8⊕D7⊕D6⊕D5

若S4S3S2S1=0000,则没有出错,将信息位提取出来使用

若S4S3S2S1不是全零,如S4S3S2S1=1010,则1010对应的十进制10,海明码H10(数据D6)出错,将H10取反即可

若十进制对应的位置是校验位出错,不需要纠正,因为我们只需要确保数据不出错就可以

思考:为什么这样分组

四位数据,r=3,海明码H7H6...H1中,H1H2H4是校验位,3=1+2,5=1+4,6=2+4,7=1+2+4

第一组:1 3 5 7

第二组:2 3 6 7

第三组:4 5 6 7

校验时每组异或,计算S3S2S1,全0则没出错,001则第一组出错,出错的位是第一组独有的那一位--第一位,刚好是001的十进制,101则1、3组错,出错的是1、3组共有,其他组没有的那一位--5,刚好是101的10进制

推荐阅读