海明码是由Richard Hamming在1950年提出的一种具有纠错能力的校验码。海明码是一种多重奇偶校验系统,它的全部码字由原来的数据位和附加的奇偶校验位组成,每一个奇偶位被编在码字的特定位置上,是一种非系统码。海明码能够自动纠正一位错。
生成海明码时的一项基本考虑是确定最少的校验位数k。对于只能纠正一位错的校验码,校验位的位数k和数据位的位数N之间的关系由下面的海明不等式给出:
2k≥n+k+1
这个公式表明,k个校验位的状态组合应能表示n位数据位哪一位出错、k个校验位哪一位出错和无错这n+k+1种情形。
海明码是由数据位和校验位组成的一种排列,排列方式由海明码的编码规则确定。设k个检验位为PkPk-1…P1,n个数据位为DnDn-1Dn-2…D1,产生的海明码为Hk+nHk+n-1…H1,则海明码的编码规则如下。
1)Pi在海明码的第2i-1位置,即除了最高位,校验位一般放在第1、2、4、8位。数据位则依次从低到高占据海明码中剩下的位置。
2)海明码中的任一位都是由若干校验位来校验的。具体的对应关系如下:被校验的数据位的下标等于所有参与校验该位的校验位的下标之和。而校验位则由自身来检验。一般采用偶校验方法。
海明码的编码规则表明,设计海明码的关键是把每个数据位合理、均匀地分配到相应的校验位中,以确保能发现码字中任何一位出错,并能指出是哪一位出错。实现纠错时,只要对出错位求反就可得到该位的正确值。
现在介绍海明码的编码方法。假设数据位是8位,用D8D7D6D5D4D3D2D1表示,根据海明不等式的公式,应安排4位校验位。假设校验位用P4P3P2P1表示,则生成的海明码具有下列的排列关系,如表3-1所示。
表3-1 海明码的位号等于参与校验该位的校验位的位号之和
根据校验位与数据位的对应关系表,把每个数据位划分在形成不同校验位的偶校验值的逻辑表达式中。例如,D8位于H12,12=4+8,P3的位号是4,P4的位号是8,即D8参与P3和P4的校验,由此得出海明校验码的编码逻辑表达式如下:
P1=D7⊕D5⊕D4⊕D2⊕D1
P2=D7⊕D6⊕D4⊕D3⊕D1(www.daowen.com)
P3=D8⊕D4⊕D3⊕D2
P4=D8⊕D7⊕D6⊕D5
例如,如果数据为00110011,把校验位P4P3P2P1按编码规则插入到数据中:0011P4001P31P2P1,根据上式计算出P4=0,P3=1,P2=0,P1=1,就得到海明码001100011101。
接收时,分别按下式计算S4S3S2S1,并对S4S3S2S1进行译码:
S1=P1⊕D7⊕D5⊕D4⊕D2⊕D1
S2=P2⊕D7⊕D6⊕D4⊕D3⊕D1
S3=P3⊕D8⊕D4⊕D3⊕D2
S4=P4⊕D8⊕D7⊕D6⊕D5
如果S4S3S2S1为0000,则表明传输无错,若不是0000,则译码值就是出错的海明码位号。例如,如果S4S3S2S1=0111,则说明H7出错,即D4传输出错。
从上面的表达式中可以看出,不同的数据位出现在Pi项中的次数是不一样的,例如,D4和D7出现了3次,而其余的数据位仅出现了2次,当任一个数据位发生变化时,必将引起至少两个Pi值的变化,因此,海明码的码距为3,它可以纠正一位错,或检测2位错。
为了均匀分配数据位,以便平衡对每一个数据位的校验能力,在上面的海明码前再加上一位校验位P5,P5的逻辑表达式安排如下:
P5=D8⊕D6⊕D5⊕D3⊕D2⊕D1
这样,每一位数据位都均匀出现在3个Pi值的形成关系中,当任一个数据位发生变化时,必将引起3个Pi值的变化,因此,这种海明码的码距为4,它可以纠正一位错,并能检测2位错。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。