一、海明码编码
1.1. 求海明码位数
公式:≥N+k+1,其中N为有效信息位数,K为校验码位数。
例子:编码前有效信息为10011101,求校验码位数?
解:
有效信息码10011101长度为8则,N=8,求K=?,可以将N带入公式≥8+k+1然后K可依次用正整数带入,取维持等式成立的最小值,解得K=4。并根据经验总结,得出信息码位与校验码位关系,如下表所示。
信息码位数 |
1 |
2~4 |
5~11 |
12~26 |
27~57 |
58~120 |
121~247 |
校验码位数 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-1 信息码位数与校验码位数关系表
1.2. 求海明码位置
公式:效验码只能放在(,,...)位置。
例子:当效验码为4位时(即K=4)校验位置分布如下表,P代表校验码,D代表信息码。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
P1 |
P2 |
D1 |
P3 |
D2 |
D3 |
D4 |
P4 |
D5 |
D6 |
D7 |
D8 |
|
. |
|
|
|
|
|
|
|
1.3. 求海明码数值
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
P1 |
P2 |
D1 |
P3 |
D2 |
D3 |
D4 |
P4 |
D5 |
D6 |
D7 |
D8 |
? |
? |
1 |
? |
0 |
0 |
1 |
? |
1 |
1 |
0 |
1 |
公式:在偶校验方式下Pn的取值,受到Pn所能验证位中所有1的个数影响,当1为偶数个时则Pn=0,当1的个数为奇数个时则Pn=1。Pn能验证的位=从Pn位数起,校验n位,然后跳过n位,以此规则循环至末尾。
例子:
P1(第1个校验位,也是整个码位的第1位)的校验规则是: 从P1位数起,连续校验1位,然后跳过1位,再连续校验1位,再跳过1位,……。如下表
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
P1 |
P2 |
1 |
P3 |
0 |
0 |
1 |
P4 |
1 |
1 |
0 |
1 |
P1 |
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
P1取值
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
P1 |
|
1 |
|
0 |
|
1 |
|
1 |
|
0 |
|
此时有奇数个1,为保证偶校验,则此时P1应取1,即P1=1。
P2(第2个校验位,也是整个码位的第2位)的校验规则是: 从P2位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。如下表
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
P2 |
1 |
P3 |
0 |
0 |
1 |
P4 |
1 |
1 |
0 |
1 |
P1 |
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
P2 |
|
√ |
√ |
|
|
√ |
√ |
|
|
√ |
√ |
|
P2取值
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
P2 |
1 |
|
|
0 |
1 |
|
|
1 |
0 |
|
此时有奇数个1,为保证偶校验,则此时P2应取1,即P2=1
p3(第3个校验位,也是整个码位的第4位)的校验规则是:从当前位数起位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。如下表
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
1 |
1 |
P3 |
0 |
0 |
1 |
P4 |
1 |
1 |
0 |
1 |
P1 |
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
P2 |
|
√ |
√ |
|
|
√ |
√ |
|
|
√ |
√ |
|
P3 |
|
|
|
√ |
√ |
√ |
√ |
|
|
|
|
√ |
P3取值
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
|
|
P3 |
0 |
0 |
1 |
|
|
|
|
1 |
此时有偶数个1,为保证偶校验,则此时P3应取0,即P3=0
P4(第4个校验位,也是整个码位的第8位)的校验规则是:从当前位数起位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。如下表
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
P4 |
1 |
1 |
0 |
1 |
P1 |
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
P2 |
|
√ |
√ |
|
|
√ |
√ |
|
|
√ |
√ |
|
P3 |
|
|
|
√ |
√ |
√ |
√ |
|
|
|
|
√ |
P4 |
|
|
|
|
|
|
|
√ |
√ |
√ |
√ |
√ |
P4取值
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
|
|
|
|
|
|
P4 |
1 |
1 |
0 |
1 |
此时有奇数个1,为保证偶校验,则此时P4应取1,即P4=1
到此整个编码工作结束,各校验码的码值和码位如下
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
二、海明码解码
举一个例子来说明,经过此前编码工作源端发送出的海明码为111000111101共12位长度,假设在传输过程中出现了错误,将第5位由0变成了1,则接收端实际接收到的编码为111010111101。
2.1. 求出错位置
将P1、P2、P3、P4所负责验证的码位取名为组,即得到对应的G1、G2、G3、G4四个组,然后分别用奇偶校验法去验证各组码值定位错误。
G1验证组:经过奇偶校验发现G1组中有奇数个1,使用异或运算G1=1(简单办法是直接数1的个数奇数为1偶数为0)
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
0 |
|
G2验证组:经过奇偶校验发现G2组中有偶数个1,使用异或运算G2=0(简单办法是直接数1的个数奇数为1偶数为0)
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
1 |
1 |
|
|
0 |
1 |
|
|
1 |
0 |
|
G3验证组:经过奇偶校验发现G3组中有奇数个1,使用异或运算G3=1(简单办法是直接数1的个数奇数为1偶数为0)
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
|
|
0 |
1 |
0 |
1 |
|
|
|
|
1 |
G4验证组:经过奇偶校验发现G4组中有偶数个1,使用异或运算G4=0(简单办法是直接数1的个数奇数为1偶数为0)
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
|
|
|
|
|
|
|
1 |
1 |
1 |
0 |
1 |
根据以上验证结果可以使用计算法或图表法来定位出错位。
1)计算法
将校验位降序排列可得G4 G3 G2 G1(二进制高位在左),设出错位为N,则得公式N = G4 G3 G2 G1,即N=0101转换成十进制得5则说明,接收端得到的海明码第五位出现了传输错误。
2)图表法
码位 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
码值 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
P1 G1 |
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
P2 G2 |
|
√ |
√ |
|
|
√ |
√ |
|
|
√ |
√ |
|
P3 G3 |
|
|
|
√ |
√ |
√ |
√ |
|
|
|
|
√ |
P4 G4 |
|
|
|
|
|
|
|
√ |
√ |
√ |
√ |
√ |
经过计算只有G1和G3的值为1,结合图表可以看出仅由G1和G3同时验证的码位只有第5位,则说明第五位出现了传输错误。
2.2. 纠正错误值
二进制位非0即1,当判断出是哪位出错对该位取反即可。则经过纠正的海明码为111000111101,与发送端保持了一致。