zoukankan      html  css  js  c++  java
  • 海明码

    海明码 收藏

    http://v.youku.com/v_show/id_XMTY5NjQ2OTI=.html
    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的K次幂个信息,1个信息用来指出“没有错误”,其余2K-1个指出错误发生在那一位,但也可能是校验位错误,故有N<=2的K次-1-K能被校验。
        海明码的编码规则:  
                1.每个校验位Ri被分配在海明码的第2的i次的位置上,  
                2.海明玛的每一位(Hi)是由多个/1个校验值进行校验的,被校验玛的  
                    位置玛是所有校验这位的校验位位置玛之和。
        一个例题:  
              4个数据位d0,d1,d2,d3,   3个校验位r0,r1,r2,对应的位置为:  
              d3   d2   d1   r2   d0   r1   r0   ======b7   b6   b5   b4   b3   b2   b1    
         
        校验位的取值,就是他所能校验的数据位的异或  
        b1为b3,b5,b7的异或,b2为b3,b6,b7       b4为b5,b6,b7 [/font]
      [font class="Apple-style-span" style="font-family: ����; font-size: 12px; line-height: normal; " id="bks_4dxtg15k"]
        海明玛传送到接受方后,将上三式的右边(b1,b2,b4)的逻辑表达式分别  
        异或上左边的值就得到了校验方程,如果上题采用偶校验  
        G1=b1   b3   b5   b7的异或  
        G2=b2   b3   b6   b7的异或  
        G3=b4   b5   b6   b7的异或
        若G1G2G3为001是第四位错  
        若为011是第六位错[/font]
      [font class="Apple-style-span" style="font-family: ����; font-size: 12px; line-height: normal;"]
      [/font]
      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位取反得正确码字:"0 0 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 9 10 11 12
      其中A,B,C,D分别插于2的k次方位(k=0,1,2,3)。码位分别为1,2,4,8。
      2)冗余码A,B,C,D的线性码位是:(相当于监督关系式)
      A->1,3,5,7,9,11;
      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)海明码为:"1 0 1 1 1 0 0 0 1 1 0 0"
      2)海明码的接收。
      例4.已知:接收的码字为:"1 0 0 1 1 0 0 0 1 1 0 0"(k=8)
      求:发送端的信息码。
      解:1)设错误累加器(err)初值=0
      2)求出冗余码的偶校验和,并按码位累加到err中:
      A=∑(1,0,1,0,1,0)=1 err=err+20=1
      B=∑(0,0,0,0,1,0)=1 err=err+21=3
      C=∑(1,1,0,0,0) =0 err=err+0 =3
      D=∑(0,1,1,0,0) =0 err=err+0 =3
      由err≠0可知接收码字有错,
      3)码字的错误位置就是错误累加器(err)的值3。
      4)纠错--对码字的第3位值取反得正确码字:
      "1 0 1 1 1 0 0 0 1 1 0 0"
      5)把位于2的k次方位的冗余码删除得信息码:"1 1 0 0 1 1 0 0

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lastsweetop/archive/2009/02/06/3865486.aspx

  • 相关阅读:
    如何将网格式报表打印成其它样式
    拥有与实力不相称的脾气是种灾难——北漂18年(23)
    8.8.1 Optimizing Queries with EXPLAIN
    mysql 没有rowid 怎么实现根据rowid回表呢?
    secondary index
    8.5.5 Bulk Data Loading for InnoDB Tables 批量数据加载
    mysql 中key 指的是索引
    8.5.4 Optimizing InnoDB Redo Logging 优化InnoDB Redo 日志
    8.5.3 Optimizing InnoDB Read-Only Transactions 优化InnoDB 只读事务
    8.5.1 Optimizing Storage Layout for InnoDB Tables InnoDB表的存储布局优化
  • 原文地址:https://www.cnblogs.com/ddlzq/p/1587683.html
Copyright © 2011-2022 走看看