【python】Reed-solomon codes的二维码应用(五)

  (今天信息论测试。。。令人头秃。。。还是写文好啊,不要考试。。。今天被王宝宝提醒了,去了解了一下BCH码。。。感觉和从PPT认识的不是一个码啊。。。。雾)

        首先说一下找到的资料中的BCH码吧,它是普遍意义上的RS码,就是RS码都是BCH码。之前说过生成多项式,将 (x - α^n) 乘起来,也适用于BCH码,比如:

              g(x) = (x - α^0) (x - α^1) (x - α^2) (x - α^3) = 01 x^4 + 0f x^3 + 36 x^2 + 78 x^1 + 40

          下面这个函数计算对于给定数量m个校验符号的BCH码需要的生成多项式:

    

def rs_generator_poly(m):
    g = [1]
    for i in range(0,m):
       # g = gf_poly_mul(g, [1, gf_pow(2, i)]) # 指数运算,跟下面等效
       g = gf_poly_mul(g, [1, gf_exp[i]])  #列表[1, gf_exp[i]]指的是多项式x-2^i
    return g

       那么BCH是怎么检测一组数据错误的呢?

            我们之前知道  mod(生成子) 可以得到小于生成子的余数,对于BCH来说,它的过程如下,输入数据用000111101011001举个栗子:

                        00011
            -----------------
10100110111 ) 000111101011001
             ^   10100110111
              ---------------
                 010100110111
               ^  10100110111
                -------------
                  00000000000

    我们将除数10100110111看作G,被除数000111101011001看作F,商00011看作Q,余数00000000000看作R。

    从上式可以得出 F = Q*G +R

    但是我们想得到一个能够被G整除的多项式(或者二进制数),那么我可以 F^R = (Q*G+R)^R = Q*G +R -R = Q*G

    这里要解释一下,GF(p)的四则运算中异或可以代表加也可以是减。

    所以用python来描述就是:

def qr_check_format(fmt):
    g = 0x537  # = 0b10100110111 in python 2.6+
    for i in range(4,-1,-1):
        if fmt & (1 << (i+10)):    # 判断是否为1
            fmt ^= g << i
    return fmt

检查错误可以用:

encoded_format = (format<<10) ^ qr_check_format(format<<10)
若最后的编码信息 encoded_format不能被G整除,那么说明传输错误。

猜你喜欢

转载自blog.csdn.net/weixin_39878297/article/details/80114565