海明码

海明码

  1.海明码的概念

  海明码是一种可以纠正一位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。它必需满足以下关系式:

  2^r>=n+1 或2^r>=k+r+1

  海明码的编码效率为:

  R=k/(k+r)

  式中 k为信息位位数

  r为增加冗余位位数

  2.海明码的原理

  在数据中间加入几个校验码,码距均匀拉大,将数据的每个二进制位分配在几个奇偶校验组里,当某一位出错,会引起几个校验位的值发生变化。

  海明不等式:

  校验码个数为K,2个信息,1个信息用来指出“没有错误”,其余2-1个指出错误发生在那一位,但也可能是校验位错误,故有N<=2-1-K能被校验。

  海明码的编码规则:

  1.每个校验位Ri被分配在海明码的第2位置上,

  2.海明码的每一位(Hi)是由多个/1个校验值进行校验的,被校验码的

  位置码是所有校验这位的校验位位置码之和。

  一个例题:

  4个数据位d0,d1,d2,d3,3个校验位r0,r1,r2,对应的位置为:

  d3 d2 d1 r2 d0 r1r0 ======b7 b6 b5 b4 b3 b2 b1

  校验位的取值,就是他所能校验的数据位的异或

  b1为b3,b5,b7的异或,b2为b3,b6,b7b4为b5,b6,b7

  海明v传送到接受方后,将上三式的右边(b1,b2,b4)的逻辑表达式分别

  异或上左边的值就得到了校验方程,如果上题采用偶校验

  G1=b1 b3 b5 b7的异或

  G2=b2 b3 b6 b7的异或

  G3=b4 b5 b6 b7的异或

  若G1G2G3为001是第四位错

  若为011是第六位错

  3.海明码的生成与接收

  特注:以下的+均代表异或

  方法一:

  1)海明码的生成。

  例1.已知:信息码为:"0010"。海明码的监督关系式为:

  S2=a2+a4+a5+a6

  S1=a1+a3+a5+a6

  S0=a0+a3+a4+a6

  求:海明码码字。

  解:1)由监督关系式知冗余码为a2a1a0。

  2)冗余码与信息码合成的海明码是:"0010a2a1a0"。

  设S2=S1=S0=0,由监督关系式得:

  异或运算:

  a2=a4+a5+a6=1

  a1=a3+a5+a6=0

  a0=a3+a4+a6=1

  因此,海明码码字为:"0010101"

  2)海明码的接收。

  例2.已知:海明码的监督关系式为:

  S2=a2+a4+a5+a6

  S1=a1+a3+a5+a6

  S0=a0+a3+a4+a6

  接收码字为:"0011101"(n=7)

  求:发送端的信息码。

  解:1)由海明码的监督关系式计算得S2S1S0=011。

  2)由监督关系式可构造出下面错码位置关系表:

  S2S1S0

  000

  001

  010

  100

  011

  101

  110

  111

  错码位置

  无错

  a0

  a1

  a2

  a3

  a4

  a5

  a6

  3)由S2S1S0=011查表得知错码位置是a3。

  4)纠错--对码字的a3位取反得正确码字:"00 1 0 1 0 1"

  5)把冗余码a2a1a0删除得发送端的信息码:"0010"

  方法二:(不用查表,方便编程)

  1)海明码的生成(顺序生成法)。

  例3.已知:信息码为:"1 1 0 0 1 1 0 0 " (k=8)

  求:海明码码字。

  解:1)把冗余码A、B、C、…,顺序插入信息码中,得海明码

  码字:" A B 1 C 1 0 0 D 1 1 0 0 "

  码位: 1 2 3 4 5 6 7 8 910 11 12

  其中A,B,C,D分别插于2的k次方位(k=0,1,2,3)。码位分别为1,2,4,8。

  2)冗余码A,B,C,D的线性码位是:(相当于监督关系式)

  监督关系式的推导:

  D C B A

  1 0 0 0 1

  2 0 0 1 0

  3 0 0 1 1

  4 0 1 0 0

  5 0 1 0 1

  6 0 1 1 0

  7 0 1 1 1

  8 1 0 0 0

  9 1 0 0 1

  10 1 0 1 0

  11 1 0 1 1

  12 1 1 0 0

  根据上面表格得到 A B CD

  需要说明的是公式中参与计算的是表格中出现"1"的那个位 右边是数据位的二进制数,公式中的"+"表示异或

  故此有如下表达式:

  A->1,3,5,7,9,11;(这里的13 5 7 9 11均为A那一列出现1的位)

  B->2,3,6,7,10,11;

  C->4,5,6,7,12;(注5=4+1;6=4+2;7=4+2+1;12=8+4)

  D->8,9,10,11,12。

  3)把线性码位的值的偶校验作为冗余码的值(设冗余码初值为0):

  A=∑(0,1,1,0,1,0)=1

  B=∑(0,1,0,0,1,0)=0

  C=∑(0,1,0,0,0) =1

  D=∑(0,1,1,0,0) =0

  4)海明码为:"10 1 1 1 0 0 0 1 1 0 0"

  2)海明码的接收。

  例4.已知:接收的码字为:"10 0 1 1 0 0 0 1 1 0 0"(k=8)

  求:发送端的信息码。

  解:1)设错误累加器(err)初值=0

  2)求出冗余码的偶校验和,并按码位累加到err中:

  A=∑(1,0,1,0,1,0)=1err=err+2^0=1

  B=∑(0,0,0,0,1,0)=1err=err+2^1=3

  C=∑(1,1,0,0,0) =0err=err+0 =3

  D=∑(0,1,1,0,0) =0err=err+0 =3

  由err≠0可知接收码字有错,

  3)码字的错误位置就是错误累加器(err)的值3。

  4)纠错--对码字的第3位值取反得正确码字:

  "1 0 1 1 1 0 00 1 1 0 0"

  5)把位于2的k次方位的冗余码删除得信息码:"1 1 0 0 1 1 0 0"

 

 

 

 

