问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

汉明校验·简明教程

创作时间:
作者:
@小白创作中心

汉明校验·简明教程

引用
CSDN
1.
https://m.blog.csdn.net/qq_46396470/article/details/139655995

汉明校验·简明教程

一、简介

汉明码是由 Richard Hamming 于 1950 年提出的,它具有 一位 纠错能力。

新增的汉明码校验位数应满足如下关系:

$$
2^{k} \geqslant n+k+1
$$

其中k为校验位位数,n位数据位数。

同时,我要强调的是汉明校验码的生成和校验都都两种原则,希望读者要对概念进行清晰地把握,不可一知半解:

$$
\text{汉明校验}
\begin{cases}
\text{按配偶原则的校验}\
\text{按配奇原则的校验}
\end{cases}
$$

这里直接阐述配偶和配奇的原则会比较抽象,我们放到具体的例子中来看,会更加易懂。

二、汉明码生成

  1. 确定校验位的个数

使用公式【 $2^{k} \geqslant n+k+1$ 】计算需要的k,其中 k 是检验位的数量,n 是数据位的数量;

举个逆子:原欲发送数据为:0101,此时我们可得n=4,则欲使

$2^k \geq 4+k+1$,k最小为3,即校验位个数为3。

  1. 安置校验位

我们规定:所有的校验位均放置在第 $2^n$ 位,也就是第1、2、4、8…位置等都是校验位,n从0开始,到k-1结束。

上例中k=3,则校验位的位置为:① $2^0=1$ ;② $2^1=2$ ;③ $2^2 =4$;即3位校验位放在最后要发送数据的第1,第2,第4个位置。

  1. 填充数据位

在非校验位的其他位置上填写真正的数据,填充后汉明码应如如下形式才对:

c 1 c_1
c 2 c_2
0
c 3 c_3
1
0
1

其中 $c_1$,$c_2$,$c_3$ 为待确定值的校验位。

  1. 画表计算校验位的值

我们的原则是,位置代表的二进制写好后, 每一行值为1的二进制位分为一组 ;然后,你会发现, 每一行校验位的位置是互斥的,只有一个校验位值为1 。也就是说,一个校验位会和若干数值位搭配,组成一组。

然后我们可以引出配奇和配偶原则了:

  • 配奇原则 :通过配置校验位 $C_j$,使得该组1的个数为 奇数 个,那么该组的各位进行异或操作必为1
  • 配奇原则 :通过配置校验位 $C_j$,使得该组1的个数为 偶数 个,那么该组的各位进行异或操作必为0

基于这样的发现,我们让 同一组各数据位进行异或 (两个二进制位异或,相同结果为0,不同为1)运算,按照 配偶原则 ,可得结果如下计算所示:

$$
\text{配偶原则}
\begin{cases}
C_1 \oplus 0 \oplus 1 \oplus 1 \Longrightarrow C_1=0\
C_2 \oplus 0 \oplus 0 \oplus 1 \Longrightarrow C_2=1\
C_3 \oplus 1 \oplus 0 \oplus 1 \Longrightarrow C_3=0
\end{cases}
$$

我们怎么理解上面的 $C_1 C_2 C_3$ 的取值?

【 $C_1 =0$】,是因为和它一组的数据位为011中有偶数个1,按照 配偶 原则,已经有偶数个1了,那我就不用管了;反之看第二组,【 $C_2 =1$】,这是因为第二组的数据位为001,只有奇数个1,按照配偶原则, $C_2$ 要置1才能保证第二组的1为偶数个。第三组同理。

刚好在这里把配奇的原则也讲一下,上面的 $C_1 C_2C_3$ 如果按照配奇原则会是多少呢?如下(如果你理解了配偶原则,配奇也很简单):

配奇原则
$$
\begin{cases}
C_1=\overline{0\oplus1\oplus1}\Longrightarrow C_1=1\
C_2=\overline{0\oplus0\oplus1}\Longrightarrow C_2=0\
C_3=\overline{1\oplus0\oplus1}\Longrightarrow C_3=1
\end{cases}
$$

可见,配奇的结果和配偶的结果刚好相反,这是因为异或操作的原理使得如果同一组中的数据位有偶数个1那么异或必为0,那么取反得校验位为1,那么组合起来(数据位有偶数个1,校验位有1个1,相加肯定是奇数咯)1的个数就是奇数个咯,完成奇配置。

  1. 书写完整的汉明码(配偶原则)

如第四步所计算,得到三个校验位的值后,将其值填充到校验位所对应的位置,将校验位的值填充进行,写出完整的汉明码,上例的汉明码为

1
2
3
4
5
6
7
C 1 C_1
C 2 C_2
P 1 P_1
C 3 C_3
P 2 P_2
P 3 P_3
P 4 P_4
0
1
0
0
1
0
1

三、汉明码校验

按照配偶原则,假设我们收到了0110101,已知这是一个传输出错的汉明码

按照配偶原则,假设我们收到了1001100,已知这是一个传输出错的汉明码

  1. 提取小组(配奇原则)

1001100总位数为7,则易推得校验位为3位;再根据分组规则,我们可得到三组数据如下:

  • 组1(1357)=1010
  • 组2(2367)=0000
  • 组3(4567)=1100
  1. 校验(配偶原则)

我们按照 配偶 原则,将原来的分组的各组各位 异或 运算,若为0则表示该位没出错,否则表示出错。

上述汉明码,我们进行如下计算:

$$
g1=0\oplus1\oplus1\oplus1=1\
g2=1\oplus1\oplus0\oplus1=1\
g3=0\oplus1\oplus0\oplus1=0
$$

欸,汉明码只能纠错1位,那到底是哪一位出错了呢?其实呀,这里并不能只管看出来,但是汉明码的神奇之处就在于,校验后的k位数值的二进制逆序组合转化为十进制表示的数值就是出错的位置。

如上例,计算完得到 $g_1g_2g_3$=110,我们逆序得到011,其十进制表示3,那么就是第三位出错了,瞅瞅是不是😁发的是0100101接收到的是0110101,确实是第3位出错了。

  1. 校验(配奇原则)

我们按照 配奇 原则,将原来的分组的各组各位 异或后取反 运算,若为0则表示该位没出错,否则表示出错。

上述汉明码,我们进行如下计算:

$$
g1=\overline{1\oplus0\oplus1\oplus0}=1\
g2=\overline{0\oplus0\oplus0\oplus0}=1\
g3=\overline{1\oplus1\oplus0\oplus0}=1
$$

此时得到 $g_1g_2g_3$=111,逆序得到111111十进制表示7,那么第七位出错了;检查一下呗,发的是1001101接收到的是1001100,确实是第7位出错了。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号