汉明码:从奇偶校验到错误精确定位的传奇编码
汉明码:从奇偶校验到错误精确定位的传奇编码
在数字通信的复杂网络中,信息传输极易受到噪声干扰,导致数据错误。信道编码技术作为保障信息准确传输的关键,显得尤为重要。而汉明码,凭借精准的错误定位(仅限1个bit位出错)功能,在多种场合得到应用。上大学时没好好学,这两天又静下心来看了一遍,感觉发明汉明码的人太牛了,感叹这样的奇思妙想和精妙设计。
奇偶校验:汉明码诞生的启示
奇偶校验是一种基础的错误检测方法,其原理基于码组中“1”的个数的奇偶性。在偶校验,为使整个码组“1”的个数为偶数,如果原始码组中“1”的个数为奇数,则在信息码的最后添加一个监督码“1”,反之则监督码设为“0”。比如,对于信息位1011,“1”的个数为3,为实现偶校验,校验位设为1,最终码组为10111。奇校验则相反,使码组“1”的个数为奇数。
数学表达上,设码组为:
a n − 1 , a n − 2 , ⋯ , a 1 , a 0 a_{n - 1}, a_{n - 2}, \cdots, a_{1},a_{0} an−1,an−2,⋯,a1,a0
校验位为 a 0 a_{0} a0。
偶校验时,通过设置 a 0 a_{0} a0,使下面的等式成立:
a n − 1 ⊕ a n − 2 ⊕ ⋯ ⊕ a 0 = 0 a_{n - 1} \oplus a_{n - 2} \oplus \cdots \oplus a_{0} = 0 an−1⊕an−2⊕⋯⊕a0=0
接收端收到后,做同样的运算,若不为“0”,则判为传输出错。
奇校验时,通过合理设置 a 0 a_{0} a0使得下面等式成立:
a n − 1 ⊕ a n − 2 ⊕ ⋯ ⊕ a 0 = 1 a_{n - 1} \oplus a_{n - 2} \oplus \cdots \oplus a_{0} = 1 an−1⊕an−2⊕⋯⊕a0=1
这里” ⊕ \oplus ⊕“表示异或运算。
奇偶校验通过增加1个监督位,能够监测码组传输是否出错,深入分析可以发现如果出错的码元成偶数个,奇偶校验码是无法检测的。
好奇的你可能已经发现,通过增加1个监督码就能检测是否发送出错,那么能不能多增加一些监督码实现错误码元的定位呢,对于二进制码,只要能定位就能进行纠错。
大胆假设,小心求证
线性分组码
上面讨论的奇偶监督码的编码方法利用代数关系式产生监督位。我们将这类编码称为代数码。在代数码中,若监督位和信息位的关系是由线性代数方程式决定的,则称这种编码为线性分组码。换句话说,线性分组码是代数码的一种。它的构造方法较简单、理论较成熟,故应用也较广泛。下面我们介绍线性分组码的一个典型代表,也是今天的主角——汉明码。
汉明码
汉明码是一种能够纠正一个错码位(bit)的线性分组码,由汉明(R.W.Hamming)于1950年提出的。
对于偶数监督码而言,在接收端解码时,实际上就是在计算下式:
S = a n − 1 ⊕ a n − 2 ⊕ ⋯ ⊕ a 0 S = a_{n - 1} \oplus a_{n - 2} \oplus \cdots \oplus a_{0} S=an−1⊕an−2⊕⋯⊕a0
若计算出的S=0,就认为无错码;若计算出的S=1,就认为有错码。将上面的式子称为监督关系式,S称为校正子。由于校正子S是一位二进制数字,它只有两种取值,故只能表示有错和无错,而不能进一步指明错码的位置。
不难推想,若此码组长度增加一位,即有两个监督位,则能增加一个类似于上式的监督关系式。这样,就能得到两个校正子。两个校正子的可能取值有4种组合,即00,01,10,11,故能表示4种不同的信息。若用其中一种组合表示无错码,则还有其他3种组合可以用于指明一个错码的3种不同位置。因此,若有r个监督关系式,则r个校正子可以指明一个错码的 ( 2 r − 1 ) (2^r-1) (2r−1)个不同位置(其中一个用于指示是否出错)。只有当校正子可以指明的错码位置数目等于或大于码组长度n时,才能够纠正码组中任何一个位置上的错码,即要求:
( 2 r − 1 ) > = n (2^r-1)>= n (2r−1)>=n
下面通过一个例子来说明如何具体构造监督关系式。假设要求设计一个能够纠正1个错码的分组码 ( n , k ) (n,k) (n,k),给定的码组中有4个信息位,即k=4。由上式可知,这时要求监督位数 r ≥ 3 r≥3 r≥3。若取r=3,则 ( 2 3 − 1 ) = 7 (2^3-1)= 7 (2