前言:
网上好像很少有关于Hamming的原理的阐述?
大概是过于简单以至于大家都不屑于写罢0.0
但还是为了以后或许也有人像我一样疑惑,所以写一写[
搬一搬实验报告],来交流一下0.0
Hamming校验码:
海明校验码通过在数据间插入 r r r位校验码,并且在一位错时能够判断出到底是哪一位错[包括校验位],实现纠错的校验码。
数据位每一位的改变会引起至少3位校验位的改变[总校验位、二进制数对应的位置(至少2个)],所以码距为4。
假设一共需要 r r r位校验位,其中一位是总校验位,剩余 r − 1 r - 1 r−1位需要能表示所有除了总校验位的其他2进制位置。
则有:
k + r − 1 < 2 r − 1 k + r - 1 < 2^{r - 1} k+r−1<2r−1
k + r ≤ 2 r − 1 k + r \leq 2^{r - 1} k+r≤2r−1
并且把每一个校验位 P i P_{i} Pi放到下标为 1 ≪ ( i − 1 ) 1 \ll (i - 1) 1≪(i−1)的位置 H 1 ≪ ( i − 1 ) H_{1 \ll (i - 1)} H1≪(i−1)上,剩余位置嵌入数据位。每一位 H i H_{i} Hi[注意不是 D i D_{i} Di,是嵌入后的下标]把下标拆成二进制,分配给二进制为1的位置上的校验位,每一位校验位其实是对应位置的奇/偶校验,就能得到每一位校验位的表达式,另外总校验位检验所有位置,所以是所有位置的奇/偶校验。
接着考虑纠错,因为每个校验位其实也是奇偶校验,所以纠错方法也和奇偶校验一样,都是在生成表达式的基础上再异或校验位得到校验值 S i S_{i} Si
拿出总校验位 S r , S_{r}, Sr,并把其他每个 S i S_{i} Si组合成二进制数 S r − 1 S r − 2 ⋯ S 1 S_{r - 1}S_{r - 2}\cdots S_{1} Sr−1Sr−2⋯S1,有如下结论:
-
S r = 0 & & S ( r − 1 ) S ( r − 2 ) ⋯ S 1 = 0 ⟺ S_{r} = 0\ \ \&\&\ {\ S}_{(r - 1)}S_{(r - 2)}\cdots S_{1} = 0 \Longleftrightarrow Sr=0 && S(r−1)S(r−2)⋯S1=0⟺数据码极大概率没错
-
S r = 1 & & S ( r − 1 ) S ( r − 2 ) ⋯ S 1 ≠ 0 ⟺ {\ S}_{r} = 1\ \ \&\&\ {\ S}_{(r - 1)}S_{(r - 2)}\cdots S_{1} \neq 0 \Longleftrightarrow Sr=1 && S(r−1)S(r−2)⋯S1=0⟺数据码极大概率一位错,且 S ( r − 1 ) S ( r − 2 ) ⋯ S 1 {\ S}_{(r - 1)}S_{(r - 2)}\cdots S_{1} S(r−1)S(r−2)⋯S1为出错位置
-
S r = 0 & & S ( r − 1 ) S ( r − 2 ) ⋯ S 1 ≠ 0 ⟺ {\ S}_{r} = 0\ \ \&\&\ {\ S}_{(r - 1)}S_{(r - 2)}\cdots S_{1} \neq 0 \Longleftrightarrow Sr=0 && S(r−1)S(r−2)⋯S1=0⟺数据码极大概率二位错
关于Hamming校验的遐思[试图揣测原理]:
不妨先设没有位置出错,此时每一位的奇/偶校验都正确,总校验位 G r = 0 G_{r} = 0 Gr=0,其余各个校验位 G r − 1 ⋯ G 1 = 0 ⋯ 0 G_{r - 1}\cdots G_{1} = 0\cdots 0 Gr−1⋯G1=0⋯0
若有一位出错,根据奇/偶校验规则,此时总校验位 G r = 1 G_{r} = 1 Gr=1,并且不妨设 H i H_{i} Hi出错,且 i i i二进制表达式为 A r − 1 A r − 2 ⋯ A 1 A_{r - 1}A_{r - 2}\cdots A_{1} Ar−1Ar−2⋯A1,则根据对应规则,若 A j = 1 A_{j} = 1 Aj=1则 P j P_{j} Pj所对应的校验值 S j S_{j} Sj一定会变成1[因为只有一位码出错了],所以有
S r − 1 S r − 2 ⋯ S 1 = A r − 1 A r − 2 ⋯ A 1 S_{r - 1}S_{r - 2}\cdots S_{1} = A_{r - 1}A_{r - 2}\cdots A_{1} Sr−1Sr−2⋯S1=Ar−1Ar−2⋯A1
即当一位错时,校验值对应的二进制数就是错误的hamming码[ H i H_{i} Hi,不是 D i D_{i} Di]下标,而且发现,即便是校验位出错,也可以精确指示!
再考虑二位出错的情况,根据奇偶校验规则,此时总校验位 G r = 0 G_{r} = 0 Gr=0,但是考虑 S r − 1 S r − 2 ⋯ S 1 S_{r - 1}S_{r - 2}\cdots S_{1} Sr−1Sr−2⋯S1,若设位 H i H_{i} Hi和 H j H_{j} Hj均出错,
且二进制表示分别为 A r − 1 ′ A r − 2 ′ ⋯ A 1 ′ A_{r - 1}^{'}A_{r - 2}^{'}\cdots A_{1}^{'} Ar−1′Ar−2′⋯A1′和 A r − 1 A r − 2 ⋯ A 1 A_{r - 1}A_{r - 2}\cdots A_{1} Ar−1Ar−2⋯A1,根据前述,当 A K o r A K ′ = 1 , A K o r A K ′ A_{K}orA_{K}^{'} = 1,A_{K}orA_{K}^{'} AKorAK′=1,AKorAK′会影响 S K S_{K} SK,根据异或的性质,同时影响[ A r − 1 = A r − 1 ′ = 1 A_{r - 1} = A_{r - 1}^{'} = 1 Ar−1=Ar−1′=1]/同时不影响[ A r − 1 = A r − 1 ′ = 0 A_{r - 1} = A_{r - 1}^{'} = 0 Ar−1=Ar−1′=0], S k S_{k} Sk不变仍为0,一个影响时 S k S_{k} Sk变为1,所以 S k = A r − 1 ⊕ A r − 1 ′ S_{k} = A_{r - 1} \oplus A_{r - 1}^{'} Sk=Ar−1⊕Ar−1′!得到:
S r − 1 S r − 2 ⋯ S 1 = A r − 1 A r − 2 ⋯ A 1 ⊕ A r − 1 ′ A r − 2 ′ ⋯ A 1 ′ = i ⊕ j S_{r - 1}S_{r - 2}\cdots S_{1} = A_{r - 1}A_{r - 2}\cdots A_{1} \oplus A_{r - 1}^{'}A_{r - 2}^{'}\cdots A_{1}^{'} = i \oplus j Sr−1Sr−2⋯S1=Ar−1Ar−2⋯A1⊕Ar−1′Ar−2′⋯A1′=i⊕j
即此时校验数值其实是两个错误位置的异或…[虽然没什么用=。=]
噢,还是有点用的,因为这恰恰能证明:当二位码错时,校验数值一定不为0!因为:
i ≠ j ⟺ i ⊕ j ≠ 0 i \neq j \Longleftrightarrow i \oplus j \neq 0 i=j⟺i⊕j=0
考虑延扩到3位及以上出错,每次校验数值就是出错位置的异或![嗯…其实没什么用]
问:所以为什么 S r = 0 & & S r − 1 S r − 2 ⋯ S 1 = 0 ⟺ S_{r} = 0\ \ \&\&\ {\ S}_{r - 1}S_{r - 2}\cdots S_{1} = 0\mathbf{\Longleftrightarrow} Sr=0 && Sr−1Sr−2⋯S1=0⟺数据码极大概率没错?
显然当多于2个位置异或为0且偶数个数出错时就会发生这种情况。其余情况的极大概率都是这个道理。
但是因为多于2位出错的概率应该是非常非常小的,所以Hamming校验码还是在允许的范围内可以实现一位纠错,二位检错0.0
问:总校验位出错了怎么办?
没错,这也是我想的问题,因为总校验位没有被 S r − 1 S r − 2 ⋯ S 1 {\ S}_{r - 1}S_{r - 2}\cdots S_{1} Sr−1Sr−2⋯S1表示,然而若是考虑总校验位出了错,那么 S r = 1 S_{r} = 1 Sr=1受影响,
S r − 1 S r − 2 ⋯ S 1 {\ S}_{r - 1}S_{r - 2}\cdots S_{1} Sr−1Sr−2⋯S1不受影响。相当于把总校验位编码为 00 ⋯ 00 00\cdots 00 00⋯00,即第0位。因此也完全符合上述推导![比如只有总校验位错,依旧会被当成是一位错,比较合理,并且由于没有第 0 0 0位,所以也不影响其他数据]