海明码(Hamming)是能进行检错和纠错的一种编码方法。
要能纠错就需要知道哪一位发生错误,海明码就可以检测出哪一位发生了错误。
例如一个信息码长m位,加入k个校验码后,整个数据长度为(m+k)个。当数据某一位出错时,就可以通过校验码检测出来是哪一位错了。
其中k个校验码可以表示2的k次方种信息,例如:1个校验码:表示01,10两种信息;2个校验码可以表示00,01,10,11共4种信息。
所以用k个校验码,就可以表示2的k次方种信息码传输的情况,其中只有一种代表数据没有错误,去掉这种“没有错误”的情况,就是(2的k次方-1)个错误情况。
当满足(2的k次方-1)>= (m+k) 时,(其中m+k时编码后数据的总长度),就可以判断出哪一位出错,出错的位置可能是信息码和校验码,也就是说 校验出错误情况的个数要大于或等于数据的长度才能保证能检出所有错误的情况。
举个例子:m=4,k=2 则(2的2次方-1)=3种情况,m+k=6 位长度。3种错误位明显不能代表6位的所有可能出现错误情况。
再举个例子:m=4,k=3则(2的3次方-1)=7种情况 ,m+k=7位长度。7种错误位就足够代表7位数据码出现的错误情况了。
下面演示一下海明码的使用过程:
信息码:1010
校验码:k 个
step1:
利用海明码不等式:(2的k次方-1)>= (m+k) 求出 k=3
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
数据 | k1 | k2 | 1 | k3 | 0 | 1 | 0 |
step2:
校验码放在2的n次方对应位置上(n=0,1,2,3...),这里共3个校验位,2的0次方=1,2的1次方=2,2的2次方=4,所以校验码分别在第1,第2,第4个位置。
接着信息码在剩下的位置依次入座,分别对应第3,第5,第6,第7的位置,得到如上图所示的编排位置。
因为校验码未知,现在求校验码k1,k2,k3:
序号 | 1 (001) | 2 (010) | 3 (011) | 4 (100) | 5 (101) | 6 (110) | 7 (111) |
数据 | k1 | k2 | 1 | k3 | 0 | 1 | 0 |
如上图:把序号进行二进制编码(括号内的值)。按照规律:验证码对应的二进制码' 1 '显示的位置(上图红色标出了k1组,验证码k1对应的二进制码001,1显示在最后一位,所以找出最后一位是1的所有信息码,分别是第3,第5,第7位信息码。剩余两组也是以此类推),最后会找出三个校验码k1,k2,k3和分别对应的一组信息码。如下所示:
k1:1 0 0
k2:1 1 0
k3:0 1 0
现在进行数据传输。如果使用奇校验,校验码k1=0,k2=1,k3=0。
0:1 0 0
1:1 1 0
0:0 1 0
得出校验码后代入数据,完整数据码如下图所示:
1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 1 | 1 | 0 | 0 | 1 | 0 |
假设进行传输后,接收结果是0110110,现在进行校验,把接收结果0110110对应的校验码和信息码组写下来:
序号 | 1 (001) | 2 (010) | 3 (011) | 4 (100) | 5 (101) | 6 (110) | 7 (111) |
接收结果 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
校验码 | 0 | 1 | 0 |
接收到的 校验码和其对应的信息码组如下所示(编排方法跟上面step2一样,这里校验码已知)
k1:1 1 0
k2:1 1 0
k3:1 1 0
在前面分别加上错误位置e:
e1:k1 1 1 0 e1:0 1 1 0 则e1=1
e2:k2 1 1 0 --(接收码已知k)--> e2:1 1 1 0 --(对e奇校验)--> 则e2=0
e3:k3 1 1 0 e3:0 1 1 0 则e3=1
得到错误码顺序为101,把错误码倒过来变为101,101对应的二进制值是5,则说明接收到的数据第5位发生了错误。这样就可以进行纠错的步骤了。