有关海明码原理的遐思...

前言:

网上好像很少有关于Hamming的原理的阐述?

大概是过于简单以至于大家都不屑于写罢0.0

但还是为了以后或许也有人像我一样疑惑,所以写一写[搬一搬实验报告],来交流一下0.0

Hamming校验码:

海明校验码通过在数据间插入 r r r位校验码,并且在一位错时能够判断出到底是哪一位错[包括校验位],实现纠错的校验码。

数据位每一位的改变会引起至少3位校验位的改变[总校验位、二进制数对应的位置(至少2个)],所以码距为4。

假设一共需要 r r r位校验位,其中一位是总校验位,剩余 r − 1 r - 1 r1位需要能表示所有除了总校验位的其他2进制位置。

则有:

k + r − 1 < 2 r − 1 k + r - 1 < 2^{r - 1} k+r1<2r1

k + r ≤ 2 r − 1 k + r \leq 2^{r - 1} k+r2r1

并且把每一个校验位 P i P_{i} Pi放到下标为 1 ≪ ( i − 1 ) 1 \ll (i - 1) 1(i1)的位置 H 1 ≪ ( i − 1 ) H_{1 \ll (i - 1)} H1(i1)上,剩余位置嵌入数据位。每一位 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} Sr1Sr2S1,有如下结论:

  1. 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(r1)S(r2)S1=0数据码极大概率没错

  2.   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(r1)S(r2)S1=0数据码极大概率一位错,且   S ( r − 1 ) S ( r − 2 ) ⋯ S 1 {\ S}_{(r - 1)}S_{(r - 2)}\cdots S_{1}  S(r1)S(r2)S1为出错位置

  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} \neq 0 \Longleftrightarrow  Sr=0  &&  S(r1)S(r2)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 Gr1G1=00

若有一位出错,根据奇/偶校验规则,此时总校验位 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} Ar1Ar2A1,则根据对应规则,若 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} Sr1Sr2S1=Ar1Ar2A1

即当一位错时,校验值对应的二进制数就是错误的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} Sr1Sr2S1,若设位 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}^{'} Ar1Ar2A1 A r − 1 A r − 2 ⋯ A 1 A_{r - 1}A_{r - 2}\cdots A_{1} Ar1Ar2A1,根据前述,当 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 Ar1=Ar1=1]/同时不影响[ A r − 1 = A r − 1 ′ = 0 A_{r - 1} = A_{r - 1}^{'} = 0 Ar1=Ar1=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=Ar1Ar1!

得到:

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 Sr1Sr2S1=Ar1Ar2A1Ar1Ar2A1=ij

即此时校验数值其实是两个错误位置的异或…[虽然没什么用=。=]

噢,还是有点用的,因为这恰恰能证明:当二位码错时,校验数值一定不为0!因为:

i ≠ j ⟺ i ⊕ j ≠ 0 i \neq j \Longleftrightarrow i \oplus j \neq 0 i=jij=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  &&  Sr1Sr2S1=0数据码极大概率没错?

显然当多于2个位置异或为0且偶数个数出错时就会发生这种情况。其余情况的极大概率都是这个道理。

但是因为多于2位出错的概率应该是非常非常小的,所以Hamming校验码还是在允许的范围内可以实现一位纠错,二位检错0.0

问:总校验位出错了怎么办?

没错,这也是我想的问题,因为总校验位没有被   S r − 1 S r − 2 ⋯ S 1 {\ S}_{r - 1}S_{r - 2}\cdots S_{1}  Sr1Sr2S1表示,然而若是考虑总校验位出了错,那么 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}  Sr1Sr2S1不受影响。相当于把总校验位编码为 00 ⋯ 00 00\cdots 00 0000,即第0位。因此也完全符合上述推导![比如只有总校验位错,依旧会被当成是一位错,比较合理,并且由于没有第 0 0 0位,所以也不影响其他数据]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值