汉明码是由Richard Hanming 于1950年提出的,他具有一位纠错能力 由编码纠错理论得知,任何一种编码是否具有减压能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。
举例说明: 编码系统第一组 0 0 0 0 1 0 1 0 1 编码系统第二组 0 0 0 1 1 0 1 1 1 编码系统第三组 0 0 1 1 1 1 1 1 1 编码系统第四组 0 0 0 0 1 0 1 1 1 任选两组,总共有六种选择 其中第一组和其余组的距离分别为:2,4,1 其中第二组和剩下组的距离分别为:2,1 其中第三组和剩下组的距离分别为:3 故编码的最小距离为:1
根据纠错理论得: L - 1 = D + C 且D>=C 即编码最小距离L越大,则其检测错误的位数D越大,纠错错误的位数C也越大,求纠错能力恒小于或等于检错能力。
举例说明: 当编码最小距离为L=3时,这种编码方式最多能检错二位,或者能检错一位和纠错一位
设欲检测的二进制代码为n位,为使其具有纠错能力,需增添k位检测位,组成n+k位的二进制代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数k应满足: k的位数确定以后,便可以由它们所承担的的检测任务设定它们在被传送代码中的位置及它们的取值。 设n+k位代码自左向右依次编号位第1,2,3,…,n+k位,而将k位检测位记作Ci,分别按插在n+k位代码编号的第1,2,4,8,…,2^k-1位上。这些检测位的位置设置是为了保证它们能分别承担n+k位信息中不同位数所组成的“小组”的奇偶检验任务,使检测位和它所负责检测的小组1的个数位奇数或者偶数,具体分配如下:
以下只取前五位,前四组
C1: 00001 1 00011 3 00101 5 00111 7 01001 9 01011 11 01101 13 01111 15 … C2: 00010 2 00011 3 00110 6 00111 7 01010 10 01011 11 01110 14 01111 15 … C3: 00100 4 00101 5 00110 6 00111 7 01100 12 01101 13 01110 14 01111 15 10100 20 10101 21 10110 22 10111 23 11100 28 11101 29 11110 30 11111 31 … C4: 01000 8 01001 9 01010 10 01011 11 01100 12 01101 13 01110 14 01111 15 ...以上为Ci所分配的组成员,第一列为二进制数,第一列为十进制数,大家有没有发现规律? 对于二进制数值中总有一列全是一 其余位均是按照顺排序的,可以总结出规律来 每一组的第一位数字均为: i为相应的组数 然后出现连续相同的数字,第一组总有一个连续数字,第二组总有两个连续数字,第三组为总有连续四个连续数字… 对于连续数字的多少,也可以用公式定义:
但是大家发现连续数值会出现断层,这总是相差: 比如在C3组中的 00100 4 00101 5 00110 6 00111 7 01100 12 … 这里的7和12相差2^(3-1)+1=5
这里举例说明:
欲传递的信息为1010,需要求它的汉明码
解: 这里信息的位数为4位,根据公式2^k >= k+n+1 可求出k = 3,即只需要三组,分别插入2^(1-1)=1位, 2^(2-1)=2位, 2^(3-1)=4位中 其安排如下: 如果按照配偶原则来配置汉明码, 则C1应使得1,3,5,7(因为只有7位,所以后面的成员可以忽略)中的“1”的个数位为偶数; 则C2应使得2,3,6,7位中的“1”的个数位偶数; 则C3应使得4,5,6,7位中的“1”的个数为偶数;那么如何通过数学表达式来表达“1”个数为偶数了? 这里就是通过异或符号实现的 即: 也就是说1010的汉明码为:1010010 如果是奇校验的话,Ci需要取反
汉明码的纠错过程实际上是对传送后的汉明码形成新的检测位,根据检测位可直接求出错误的位置。
这里举例说明:
设传送后的汉明码为0010100,求传送前的汉明码(按照配偶原则)
这里总位数只有七位,小于2^(4-1)=8位,即只有三位校验位 故可以解出新的检测位为:即C3C2C1 = 110 B = 6 D,表示第六位的数据有误,故传送前的汉明码应该为 0010110 又如,对于七位的汉明码,当收到汉明码按配偶原则的求得的C3C2C1 = 001 , 010 , 100三者之一,也就是在校验位置上,则说明它没有错误。
参考:计算机组成原理 唐朔飞