本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
计算机系统在计算、运输、数据传输过程中可能产生错误
- 硬件原因:辐射、撞击、老化、底噪
- 软件原因:BUG
在计算或数据存储中,使用汉明码(Hamming Code)不仅可以能判断是否出错,还能修正错误
二、最小汉明距离
任意两个等长数字中,不同位的总数称为汉明距离(Hamming Distance),记为D
例如:
1 0 0 0 1 0 0 1
1 0 1 1 0 0 0 1
* * *
D=3
任意两个合法编码的汉明距离的最小值称为最小汉明距离,记为Dmin。
Dmin决定了汉明码的纠错能力:
例如:假设字长=3,合法编码为c1=000、c2=111,则Dmin=3
若收到x=001:
若最多有1位错误,则源数据为c1
若最多有2位错误,无法判断源数据,只能判定出错
若最多有3位错误,无法判断源数据,只能判定出错
设最小汉明距离Dmin,最多可以对k位查错/纠错,k=(Dmin-1)/2
假设n位汉明码有m位有效信息和r位校验码,可以对k位纠错的前提是:每个合法编码对应了C k/n+k个编码,因此有:
C k/m+r+k ≤ 2^r^ 或 C k/n+k +2^m^≤2^n^
例如:(1)设m=7,r=4,是否可以对k=1纠错?(2)设m=4,k=1,最少需要几位进行编码?
(1)C 1/12 =12≤2^4=16,可以
(2)C 1/5+r =5+r≤2^r → r≥3
三、确定汉明码的编码
Ⅰ、校验位和有效位
二进制编码中:除了2的次幂,每个数字至少包含两项
例如:5=4+1,13=8+4+1
约定:2的次幂位是校验位,有效数字由低到高填满剩余位
例如:(星标为校验位)m=8,r=4,k=1
__ __ __ __ __ __ __ __ __ __ __ __
12 11 10 9 8 7 6 5 4 3 2 1
** ** ** **
Ⅱ、校验位该填什么值?
第n位是校验位时:采用偶校验,查看可以分解出该位的数值位是否为1,有一位为1就加一,加法是模2加法
例如:
1 1 0 1 __ 0 1 1 __ 0 0 __
记第k位为dk,第2^n位记为校验位pn
由于3=2+1、5=4+1、7=4+2+1、9=8+1、11=8+4+1,d1=p0=d3+d5+d7+d9+d11=1
同理:
d2=p1=d3+d6+d7+d10+d11=0
d4=p2=d5+d6+d7+d12=1
d8=p3=d9+d10+d11+d12=1
结果为
1 1 0 1 1 0 1 1 1 0 0 1
* * * *
三、如何纠错?
通过错误的汉明码可以判断是否出错并给出具体位
例如:
1 1 0 1 1 0 1 0 1 0 0 1
* * * *
根据有效位计算每一位校验值,核对
p0=d3+d5+d7+d9+d11=0≠1=d1,出错,并且限定了错误范围
p1=d3+d6+d7+d10+d11=0=d2
p2=d5+d6+d7+d12=0≠1=d4,出错,并且限定了错误范围
p3=d9+d10+d11+d12=1=d8
寻找交集元素即可知:d5出错,取非得1完成修正
只要两个位计算结果不相符就能通过交集元素知道错误位,交集有且仅有一个元素才做到了查错