史上最通俗的海明码编码计算、检错和纠错原理解析

合法代码集

所谓合法代码集就是当代码由于未知因素导致出错后,计算机可是识别到错误的代码。不合法代码集:{(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”查找一遍,然后考察是否是偶数个,即可更加精确的定位到是哪个分组出错。

汉明码的编码

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

在这里插入图片描述

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

在这里插入图片描述

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

Group3Group2Group1Result
000没有错误
001Group1中有错误,1的位置出错.
101Group1和Group3公共区域出错,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,表示Group1和Group4共有且其他组没有的比特位出错。综上所述,汉明码总共有三个要素:

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

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

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

    2^(n-1)

  • 校验位的取值

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

汉明码使用交替跳跃的方式选择每个组中应该包含的比特位,比如:
Group1:选取1位,跳跃1位;
Group2:选取2位,跳跃2位…
汉明码的校验:
Group1 = 1⊕3⊕5⊕7
Group2 = 2⊕3⊕6⊕7

测试题:求“0101”按照偶校验配置的汉明码
原始数据长度n = 4; 分组个数:k = 3; 汉明码排序:

比特位序列1234567
汉明码C1C20C4101

下面是每个分组的情况:
C1分组情况:

1357
C1011

C1分组已经有偶数个“1”,因此C1 = 0;同理,C2 = 1; C4 = 0。
因此,汉明码为:“0100101”。

本文来自我的51CTO博客:http://blog.51cto.com/xvjunjie/2339014

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
海明码是一种可以检错纠错编码方法,对于一个给定的数据,它可以将其转换成一组编码,以便在传输过程中进行错误检测和纠正。 对于海明码的实现,我们可以按照以下步骤进行: 1. 确定数据位数和校验位数 首先需要确定数据位数和校验位数,通常情况下,校验位数是数据位数的一个函数,函数的形式为:$2^r-1\geq m+r$,其中 $m$ 表示数据位数,$r$ 表示校验位数。这个函数中,$2^r-1$ 表示校验位数可以表示的最大二进制数,$m+r$ 表示总位数。我们需要找到一个满足条件的最小的 $r$ 值。 2. 构造校验位和数据位的位置关系 海明码校验位和数据位有一定的位置关系,通常情况下,第 $2^k$ 个位置是校验位,其他位置为数据位。例如,对于一个 $m=4$ 的海明码校验位的位置为 1、2、4,数据位的位置为 3、5、6、7。 3. 计算校验位的值 校验位的值可以通过数据位的异或操作计算得到。具体地,对于第 $i$ 个校验位,它需要检查所有包含第 $i$ 位的数据位,将它们的值进行异或操作,得到一个校验位的值。例如,对于一个 $m=4$ 的海明码,第一个校验位需要检查第 1、3、5、7 个位置的数据位,将它们的值进行异或操作,得到第一个校验位的值。 4. 将数据校验位组成海明码数据计算得到的校验位组合在一起,得到最终的海明码。例如,对于一个 $m=4$ 的海明码数据位为 1011,计算得到的校验位为 011,最终的海明码为 1011011。 5. 检测和纠正错误 在传输过程中,可能会发生数据位的错误,此时我们可以通过海明码进行检测和纠正。具体地,我们可以将接收到的海明码与原始数据进行比较,如果发现不同的位数不超过一个,则可以认为该数据没有发生错误;否则,可以根据校验位的值来确定错误的位置,并进行纠正。 希望这些步骤可以帮助你理解海明码检错纠错过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值