理解海明校验法

奇偶校验法只能发现错误,而不能找到错误在哪里,进而没有纠错功能。

为了能找到发现错误的位置,而有了海明校验法。

海明校验码分为两个部分:n个有效信息位(用DnDn-1...D1表示),k个校验位(用PkPk-1...P1表示)。

n与k的关系是:n+k≤2k-1。因为k个校验码可以表示2k个状态,其中一个状态表示正确状态,其他的用于表示是哪一位(包括有效信息位和校验位)发生了错误。

这个基本思路还是比较好理解的,但奈何书还是看不懂。

下面是我经过思考后的,比较说得通的海明校验法理解法。


现有有效信息位D4D3D2D1,n=4,则k=3,校验位为P3P2P1,形成7位海明校验码H7H6H5H4H3H2H1

为了检查接收到的海明校验码是否正确,方法就是再计算一遍校验位P3'P2'P1',与P3P2P1比较,如果不同,代表发生了错误。

比较结果有8种情况,即:

P1'!=P1 P2'!=P2 P3'!=P3

表1

P1'是否不等于P1,可以用逻辑运算异或来表示——不等为1,相等为0。

设Si = Pi' xor Pi,则上表可以表示为:

S3 S2 S1
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

表2

 对于这8种状态,除了000用于表示没有错误之外,其它每种状态应表示海明校验码的某一位发生了错误:

S3 S2 S1 含义
0 0 0 没有错误
0 0 1 H1发生错误
0 1 0 H2发生错误
0 1 1 H3发生错误
1 0 0 H4发生错误
1 0 1 H5发生错误
1 1 0 H6发生错误
1 1 1 H7发生错误

表3

三个校验位本身也可能发生错误,为了直观表示,将001、010、100表示为P1、P2、P3发生了错误。那么对应地,它们分别在海明校验码中占据H1、H2、H4三个位,其余的位分配给有效信息位。如下:

海明校验码 H7 H6 H5 H4 H3 H2 H1
实际分配 D4 D3 D2 P3 D1 P2 P1

表4

接着分析有效信息位发生错误的情况:

S3 S2 S1 含义
0 1 1 H3发生错误
1 0 1 H5发生错误
1 1 0 H6发生错误
1 1 1 H7位发生错误

表5

可以看出:

  • H3应该是计算P2和P1的因子,即如果H3发生变化,则P2和P1就相应发生变化,从而导致S2和S1变为1。
  • H5应该是计算P3和P1的因子,即如果H5发生变化,则P3和P1就相应发生变化,从而导致S3和S1变为1。
  • H6应该是计算P3和P2的因子,即如果H6发生变化,则P3和P2就相应发生变化,从而导致S3和S2变为1。
  • H7应该是计算P3、P2和P1的因子,即如果H7发生变化,则P3、P2和P1就相应发生变化,从而导致S3、S2和S1变为1。

因此由以下对应关系:

校验位 H3 H5 H6 H7
P1   
P2  
P3  

表6

可以发现,表5和表6就是一个旋转关系。

表6可表示为:

  • P3 = f(H5,H6,H7)
  • P2 = f(H3,H6,H7)
  • P1 = f(H3,H5,H7)

那么这个f法则具体是怎样的呢?虽然书上说的是异或操作,但我觉得不是异或操作也没关系。只要保证一旦其中一个因子发生变化,计算结果就发生变化即可。

综上,海明校验法的原理就是对校验结果的8种状态的分配,而校验位的计算只要注意与特定的有效信息位相关联即可,校验法则只要记住官方(姑且这么叫吧)使用的是异或即可。

posted @ 2020-10-25 20:32  hdxg  阅读(361)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css