ECC纠错算法(二)

ECC纠错算法

汉明码实现原理

汉明码(Hamming Code)是广泛用于内存纠错的编码。汉明码不仅可检错,还可纠错。(只能发现和纠正一位错误,对于两位或者两位以上的错误无法纠正)。

我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。我们可以在开头对这串编码加一位校验码实现奇偶校验。比如:

我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位。

我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头的1就是校验位。

两个例子的1的个数都是偶数。

首先汉明码是采用奇偶校验的码。它采用了一种非常巧妙的方式,把这串数字分了组,通过分组校验来确定哪一位出现了错误。

图片

比如上图,数据分成3组,P1组中有一个错了,P2组没错,P3组没错。

P2组里谁都没错,可以排除2,4,5,7这几个数据;

P3组里谁都没错,可以排除3,4,6,7这几个数据;

很容易知道,是1这个数据有了错误。

因此,我们按照位置来分组,同时可以知道具体哪个位置数据比特错误,按照位置,

凡是位置符合这种形式的,XXX1,归到P1;

凡是位置符合这种形式的,XX1X,归到P2;

凡是位置符合这种形式的,X1XX,归到P3;

凡是位置符合这种形式的,1XXX,归到P4;

位置在1,3,5,7,9,11的数据进到P1组。

位置在2,3,6,7,10,11的数据进到P2组。

位置在4,5,6,7的数据进到P3组。

位置在8,9,10,11的数据进到P4组。

那么确定了分组,校验码的值也就顺便确定下来了。这样整个串的码就确定下来了。

那么显然各个校验码也被分到各个组里面去了,而且,每个组只有一个校验码。(这个,太简单我就不解释了……)


设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:

图片

汉明码的编码规则如下:

1.1.1        校验码的位置

这是规定,记住它,在采用汉明码的一串数据中,2的i次方的位置上,我们放校验码。

校验码是1,或者是0,使得校验码所在的组的1的个数是偶数。

如图:

绿色的位置是放校验码的地方,1,2,4,8,16……等等,2的i次方的地方。

图片

1.1.2        汉明码编码实例

以10101编码为例,创建一个汉明码编码的空间,并且把源码填入编码的对应位置中,_ _ 1_010_1,并留出校验码位(校验位先设为0)。(因为2^4 - 1>= 5+4 满足,而 2^3-1>= 5+3所以需要4位校验码)

  • 计算校验码第1位,1,3,5,7,9异或为0,所以汉明码第2^(1-1)位为0,结果为:0_1_010_1

  • 计算校验码第2位,2,3,6,7异或为0,所以汉明码第2^(2-1)位为0,结果为:001_010_1

  • 计算校验码第3位,4,5,6,7异或为1,所以汉明码第2^(3-1)位为1,结果为:0011010_ 1

  • 计算校验码第4位,8, 9异或为1,所以汉明码第2^(4-1)位为1,结果为:001101011

    所以最终编码为001101011.

1.1.3        汉明码校验错误实例

假设收到编码为001101001,我们可以发现汉明码的第8位与原来的汉明码001101011不同,那我们怎么找出这个第8位的错误编码呢?

算法很简单,我们只要在算汉明码校验位的算法的上再算一遍,就得到了汉明码的校验方法,比如计算001101001对应的2^k位。

1,3,5,7,9进行异或,得到0

2,3,6,7进行异或,得到0

4,5,6,7进行异或,得到0

8,9进行异或,得到1

我们把上述结果反着排列,得到1000,即十进制的8,根据汉明码的校验规则,编码出错的地方即在第8位,我们把第8位的0换成1,即可得原来的编码001101011。

上述的例子是出现在2k的校验位上的,如果出现在非2k位上,得到的结果也是一样的,比如:假设收到的编码为001100011,即第6位出了错误,我们根据规则

1,3,5,7,9进行异或,得到0

2,3,6,7进行异或,得到1

4,5,6,7进行异或,得到1

8,9进行异或,得到0

我们把上述结果反着排列,得到0110,即十进制的6,根据汉明码的校验规则,编码出错的地方即在第6位,我们把第6位的0换成1,即可得原来的编码001101011。

参考链接:

汉明码(Hamming Code)原理及实现

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

说人话,汉明码(海明码、hamming code)通俗易懂的解释,说人话

https://blog.csdn.net/Yonggie/article/details/83186280

欢迎加入技术交流群,先加我微信,我拉你进群!

图片

感谢阅读,别走!点赞、关注、转发后再走吧

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值