汉明码 Hamming code
汉明码是一种线性调试码,可以纠正一位错误;而扩展汉明码可以检测出两位错误。
汉明码编码以及纠错过程
编码
对于给出的一串数码,根据纠错码原理,我们知道对于n位的原串,至少需要使得纠错码位数k满足:\(n+k \le 2^k - 1\)
以长度为11的数码为例,则需要4位纠错码(不选择12位的原因将在扩展汉明码中解释)
汉明码的纠错码位于第\(2^{k},k=1,2,\dots\)处
如将11位数码与四位纠错码的最终编码为\(N_1,N_2,N_3,N_4,N_5,N_6,N_7,N_8,N_9,N_{10},N_{11},N_{12},N_{13},N_{14},N_{15}\)
并且在偶校验方法时规则为:设该校验位为\(2^i\),则\(该校验位= \oplus^{n}_{k=1} N_{ 二进制码展开含2^i的数}\)
(注:偶校验即保证该组数据中1的个数为偶数)
直观的表示在4*4的方格中则是
最后将0位空出,其余位依次排列,最后就得到了一组共11+4=15位的汉明码。
纠错
当接收到一份信息时,我们只需要4个计算校验和,他们的形式与刚刚计算校验码类似,仅仅是将校验位加入运算而已。
得到一个新的数码{G_4,G_3,G_2,G_1},假定只会出现一位错误,那么校验和为0000则可以认为没有出错。
当出现错误时,任何一位出现时,校验码将等于它的下标。
例如:
$ 100010011011011 $ 他的第三位是错误的
可以得到校验码为0011=3,这样就可以纠正错误了。
汉明码原理
不难看出,汉明码的设计与二进制表示有着密切关系,将汉明码就错位设置在\(2^k\)处并且将每个就错位都分配与之对应的一半的数码,这样就是为了在编码改变时,能够恰好影响对应的校验和,从而校验和的排列最后为\(G_1 2^1+G_2 2^2+ G_3 2^3+G_4 2^4=出错位置下标\)
扩展汉明码
在刚刚的汉明码中,我们只能检查并纠正一位错误,如果同时有两位出错,那么对于已有的汉明编码来说,是无法分辨的。我们只能按照以往的规则,认为是一位出错。
还记得刚刚没有使用的第0位吗,现在我们将这一位当做整个数串的总奇偶校验位,可以达到检测两位错误的作用:
(假设均为偶校验)
- 如未发生错误,汉明校验位校验和为0,总校验和为0
- 如果发生一位错误,那么总校验和为1
- 如果发生两位错误,那么总校验和为0
这样我们就可以发现发生了两位错误,更多的错误就超过了汉明码的检测及纠错能力范围了。
参考资料
三蓝一棕赛高!
https://www.bilibili.com/video/BV1WK411N7kz
https://www.bilibili.com/video/BV1pV411y7E8