最简单易懂的汉明码Hamming Code原理!

啊啊啊加油学完这个汉明码就去看《还魂》!

汉明码历史及应用

当比特通过计算机网络传输时,它们会由于干扰和网络问题而损坏。损坏的位会导致接收器接收到虚假数据,称为错误。纠错码 (ECC) 是由特定算法生成的数字序列,用于检测和消除通过噪声信道传输的数据中的错误。纠错码在算法的限制范围内确定已损坏的确切位数和损坏位的位置。ECC大致分为两种类型:

  • 块代码:消息被分成固定大小的位块,其中添加了冗余位以进行错误检测或纠正。
  • 卷积码:消息由任意长度的数据流组成,奇偶校验符号是通过将布尔函数滑动应用到数据流而生成的。

汉明码是一种块码,能够同时检测最多两个位错误并纠正单位错误。它是由 RW Hamming 开发的,用于纠错。由于汉明编码简单,它们被广泛应用于内存(RAM )。

奇偶校验

在计算机的世界里,所有数据都以二进制的形式存在,为了确定接收方准确无误收到发送方传来的二进制数据,我们需要创造一种校验机制以保证传输数据的正确性。

奇偶校验的原理是:发送方A给接收方B发送一串二进制数据前互相做一个约定,“我给你发的数据最前面都加了一位校验位,加上校验位后整个二进制串里1的数量一定为奇数(偶数),你收到的时候数一数,要是正确了去掉最前面校验位就是原始数据,要是不正确那一定有数据出错了,我再重发一遍。”

在他们的约定过程中,要是约定的1的个数为奇数就叫做奇校验,要是1的个数为偶数就叫做偶校验。但奇偶校验的缺点就是,如果传输过程中2位出错或者其他偶数个错误,是无法被检查出来的,并且其也只能检测出有错误,不能指出到底是哪一位出了错。

汉明码便是基于奇偶校验的基础创造的一种更加先进的校验方式,不仅能判断数据是否出错,还能纠正错误。但汉明码只能纠正1位错误,但在现实世界当中,数据发生跳变很大概率都是只有一位发生了变化,因此汉明码也有相应的应用场景。

使用汉明码对消息进行编码

校验原理

以4位原始数据为例,我们首先画三个相交的圆,如下图所示。其中3个圆就是用来校验的,将它们分别叫做P1,P2,P3。三个圆相交的4个区域用来填上我们的原始数据d1,d2,d3,d4。例如原始数据为1011。

在这里插入图片描述

之前说了奇偶校验能发现单位错误,但并不知道是具体哪一位发生了错误,我们这里三个圆分别用三次奇偶校验。P1用来校验d1,d2,d4,P2用来校验d1,d3,d4,P3用来校验d2,d3,d4。

假如我们发现P1有错,P2没错,P3错了,那么P1圆里的d1,d2,d4一定有一位错了,P2圆里的d1,d3,d4没错,P3圆里的d2,d3,d4有一位错了,从图里也能看出来,是P1和P3相交的d2错了,而二进制不是0则是1,我们便可纠正该位的错误。

汉明码的编码如下:

1. 计算冗余位数

假设原始数据有n位,校验数据有k位,那么校验位能够表示2k种情况。我们传递给接收方的数据等于n-k位,在最多只有一位跳变的情况下,n+k位的数据出错的情况就有n+k种,数据完全正确的情况有1种,所以一共有n+k+1种情况,2k至少要包含n+k+1种情况才行,因此可以得到下面不等式:

2 k > = n + k + 1 2^k>=n+k+1 2k>=n+k+1

所以假如原始数据n=4,可以算出k=3,这也是为什么我们上面画了3个圆能确定出4位原始数据是哪一位出错了。

2. 定位冗余位

现在知道了该用多少冗余位,那冗余位该插入到原始数据的什么位置一起发送呢?我们可以先从数字中发现一个规律,如果只有1位位1,其余都为0,1往前移1位便是将这个数乘2。

20=1=001

21=2=010

22=4=100

我们将冗余位都放在2的幂次的位置,即1,2,4,8,16等

4. 奇偶校验

n=4,k=3,我们一共传输7位数据。那我们将P1放在第1位,用来负责所有第3个二进制为1的位,将P2放在第2位,用来负责所有第2个二进制为1的位,将P3放在第4位,用来负责所有第1个二进制为1的位,见下表:

7(D4)6(D3)5(D2)4(P3)3(D1)2(P2)1(P1)
111110101100011010001
1010101

所有最低位为1的有1,3,5,7位

所有第二位为1的有2,3,6,7位

所有最高位为1的有4,5,6,7位

我们采用偶校验方式,那么P1用来和3,5,7位校验,P1=1,同理可得P2=0,P3=0,传输的数据为1010101。

5. 错误检测与纠正

假如我们上面计算出来的带冗余位的二进制串在传输过程中出错变成了1110101。接收方收到数据同样来计算3个数据

C1等于1,3,5,7位的异或,如果是偶校验正常异或出来结果为0,如果出错则结果为1,C1=0。

C2等于2,3,6,7位的异或,C2=1。

C3等于4,5,6,7位的异或,C3=1。

则说明1,3,5,7位是正确的,2,3,6,7位中有一位错误,4,5,6,7位中有一位错误,可以推出是第6位错误,将第6位的1改为0即可得到正确数据。

简单的方法是按C3C2C1排列,为110,110转化为十进制为6,便可很快速得出是第6位出错。

不得不说Hamming码真的好妙!

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值