汉明码原理和纠错

汉明码历史

​ 汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)和磁盘纠错的编码。汉明码不仅可以用来检测转移数据时发送的错误,还可以用来修正作物。(汉明码只能发现和修正一位错误,对于两位及两位以上的错误无法发现和纠正)。
​ 1940年,汉明于贝尔实验室(Bell Labs)工作,运用贝尔模型V(Bell Model V)电脑,一个周期时间在几秒钟内的机电继电器机器。输入端是依靠打孔卡(Punched Card),这不免有些读取错误。在平日,特殊代码将发现错误并闪灯(flash lights),使得操作者能够纠正这个错误。在周末和下班期间,在没有操作者的情况下,机器只会简单地转移到下一个工作。汉明在周末工作,他对于不可靠的读卡机发生错误后,总是必须重新开始项目变得愈来愈沮丧。在接下来的几年中,他为了解决调试的问题,开发了功能日益强大的调试算法。在1950年,他发表了今日所称的汉明码。现在汉明码有着广泛的应用。

汉明码原理

​ 设将要进行检测的二进制源码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k=m位的二进制。那么,新增加的检测位数k应满足:
2 k − 1 ≥ n + k 2^k-1 \geq n+k 2k1n+k
​ 这就是汉明码不等式,规定所得到的m位编码 2 k ( k ≥ 0 ∣ 2 k < n + k ) 2^k(k \geq 0 | 2^k < n+k) 2k(k02k<n+k)位上插入特殊的校验码,其余位把源码按顺序放置。n位二进制和校验码位数k的关系:

nk最小值
12
2~43
5~114
12~265
27~576
57~1207

汉明码编码方式1

编码规则:
  1. 在新的编码的 2 ( k − 1 ) ( k ≥ 0 ) 2^{(k-1)} (k \geq 0) 2(k1)(k0)位上填入0(即校验位)。

  2. 在新的编码的其余位把源码按原顺序填入
    校验位的编码方式为:第k位校验码从则从新的编码的第 2 ( k − 1 ) 2^{(k-1)} 2(k1)位开始,每计算 2 ( k − 1 ) 2^{(k-1)} 2(k1)位的异或,跳 2 ( k − 1 ) 2^{(k-1)} 2(k1)位,再计算下一组 2 ( k − 1 ) 2^{(k-1)} 2(k1)位的异或,填入 2 ( k − 1 ) 2^{(k-1)} 2(k1)位。

    比如:
    第1位校验码位于新的编码的第1位 2 ( 1 − 1 ) = = 1 2^{(1-1)}==1 2(11)==1(汉明码从1位开始),计算1,3,5,7,9,11,13,15,…位的异或,填入新的编码的第1位。
    第2位校验码位于新的编码的第2位 2 ( 2 − 1 ) = = 2 2^{(2-1)}==2 2(21)==2,计算2,3,6,7,10,11,14,15,…位的异或,填入新的编码的第2位。
    第3位校验码位于新的编码的第4位 2 ( 3 − 1 ) = = 4 2^{(3-1)}==4 2(31)==4,计算4,5,6,7,12,13,14,15,20,21,22,23,…位的异或,填入新的编码的第4位。
    第4位校验码位于新的编码的第8位 2 ( 4 − 1 ) = = 8 2^{(4-1)}==8 2(41)==8,计算8-15,24-31,40-47,…位的异或,填入新的编码的第8位。
    第5位校验码位于新的编码的第16位 2 ( 5 − 1 ) = = 16 2^{(5-1)}==16 2(51)==16,计算16-31,48-63,80-95,…位的异或,填入新的编码的第16位。

编码示例:

​ 以10101源码为例, n = 5 n=5 n=5,由公式 2 k − 1 ≥ n + k 2^k-1 \geq n+k 2k1n+k k = 4 k=4 k=4,如下表所示编码结果为001101011。

123456789
2 ( 1 − 1 ) 2^{(1-1)} 2(11)校验位 2 ( 2 − 1 ) 2^{(2-1)} 2(21)校验位1 2 ( 3 − 1 ) 2^{(3-1)} 2(31)校验位010 2 ( 4 − 1 ) 2^{(4-1)} 2(41)校验位1
001001001
0(计算1,3,5,7,9位异或)0(计算2,3,6,7位异或)11(计算4,5,6,7位异或)0101(计算8,9位异或)1
  • 计算校验码的第1位(1,3,5,7,9进行异或): 结果为0,所以汉明码第2^0位为0,结果为0 _ 1 _ 0 10 _ 1
  • 计算校验码的第2位(2,3,6,7进行异或): 结果为0,所以汉明码第2^1位为0,结果为001 _ 0 10 _ 1
  • 计算校验码的第3位(4,5,6,7进行异或): 结果为1,所以汉明码第2^2位为1,结果为0011 0 10 _ 1
  • 计算校验码的第4位(8, 9进行异或): 结果为1,所以汉明码第2^3位为1,结果为001101011
  • 所以最终编码为001101011.

