码迷,mamicode.com
首页 > 其他好文 > 详细

汉明码

时间:2020-04-03 16:31:47      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:等价   比较   AMM   出错   通过   过程   nbsp   怎样   解释   

例:计算原始信息位为0110101按配偶原则配置对应的海明校验码?(奇校验的话校验位是组内所有数异或的非)

1、确认需要的校验位数
海明校验码有个公式:2^r -1 >= k + r

因为题目信息位为7位,所以r = 4.

2、校验码所插入位置
海明校验码是放在2的幂次位上的,即“1,2,4,8,16,32······”;并不是像CRC样全求出余数然后放在低位。

错误的插入:

位置 1 2 3 4 5 6 7 8 9 10 11
数据      1     0 1 0    1  1  0
 

正确的插入:

位置

       1 2 3 4 5 6 7 8 9 10 11
数据      0    1 1 0    1  0   1
 

很容易看出一种是从右往左插入,另一种是从左往右。

注:空白部分为校验位位置

确认数据位由那几个校验位校正


 通过这个图可以看出每个校验码校验了那几个位置。

P1:3,5,7,9,11

P2:3,6,7,10,11

P3:5,6,7

P4:9,10,11

P1:0+1+0+1+1,如果海明校验码采用偶校验,则P1为1,奇校验为取非为0

P2:0+1+0+0+1,偶校验,则P2为0,奇校验为1

P3:1+1+0,偶校验,则P3为0,奇校验为1

P4:1+0+1,偶校验,则P4为0,奇校验为1

将校验位添加入表中既为对应的海明校验码。

位置

1 2 3 4 5 6 7 8 9 10 11
数据 1 0 0 0 1 1 0 0 1 0 1
这里我用的是偶校验,所以结果为:10001100101

 

首先要知道“奇偶校验”这个东西。这个东西很简单。

我们约定一串编码里1的个数是偶数个,那么这串编码里携带的信息就是对的,否则就是错的。

我们可以在开头对这串编码加一位校验码实现奇偶校验。

for example:

我们想传输10010这串码,那么在传输的时候,就传010010,其中在开头的0就是校验位。

我们想传输10000这串码,那么在传输的时候,就传110000,其中在开头的1就是校验位。

两个例子的1的个数都是偶数。

 

 

 

首先汉明码是采用奇偶校验的码。它采用了一种非常巧妙的方式,把这串数字分了组,通过分组校验来确定哪一位出现了错误。

第一个问题,检错原理。
它的原理可以通过一个例子来说明。

因为在传输过程中,最最最可能的是只错一位数据,所以,

汉明码默认一串数据只错一位
我们假设想传这一列数据1234567,我们先把他们分个组(当然怎么分组的我们等会儿再讨论),如图。



P1组:1,2,3,4

P2组:2,4,5,7
P3组:3,4,6,7

 

只错一个数据。
比如,这次的情况是,P1组中有一个错了,P2组没错,P3组没错。

嗯,好,现在我们看图,我们看,

P2组里谁都没错,可以排除2,4,5,7这几个数据;

P3组里谁都没错,可以排除3,4,6,7这几个数据;

那么P1组里我们知道是有错的,那经过P2,P3组的对数据的排除,我们很容易知道,是1这个数据有了错误。

 

好,那么错一个组的情况我们讨论过了,那么错两组的情况呢?

假设P1中有个错了,P2中有个错了,P3全对了

好,同时属于P1和P2而且不属于P3的数据是哪个?对,看图,是2这个数据。

 

好,那么三个组的情况呢?

同时属于P1、P2、P3组的数据是谁呢?对,是4这个数据。

 

好,这种分组,这种方式是不是很爽呢?汉明码就是利用了这种分组,这样它就可以很简单地分辨出哪一个数据出错,这种可以检测出数据出错的能力叫做“检错”,一定要和“纠错”分开,检错只能检测到错误不一定能改过来错误,纠错是可以的。

 

 

 

 

