汉明码

汉明码编码方式详解

确定位数

已知有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所在地,是校验位,对信息码没有影响,故一般不纠正此处错误。

以上,就是汉明码的工作过程。

--It's the end.Thanks for your read.--