汉明码

title: 历史.
content: 汉明码的发明者理乍得汉明在1940年代晚期,运用贝尔模型V(Bell Model V)电脑于贝尔实验室(Bell Labs)工作。输入端是依靠打孔卡(Punched Card),这不免会造成些读取错误。在工作日,当机器检测到错误将停止并闪灯(flash lights),使得操作员能够解决这个错误。在周末和下班期间,没有操作者的情况下,机器只会简单地转移到下一个工作。  汉明在周末工作,他对于不可靠的读卡机发生错误后,总是不得不重新启动程序变得愈来愈沮丧。在接下来的几年中,他为了解决侦错的问题,开发了功能日益强大的侦错算法。在1950年,他发表了今日所称的汉明码,并且时至今日仍在ECC memory上显示其应用价值。
title: 汉明码之前.
content: 人们在汉明码出现之前使用过多种检查错误的编码方式,但是没有一个可以在和汉明码在相同空间消耗的情况下,得到相等的效果。
title: 奇偶.
content: 奇偶校验是一种添加一个奇偶位用来指示之前的数据中包含有奇数还是偶数个1的检验方式。如果在传输的过程中,有奇数个位发生了改变,那么这个错误将被检测出来(注意奇偶位本身也可能改变)。一般来说,如果数据中包含有奇数个1的话,则将奇偶位设定为1;反之,如果数据中有偶数个1的话,则将奇偶位设定为0。换句话说,原始数据和奇偶位组成的新数据中,将总共包含偶数个1.  奇偶校验并不总是有效,如果数据中有偶数个位发生变化,则奇偶位仍将是正确的,因此不能检测出错误。而且,即使奇偶校验检测出了错误,它也不能指出哪一位出现了错误,从而难以进行更正。数据必须整体丢弃并且重新传输。在一个噪音较大的媒介中,成功传输数据可能需要很长时间甚至不可能完成。虽然奇偶校验的效果不佳,但是由于他只需要一位额外的空间开销,因此这是开销最小的检测方式。并且,如果知道了发生错误的位,若将该位取反,奇偶校验还可以恢复数据。
title: 汉明码.
content: 如果一条信息中包含更多用于纠错的位,且通过妥善安排这些纠错位使得不同的出错位产生不同的错误结果,那么我们就可以找出出错位了。在一个7位的信息中,单个位出错有7种可能,因此3个错误控制位就足以确定是否出错及哪一位出错了。  汉明研究了包括五取二码在内的编码方案,并归纳了他们的想法。
title: 通用算法.
content: 下列通用算法可以为任意位数字产生一个可以纠错一位(英语:Single Error Correcting)的汉明码。  采用奇校验还是偶校验都是可行的。偶校验从数学的角度看更简单一些,但在实践中并没有区别。  校验位一般的规律可以如下表示:  表中只给出了20个编码后的位(5个奇偶校验位,15个数据位)。观察上表可发现一个比较直观的规律:第i个检验位是第2位,从该位开始,检验2位,跳过2位......依次类推。例如上表中第3个检验位p4从第2=4位开始,检验4、5、6、7共4位,然后跳过8、9、10、11共4位,再检验12、13、14、15共4位......  要检查某一位的错误,则需检查某一位所包含的所有奇偶校验位。这种错误的模式被叫做伴随式错误。如果所有奇偶校验位是正确的,就没有错误。除此以外的情况,错误的奇偶校验位的位置的和将识别错误的位。例如,如果位置为1、2、8的奇偶校验位指示了一个错误,那么位置为1+2+8=11的位出错了。如果只有一个奇偶校验位指示了错误,那么该奇偶校验位自身出错了。
title: 例子.
content: 对11000010进行汉明编码,求编码后的码字。  1.列出表格,从左往右(或从右往左)填入数字,但2的次方的位置不填。 2.把数据行有1的列的位置写为二进制。 3.收集所有二进制数字,求异或。formula_1  4.把1101依次填入表格中2的次方的位置(低位在左)。 5.所以编码后的码字是101110010010。
title: 带附加奇偶校验码的汉明码(SECDED).
content: 加一个bit在数列的最前面,采用奇校验码或偶校验码, 用以检验后面的Hamming Code是否有错。
title: (7,4)汉明码.
content: 1950年,汉明介绍了(7,4)代码。其编码由4资料位元到7位,增加三个奇偶校验码。(7,4)汉明码可以检测并纠正单位元错误,且也能检测双位元错误。
title: 建立奇偶检验矩阵.
content: 矩阵formula_2被称为(标准)生成矩阵线性(n,k)码。  和formula_3被称为奇偶检验矩阵。
title: 编码.
content: 范例  从上述矩阵我们有2=2=16码词。  二进制码formula_4的码词可以从formula_5得到。对formula_6和formula_7存在formula_8(一个只有0和1的二元域)。  故此码表即是所有4个三元组(k个三元组)。  因而,(1,0,1,1)编码为("0","1",1,0,"0",1,1)。
title: (8,4)汉明码.
content: (7,4)汉明码可以很容易地编码为一个(8,4)码,通过在(7,4)编码词("参见(7,4)汉明码")上附加一个额外的奇偶位。  这可以用下面修正的矩阵相加:  和  注意,formula_11并非用标准形式表示。为了得到formula_12,原子行操作能够被用来获得一个等价的矩阵对陈形式的formula_11:

Summary: 在电信领域中,汉明码(英语:hamming code),也称为海明码,是(7,4)汉明码推广得到的一种线性纠错码,由理乍得·卫斯里·汉明于1950年发明。相比而言,简单的奇偶检验码除了不能纠正错误之外,也只能侦测出奇数个的错误。汉明码是完备码,它在于它分组长度相同、最小距离为3的码中能达到最高的码率。

Hamming code: In computer science and telecommunication, Hamming codes are a family of linear error-correcting codes. Hamming codes can detect up to two-bit errors or correct one-bit errors without detection of uncorrected errors. By contrast, the simple parity code cannot correct errors, and can detect only an odd number of bits in error. Hamming codes are perfect codes, that is, they achieve the highest possible rate for codes with their block length and minimum distance of three. Richard W. Hamming invented Hamming codes in 1950 as a way of automatically correcting errors introduced by punched card readers. In his original paper, Hamming elaborated his general idea, but specifically focused on the Hamming(7,4) code which adds three parity bits to four bits of data.