下一个问题,校验码的位置。
这是规定,记住它,在采用汉明码的一串数据中,2的i次方的位置上,我们放校验码。

校验码是1,或者是0,使得校验码所在的组的1的个数是偶数。

如图:

绿色的位置是放校验码的地方,1,2,4,8,16……等等,2的i次方的地方。

 

 
 
 
下一个问题,汉明码是怎么分组的呢?
我们看到,其实有些数据是既在P1组又在P2组的。

怎么分组,这个要记住,没啥原理了哈哈。

要预先做的工作是,

把表示位置的这个数,转化成二进制数。

也就是,

第1个位置,变成第0001个位置;

第2个位置,变成第0010个位置;

第3个位置,变成第0011个位置;

第4个位置,变成第0100个位置;

第5个位置,变成第0101个位置;

第6个位置,变成第0110个位置;

 

那么,规定来了,

凡是位置符合这种形式的,XXX1,归到P1;

凡是位置符合这种形式的,XX1X,归到P2;

凡是位置符合这种形式的,X1XX,归到P3;

凡是位置符合这种形式的,1XXX,归到P4;

那么显然各个校验码也被分到各个组里面去了,而且,每个组只有一个校验码。(这个,太简单我就不解释了……)

那么组分好了,校验码的值也就确定下来了。(数组内有多少个1就可以了)

 

好,为了防止你不明白,我举个例子哈。

我们想传这一组码:XX1X101X011

一共11位。

标X的是校验码的位置,我们暂时不知道它的值是多少。

位置在1,3,5,7,9,11的数据进到P1组。(你转换一下这些位置的二进制,就知道他们的位置符合XXX1)

位置在2,3,6,7,10,11的数据进到P2组。(位置符合XX1X)

位置在4,5,6,7的数据进到P3组。(位置符合X1XX)

位置在8,9,10,11的数据进到P4组。(位置符合1XXX)

那么确定了分组,校验码的值也就顺便确定下来了。

这样整个串的码就确定下来了。

 

现在知道汉明码是怎么分组的了吗?对,通过位置数的性质。

 

 

好,下两个问题。

从发送者的角度,我该怎么发用上汉明码的数据呢?
首先我们考虑我们到底要发多少位。假设校验码一共k位,我们想发的原始数据一共n位,要注意我们的校验码也要校验校验码错没错,所以,要校验的一共有k+n位,k位校验码可以检测2^k位的码,但是不能所以,校验码的位数要满足这个公式

2^k>k+n,或者说2^k-1>=k+n。

这样我们就能算出来要用多少校验码了。

其实哈,实际上不用这么麻烦,教科书总是那么复杂。假设你想发101011111,那你就先占下校验位,然后空着的位填你想发的数据就好。

占下1,2,4,8……等等位,看能占下多少位就可以,当然这个手算比较直观啦哈。

好,我假设你填完了,然后分好组,也确定了校验位的值了,那么发送出去啦~

嘟嘟嘟~~~~~~~

 

 

我是接收者,我收到了一串汉明码,怎样用汉明码的性质来检错呢?
1.分组,分好P1,P2,P3……

2.分别对每个组校验,没有错的给它0,有错的给0.

3.记得第一个问题,汉明码的原理吗?你可能会想,3个组,我们可以画3个圈,可是100个组,这个圈可就太难画了啊!

这里有一个等价的方法,hamming真的太聪明了。

把P从大到小排列起来,得到一串1010,

for example:

         组别:        P5   P4   P3   P2   P1

         标志:         1      0      1     0     1

从大到小排列起来,标志排成了一串一零串。这个数就是出错的数据的位置。
本例中,10101位置上的位错了,换成十进制是第21个位置上的数错了。

然后,我们发现了它错误的位置,又因为它是二进制的,不是0就是1,所以,可以顺便把它纠错。

汉明码

标签:等价   比较   AMM   出错   通过   过程   nbsp   怎样   解释   

原文地址:https://www.cnblogs.com/bomily0212/p/12627105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!