zoukankan      html  css  js  c++  java
  • 从本质看海明码——海明码的由来

     

    从本质看海明码——海明码的由来

    陈冠斌

    1.奇偶校验以及奇偶校验错误率

       奇偶校验:每一位(包括校验位)都进行异或运算,结果为0

    如x1~x7,y0 (数据位为x1~x7,校验位为y0),则

    x1 xor x2 xor ... xor x7 xor y0 = 0。

    错误概率:

    设共有n位,每一位的错误概率均为x

    则错误k位的概率:C(n,k) * xk * (1-x)n-k

    总概率:V = C(n,1) * x1 * (1-x)n-1 + C(n,3) * x3 * (1-x)n-3+ ...

    而:

    S =  C(n,0) * x0 * (1-x)n + C(n,1) * x1 * (1-x)n-1 + ... + C(n,n) * xn * (1-x)0 = [x+(1-x)]n = 1

    T =  C(n,0) * x0 * (1-x)n - C(n,1) * x1 * (1-x)n-1 + C(n,2) * x2 * (1-x)n-2 - ... =[(1-x)-x]n = (1-2x)n

    V = (S - T) / 2 = [ 1 - (1-2x)n ] /2 = x - 2*C(n,1)*x2 + 4*C(n,2)*x3 - ...

    由于x较小,x后面的项大致可以忽略,值约为x。

    这与C(n,1) * x1 * (1-x)n-1 把1-x估计为1时的值时一致的。

    如x=0.00001,x2过于小了,所以一般传输错误的话,只考虑一位错误。

    2. 设计可以检验错误位数的方法(海明码的由来)

    若想知道错误的位置,则通过多个式子共同判断,假设数据位为x1~xn-1,全体域为F,错误位置为xc,第i(0<=i<m-1)个式子的数据位集合为Si,数据位进行异或运算,结果为yi,有:

       xor {S0} = y0

       xor {S1} = y1

          ……

       xor {Sm-1} = ym-1

    这些式子和方程式不一样,它比方程式多了一个约束条件,这个约束条件是x1~xn有且仅有一个值为1,其它值为0。

    对于值为1的第k个式子,等价为xc∈Sk,存在错误位;

    对于值为0的第k个式子,等价为xc∈`Sk

    m个式子中,每个式子可以把全体域分为两部分,Sk和`Sk(即F-Sk),根据不同的yk值,选择其中一个集合。

       错误位属于集合S0(`S0) ∩ S1(`S1) ∩ …∩ Sm-1(`Sm-1)。

     

       如:x1,x2,x3为数据位,y0,y1为检验位。

          x1 xor x3 = y0 = 0 (i)

          x2 xor x3 = y1 = 1 (ii)

    即S0={x1,x3},y0=0 ; S1={x2,x3},y1=1。

       错误位属于集合{x2}∩{x2,x3}={x2},即错误位为x2

      

       设n位二进制数ym-1ym-2…y0为Y。对于任意一个数据位,它要么在Sk中,标记yk=1;要么在`Sk中,标记yk=0。对于数据位x1~xm-1的任意一个数,若它表示m位二进制数zm-1m-2…z0,则第k个式子对应的值yk为zk。其中数据位x1~xn-1对应的ym-1ym-2…y0的值都不相等,共有2-1种可能性,其中若ym-1ym-2…y0的值都为0,则代表无错误位。

    以下是n=3时的情况:

    (4)   x4 xor x5 xor x6 xor x7 = y2

    (2)   x2 xor x3 xor x6 xor x7 = y1

    (1)   x1 xor x3 xor x5 xor x7 = y0

    y2

    0

    0

    0

    0

    1

    1

    1

    1

    y1

    0

    0

    1

    1

    0

    0

    1

    1

    y0

    0

    1

    0

    1

    0

    1

    0

    1

    Y

    0

    1

    2

    3

    4

    5

    6

    7

    Error

    None

    x1

    x2

    x3

    x4

    x5

    x6

    x7

    对于上述方式,ym-1,ym-2,…,y0的位置还没确定下来。可以把ym-1,ym-2,…,y0放在第2m-1,2m-2,…,20位,所有yk所在位置的值加起来,就是Y的值,即XY数据位发生错误(如果XY=0,则没有数据位发生错误)。其中第2m-1,2m-2,…,20位有且只有一次参与了运算,把它们当作校验位,可认为x2^(m-1),x2^(m-2),…,x的值为0。把x1,x2,x4…用x1+2^n,x2+2^n,x4+2^n…替代。如上文:

    数据位为x3,x5,x6,x7,x9,x10,x11,x12

    (4)   x12 xor x5 xor x6 xor x7  = y2

    (2)   x10 xor x11 xor x6 xor x7 = y1

    (1)   x9 xor x3 xor x5 xor x7  = y0

    此时的这个方式称为海明码校验。

      

    针对计算,比较有规律,可以通过硬件电路提高速度。

    数据位:

    从1开始,检验1位,跳转1位;[1,3,5,7,9,11……]

    从2开始,检验2位,跳转2位;[2,3,6,7,10,11,……]

    从4开始,检验4位,跳转4位;[4,5,6,7,12,13,14,15,……]

    ……

    检验位:

    每次乘以2,即二进制数每次左移一位。

    方式

    检验码

    检验位数

    总位数

    参与运算总次数

    海明码校验

    n

    2n -1

    2n -1+n

    n*2n-1

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/cmyg/p/8877515.html
Copyright © 2011-2022 走看看