汉明码编码方式2

  1. 通过k值将源码分为 P n P_n Pn组,第1组为 2 0 2^0 20,第2组为 2 1 2^1 21,第3组为 2 2 2^2 22,同理以此类推分组按照 2 ( k − 1 ) 2^{(k-1)} 2(k1)。同时分组后插入的校验码的位置也是按照次规律插入, 2 0 2^0 20位插入第1个校验码,即 P 1 P_1 P1组第1位, 2 1 2^1 21位插入第2个校验码,即 P 2 P_2 P2组第1位, 2 2 2^2 22位插入第3个校验码,即 P 3 P_3 P3组第1位,以此类推。

    P 1组包含(1(校验码),3,5,7,9,11...位)
    P 2组包含(2(校验码),3,6,7,10,11,14,15...位)
    P 3组包含(4(校验码),5,6,7,12,13,14,15...位)
    ...

    ​ 同时也可以通过下表方式来划分组。

    编号12345678
    二进制00010010001101000110011110001001

    将编号转成二进制从右向左,如果第1位是1,例如编号是1,3,5,7…的就分入P1组,如果第2位是1的,例如编号2,3,6,7,10…的就分入第P2组,以此类推将所有的编号分入相应的组中。

  2. 当分好组之后,P1组中第1位(校验位)应使1,3,5,7,9,11…位中“1”的个数为偶数。P2组中第2位(校验位)应使2,3,6,7,10,11,14,15…位中“1”的个数为偶数。P3组中第4位(校验位)应使4,5,6,7,12,13,14,15…位中“1”的个数为偶数。汉明码还存在配奇原则,与之相反。

编码示例:

​ 以10101源码为例, n = 5 n=5 n=5,由公式 2 k − 1 ≥ n + k 2^k-1 \geq n+k 2k1n+k k = 4 k=4 k=4,如下表所示编码结果为001101011,C1,C2,C3,C4为插入的校验码。

123456789
2 ( 1 − 1 ) 2^{(1-1)} 2(11)校验位 2 ( 1 − 1 ) 2^{(1-1)} 2(11)校验位1 2 ( 1 − 1 ) 2^{(1-1)} 2(11)校验位010 2 ( 1 − 1 ) 2^{(1-1)} 2(11)校验位1
C1C2B1C3B2B3B4C4B5

如果按照配偶原则来配置汉明码,则C1应使1,3,5,7,9位中“1”的个数为偶数;C2应使2,3,6,7位中“1”的个数为偶数;C3应使4,5,6,7位中“1”的个数为偶数;C4应使8,9位中的“1”的个数为偶数。所以10101源码的汉明码为001101011。

汉明码的纠错

​ 根据以上说的汉明码的配偶原则和配奇原则我们来看汉明码的纠错。设接收到的错误汉明码(按配偶原则配置)是001101001,我们可以根据上述规律来确定出错位。

序号123456789
接收到的汉明码001101011

那么新的检测位为:

P1=1位^ 3位^ 5位^ 7位^ 9位,得到0。

P2=2位^ 3位^ 6位^ 7位,得到0。

P3=4位 ^ 5位^ 6位^ 7位,得到0。

P4=8位^ 9位,得到1。

​ 根据P4P3P2P1构成的二进制是1000,将1000转换成十进制为8,说明是第8位出错,或者根据配偶原则的规律,其“1”的个数必须是偶数也能判断出是第8位,所以第8位应将“1”改为“0”,那么正确的汉明码应为001101011。

​ 汉明码属于分组奇偶校验,P4P3P2P1=0000,说明接收方生成的校验位和收到的校验位相同,否则不同说明出错。由于分组时校验位只参加一组奇偶校验,有效信息参加至少两组奇偶校验,若果校验位出错,P4P3P2P1的某一位将为1,刚好对应位号8、4、2、1;若果有效信息出错,将引起P4P3P2P1中至少两位为1。


以上博文参考自:

  1. https://blog.csdn.net/qq_38526635/article/details/82842383

  2. https://blog.csdn.net/blue_starry_sky/article/details/53997548

  • 13
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
汉明码是一种用于数据传输的纠错编码,通过添加冗余的校验位来检测和纠正传输中的错误。 汉明码原理是采用二进制反射码的形式,在数据位上加上冗余的校验位。每个校验位检查一定数量的数据位,校验位的值为所有被检查的数据位的和的奇偶性。如果某个数据位在传输过程中发生了错误,检验位就会检测到错误并进行纠正。 汉明码的分析主要从以下几个方面来看: 1. 错误检测能力:汉明码的错误检测能力是通过添加的校验位来实现的。对于一个n位的汉明码,它可以检测到所有单一错误,但无法检测到所有的双重错误。通常情况下,汉明码的检测能力与其校验位的数量有关,校验位越多,检测能力越强。 2. 纠错能力:汉明码纠错能力是通过校验位的奇偶性来实现的。如果发现一个校验位的值与实际的数据位值不一致,那么就可以确定这个数据位存在错误,并进行纠正。但是,汉明码只能纠正单一错误,无法纠正多个错误。 3. 编码效率:汉明码的编码效率与其校验位的数量有关。校验位越多,编码效率越低。因此,为了提高编码效率,需要在错误检测和纠错能力之间进行权衡,选择适当的校验位数量。 总的来说,汉明码是一种简单而有效的纠错编码,可以在数据传输过程中检测和纠正错误,提高数据传输的可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值