海明码思路分享,原理解读
海明码(Hamming Code)是一种用于错误检测和纠正的编码技术,它是由理查德·海明在1950年代提出的海明码通过在数据中添加冗余位(parity bits),使得在传输过程中出现的错误可以被检测和纠正。海明码的一个关键特点是能够检测和纠正单个位错误,并且能够检测多个位错误,我们以下假定只会出现一位错误。
1. 确定校验码的位数
设数据有nnn位,校验码有rrr位。则校验码一共有2r2^r2r种取值方式。用其中需要一种取值表示数据正确,剩下2r−12^r-12r−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+rn+rn+r位,因此rrr应该满足
2r−1≥ n+r 2^r-1 ≥ n+r 2r−1≥ n+r
海明码的码组长度需要符合:2r–12^r – 12r–1 (rrr代表校验位个数),只有这样才能保证校验位足够覆盖整个需要校验的码组。比如说:校验位有3位,那就是23=8–1=72^3 = 8 – 1 = 723=8–1=7 这样就可以校验长度为7的码组,如果按实际来说,也就是信息位 4 位,校验码 3 位。
通过上面分析,我们知道校验位 rrr 加上信息位 kkk 就等于 2r–12^r – 12r–1 , 这也就是为什么书上有 k+r<=2r–1k + r <= 2^r – 1k+r<=2r–1 的原因,下面是一些 RRR 和 KKK的关系表
| 信息码位数 | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
|---|---|---|---|---|---|---|
| 校验码位数 | 2 | 3 | 4 | 5 | 6 | 7 |
使不等式成立的rrr的最小值就是校验码的位数。以101011010101101010110为例,n=7n=7n=7,解得x=4x=4x=4。
2. 确定校验码的位置
知道了需要多少位校验码,还需要知道把校验码放在哪个位置上才行,这个只要记住,信息位在非2n2^n2n的位置上,而校验位是在2n2^n2n的位置上就可以了。
**为什么要保证校验位在2n2^n2n位置上呢?**本质上校验码就是按照一定方式将,校验码组的所有取值分别分配到正确和每一种错误的情况上,怎么分配理论上很自由,但是我们约定了一种更为“自然”的方式:保证海明码中的每一位的下标,可以由这一位之前的某几个校验位下标相加得到,在后面我们会体会到这种“自然”。不懂为什么这样做没关系,我们后面再详细阐述该思路。为了方便理解,下面进行简单的例题分析。
对给定的信息字码组 : 110111011101 , 这时候信息位 n=4n = 4n=4 , 根据 n+r<=2r–1n + r <= 2^r – 1n+r<=2r–1 ,得出 r=3r = 3r=3 , 那就按书上说的,用P1,P2,P3P_1,P_2,P_3P1,P2,P3来表示这3位校验码,分别放在20,21,222^0, 2^1, 2^220,21,22三个位置上,如下:
P1P21P3101 P_1 P_2 1 P_3 1 0 1 P1P21P3101
为了阐述上面所说的思路,我们简单做个分析,我们假设海明码的第iii位的二进制下标为HiH_iHi,这里
H1=001,H2=010,H3=011,H4=100,H5=101...
H_1=001,H_2=010,H_3=011,H_4=100,H_5=101...
H1=001,H2=010,H3=011,H4=100,H5=101...
对于信息码H3=H1+H2,H5=H4+H1H_3=H_1+H_2,H_5=H_4+H_1H3=H1+H2,H5=H4+H1,而每一位校验码则等于其自身。看到这里,你应该能很容易感受到为何将校验位放在2n2^n2n位置上。
以101011010101101010110为例,校验码在二进制串中的位置为2的整数幂。剩下的位置为信息位。如图所示。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 内容 | x1 | x2 | 1 | x3 | 0 | 1 | 0 | x4 | 1 | 1 | 0 |
3. 求出校验位的值
上面已经知道要在什么位置插入校验码,那么怎么求校验位实际的值呢?很简单,我们写出每一个信息位下标的组合:
H3=H1+H2H_3 = H_1+H_2H3=H1+H2
H5=H1+H4H_5 = H_1+H_4H5=H1+H4
H6=H2+H4H_6 = H_2 + H_4H6=H2+H4
H7=H1+H2+H4H_7 = H_1 + H_2 + H_4H7=H1+H2+H4
通过上面的关系式,我们可以看出,右边在海明码中的数位,正好都是校验码的位置,我们则可以得到校验码关联的信息位,将其异或起来得到我们的校验位取值,这里异或可以理解为关联这一校验位的所有位码(包括信息位和校验位)中1的奇偶数(这是异或的性质),记住这点很重要。这里所说的关联就是上一部分公式所体现的下标组合的关联,例如与信息位H3H_3H3关联的校验位为P1(H1)P_1(H_1)P1(H1)和P2(H2)P_2(H_2)P2(H2),而校验位P3(H4)P_3(H_4)P3(H4),则关联了H5,H6,H7H_5,H_6,H_7H5,H6,H7三个信息位。
P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7
大功告成!例如信息码:1101 对应海明位 H3、H5、H6、H7,不要把海明码,校验位,信息位搞混了哦!
P1 = 1 ⊕ 1 ⊕ 1 = 1;
P2 = 1 ⊕ 0 ⊕ 1 = 0;
P3 = 1 ⊕ 0 ⊕ 1 = 0;
对1010110这个例子计算如下:
| 位置 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 内容 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
4. 确定并使用检验码
在算得海明码之后,我们就应该思考如何运用计算到的海明码来检验数据是否传输错误呢。在这之前我们先理解海明码的校验思路:海明校验码的思路其实很简单,在信息传输前,在数据中加入校验位,这些校验位记录下传输前的原码特定信息(这里每一位包括校验位和信息位),再在传输后将校验码包含的信息与传输后的数据进行比对,即可得到是否出错以及出错的地方。
那这里所谓的特定信息是什么呢,就是我们上面所说的校验位关联的所有位码中1的奇偶。如何体现呢,我们看之前提到的校验码计算公式。那么当H3H_3H3在传输后出错时,那么与H3H_3H3关联的P1,P2P_1,P_2P1,P2则一定会因为1或0的奇偶数改变而改变,而与之无关的P3P_3P3则没有变化。表示位置下标中第0,1位为1的数发生错误,即第011(2)=3(10)位出错。这样你是否体会到前面所说的这种编码方式的自然了吗。
P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)
P2(H2) = H3 ⊕ H6 ⊕ H7
P3(H4) = H5 ⊕ H6 ⊕ H7
所以我们的检验码S1S2S3S_1S_2S_3S1S2S3计算公式为
S1=P1⊕H3⊕H5⊕H7S2=P2⊕H3⊕H6⊕H7S3=P3⊕H5⊕H6⊕H7 S1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 \\ S2 = P2 ⊕ H3 ⊕ H6 ⊕ H7 \\ S3 = P3 ⊕ H5 ⊕ H6 ⊕ H7 \\ S1=P1⊕H3⊕H5⊕H7S2=P2⊕H3⊕H6⊕H7S3=P3⊕H5⊕H6⊕H7
这样由S3S2S1S_3S_2S_1S3S2S1的值即可得到错误的那一位的下标值。
其他位数的编码以及检验码计算方式,读者可以自行推广。
1520

被折叠的 条评论
为什么被折叠?



