合法代码集:所谓合法代码集就是当代码由于未知因素导致出错后,计算机可是识别到错误的代码。不合法代码集:{(001), (010), (101), (111)}。如果(101)出错,可能是(111),那么无法判断是错误代码还是本来就是(111),因此不合法。下面给出合法代码集:{001),(100), (111},当有一位发生变化时并不会和代码集中的其他代码发生冲突,因此合法。

编码的最小距离:合法代码集中任意两组合法代码之间二进制位数的最少差异。编码的检错、纠错能力与编码最小距离直接相关,公式描述为:L-1 = D+C(D>=C)

L: 编码的最小距离

D: 检错的位数

C:纠错的位数

汉明码:具有一位纠错能力的编码方案,实质上是使用特殊分组方式的奇偶校验。

奇偶校验:假定需要传输的数据是“00100011”,那么在原数据加上一个校验位,使得“1”的个数是偶数个:“100100011”。当传输到另一端的时候,检查“1”的个数是否是偶数个,如果还是偶数,那么表示没有错误,否则就是失效的数据。

带分组的奇偶校验:为了更加精确的定位出错的二进制位,那么可是将二进制位分组,将“00100011”分成“0010”和“0011”,分别在两个分组前加上一个校验位:“10010”和“00011”,这就构成了“1001000011”,发送到对方的时候,将每个分组的“1”查找一遍,然后考察是否是偶数个,即可更加精确的定位到是哪个分组出错。

汉明码的编码:上边说的都是基于划分的分组方式,汉明码是基于非划分的分组方式。假定存在如下数据位:

图片1.png

我们将这个长度的代码分成3组,每组包含1个校验位,总共包含4个数据位,如下图所示:

史上最通俗的海明码编码计算、检错和纠错原理解析_第1张图片

将3个组分别命名为Group1Group2Group3,那么将会产生三个校验位结果:

Group3

Group2

Group1

Result

0

0

0

没有错误

0

0

1

Group1中有错误,1的位置出错.

1

0

1

Group1Group3公共区域出错,5位置出错.

...

...

...

...

既然有了校验位,那么这些校验位应该放到哪里呢?我们上面将数据按位划分了组:

Group1: {1, 3, 5, 7};

Group2: {2, 3, 6, 7};

Group3: {4, 6, 6, 7}.

实际上,我们的分组方式就是按照汉明码的编码规则划分的,因此要考察每个分组的特征:

Group1: {1, 3, 5, 7};

Group2: {2, 3, 6, 7};

Group3: {4, 6, 6, 7}.

显然,应该放到2n-1位。

如果是二进制代码的话产生的校验值会有如下特征:

Group1:xxxx1

Group2:xxx1x

Group3:xx1xx

Group4:x1xxx

...

从右向左,如果Group1的第一位是1,表示Group1独有的比特位出错。如果是Group1的第一位和Group4的第四位同时是1,表示Group1Group4共有且其他组没有的比特位出错。

综上所述,汉明码总共有三个要素:

汉明码的组成需要添加多少位校验位

因为每个组都有一个校验位,所以多少个校验位就是多少个组,设校验位包含k位,原始数据比特位有n位,在加上一种没有错误的情况,因此是2k >= n+k+1(和画图一样的道理)

校验位在整个编码中的位置

2n-1

校验位的取值

根据采用的是奇校验还是偶校验有关。

汉明码使用交替跳跃的方式选择每个组中应该包含的比特位,比如:

Group1:选取1位,跳跃1位;

Group2:选取2位,跳跃2...

汉明码的校验:

Group1 = 1⊕357

Group2 = 2⊕367

...

测试题:求“0101”按照偶校验配置的汉明码

原始数据长度n = 4; 分组个数:k = 3; 汉明码排序:

比特位序号

1

2

3

4

5

6

7

汉明码

C1

C2

0

C4

1

0

1

下面是每个分组的情况:

C1分组情况:

1

3

5

7

C1

0

1

1

C1分组已经有偶数个1”,因此C1 = 0;同理,C2 = 1; C4 = 0

因此,汉明码为:“0100101