首先我们知道,海明码是在信息码中的特定位置插入校验码,达到检查纠正错误的目的。
这些校验码的插入的特定位置是:1、2、4、8、16… ,(2的n次方)
例如接收的码字是1000010,则红色字体部分为校验码 (注意题目要求数据的排列顺序是从左到右还是 从右到左,这里我们以楼主的题目为例,排列顺序是从右到左)
既然知道了哪些是校验码,那么这些校验码怎么检查出数据有错呢?
根据海明码的原理(其实就是题目中的三个监督关系式):
处于位置1的校验码负责检查码字中 处于位置13579111315…的数据
处于位置2的校验码负责检查码字中 处于位置236710111415…的数据
处于位置4的校验码负责检查码字中 处于位置456712131415…的数据


怎么个检查法呢?因为海明码一般用偶校验,所以我们只要数相应的1的数量就知道错误出在哪里了,对应位置1的数量是偶数个,这些位置的数据(包括校验码)都没差错,对应位置1的数量是奇数个,这些位置的数据(包括校验码)存在差错。

以楼主的题目为例吧,先将给出的码字1000010按位置排好
⑦  ⑥  ⑤  ④  ③  ②  ①  ←带圆圈的数字表示位置
1   0   0   0   0   1  0   ←接受到的码字

看①、③、⑤、⑦,一共有奇数个1(位置⑦上有一个1),不是偶数,存在差错。
再看②③、⑥⑦,  一共有偶数个1(位置⑦、②上有各一个1),是偶数,不存在错误。
最后看④⑤⑥⑦,  一共有奇数个1(位置⑦上有一个1),不是偶数,存在差错。

发现差错,将位置⑤的0改成1,再数,三个关系式都是偶数个1了。这样一来,我们就能确定发送的码的正确写法应该是 1010010了
这里有个规律,一般来说,哪两个校验码校验出了错误,只要将他们的位置值相加,就知道是哪个位置出错了。( 本题中①+④=⑤ )

另外,如果将①、④位置的0都改为1(意思是两个校验码都出现了错误),似乎也能符合关系式,期待高人解答。或许这个题目就有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值