当前位置:首页 > 公众号精选 > 全栈芯片工程师
[导读]ECC纠错算法汉明码实现原理汉明码(HammingCode)是广泛用于内存纠错的编码。汉明码不仅可检错,还可纠错。(只能发现和纠正一位错误,对于两位或者两位以上的错误无法纠正)。 我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。我们可以在开头对...

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






本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。

全栈芯片工程师

60 篇文章

关注

发布文章

编辑精选

技术子站

关闭