确定位数
已知有n位信息码,k位校验码,则在汉明码的构造规则中,应满足:
2^k>=n+k+1
其中k位校验码应至少有n+k种状态,用来表达n+k位的错误,还有1位用来表示整个代码正确无误。
故通常有下表。
n | k(最小) |
---|---|
1 | 2 |
2~4 | 3 |
5~11 | 4 |
12~26 | 5 |
27~57 | 6 |
58~120 | 7 |
… | … |
构造序列
设n+k位序列每一位编号分别为1,2,3,…,n+k,k位汉明码分别为C1、C2、C4、…、C2^(k-1),则对于任意i(1<=i<=k),C2^(i-1)应放在序列中第i号位置上。
示例:
现有n=4的信息码,由上表可得k=3,则n+k位序列编号为1~7,k位汉明码编号为C1、C2、C4。同时,设信息码的4位分别为b4、b3、b2、b1,则有下表序列。
二进制序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
名称 | C1 | C2 | b4 | C4 | b3 | b2 | b1 |
以此类推。
此时,对于任意i(1<=i<=k),C2^(i-1)负责检测的范围为[i+m*i*2,i*2-1+m*i*2],m>=0且m为整数
以上表为例,则有:
C1负责检测1,3,5,7位
C2负责检测2,3,6,7位
C4负责检测4,5,6,7位
奇偶校验
设C2^(i-1)负责检测t位,若为偶校验,则这t位相加,所得结果应为偶数,即二进制为最后一位为0;若为奇校验,则这t位相加,所得结果应为奇数,即二进制位最后一位为1。
以上表为例,则有:
第1,3,5,7位相加为偶数,C1在第1位,所以C1=(第3位+第5位+第7位)的和取二进制最后一位,简写为C1=3位 + 5位 + 7位,即C1=b4 + b3 + b1
第2,3,6,7位相加为偶数,C2在第2位,所以C2=3位 + 6位 + 7位,即C2=b4 + b2 + b1
第4,5,6,7位相加为偶数,C4在第4位,所以C4=5位 + 6位 + 7位,即C4=b3 + b2 + b1
若设信息码为0101,采用偶校验,则
C1=0+1+1=0
C2=0+0+1=1
C4=1+0+1=0
所以信息码0101对应的汉明码为0100101
纠错过程
前面说到,对于任意i(1<=i<=k),C2^(i-1)负责检测的范围为[i+m*i*2,i*2-1+m*i*2],m>=0且m为整数。则收信一方只需要按该规则重新计算即可。
于是,设对于任意i(1<=i<=k),已知C2^(i-1)负责检测t位,则有P2^(i-1)=∑这t位(包括C2^(i-1)所在位)。
接上例,则有:
P4=4位 + 5位 + 6位 + 7位
P2=2位 + 3位 + 6位 + 7位
P1=1位 + 3位 + 5位 + 7位
若全0,则表示信息完全正确
若此时设收到的码字为0100111,则通过计算,得:
P4=0+1+1+1=1
P2=1+0+1+1=1
P1=0+0+1+1=0
说明C1负责的分组没错,C2和C4负责的分组有错。
经检查发现,只有计算结果110对应第110位(也就是第6位)有错。此时计算机会直接修改第110位,于是完成纠错。
又若正确码字为0100101,收到码字为1100101,则通过计算,得:
P4=0+1+0+1=0
P2=1+0+0+1=0
P1=1+0+1+1=1
此时P4P2P1=001,所以第1位出错,应该修改第1位。但因为第1位是C1所在地,是校验位,对信息码没有影响,故一般不纠正此处错误。
以上,就是汉明码的工作过程。