将信息位分组进行偶校验,多个校验位,多个校验位标注出错位置。
1、确定海明码的位数
若有n个信息位,和k个校验位,为了保证可以标注错误。
2k种状态可以表示n+k位的状态,以及一种正确的状态。
2k>=n+k+1
n和k的对应关系。
n | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
---|---|---|---|---|---|---|
k | 2 | 3 | 4 | 5 | 6 | 7 |
2、确定校验位的分布
信息位:1010
设信息位D1D2D3D4,共四位,校验位P1P2P3。共三位。加起来共七位。
校验位Pi应放在海明号为2i-1的位置上。
即上面的海明码应为:
D4D3D2P3D1P2P1
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
D4 | D3 | D2 | P3 | D1 | P2 | P1 |
1 | 0 | 1 | 1 |
3、求校验位的值
H3: 3-> 0 1 1
H5: 5-> 1 0 1
H6: 6-> 1 1 0
H7: 7-> 1 1 1
然后Pi的值为所有海明码位二进制值的第i位的值为1的信息位的异或值。
三个分组分别进行偶校验。
P1等于:H3异或H5异或H7=0
P2等于:H3异或H6异或H7=1
P3等于:H5异或H6异或H7=0
则海明码为:
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
D4 | D3 | D2 | P3 | D1 | P2 | P1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 |
4、纠错
对各个分组进行检验,若分组内的校验位和信息位的异或值为0,无错。
S1 = P1异或D1异或H2异或D4
S2 = P2异或D1异或D3异或D4
S3 = P3异或D2异或D3异或D4
若接收到:1010010
S1 = P1异或D1异或H2异或D4 = 0011异或值为0
S2 = P2异或D1异或D3异或D4 = 1001异或值为0
S3 = P3异或D2异或D3异或D4 = 0101异或值为0
若出现错误得:S3S2S1=110,则第110位出错。D3出错。
补充
纠错能力:1位。检错能力:2位 。
但是若P1和P2发生错误,S3S2S1为011,表示第三位发生错误,这样是不对的。
因此需要加入全校验位。加上全校验位的海明码进行偶校验。
加入全校验位前提是加上P全,整体有偶数个1。即P全为整体海明码的异或值。
H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|
P全 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
若S3S2S1= 000 且全体偶校验成功 无错误
若S3S2S1≠ 000 且全体偶校验失败 有一位错误,纠正即可。
若S3S2S1≠ 000 且全体偶校验成功 两位错误需要重新传