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

二.译码原理

        之前编码过程可以得到以下矩阵:

        

            那么我们如何恢复数据呢?这就需要对RS码译码了。从编码矩阵中删去丢失数据块和丢失编码块对应行。假设D1、C2丢失,根据上图所示RS编码运算等式,我们得到如下B'以及等式:

            

         上图中我们丢失了D1、D4以及C2,对应的生成矩阵B变成了B',那么我们如何由B’和错误的RS码得到原数据矩阵D呢?

         这就需要我们对B'求逆矩阵B'-1了,我们可以使用下面的方法求出D:

                

             最后就可以得到原数据D啦:

               

            我们已知错误的RS码,那么我们如何得到矩阵B呢?

             首先我们得计算出伴随式,这个方法需要我们通过Berlekamp-Massey等算法分析哪些字符是错误的,或者快速判断输入的信息是否完全损坏。

               我们之前总结了RS的编码原理,最后的RS码= Q(X)* G(X),即它能被G(X)整除,我们又已知生成多项式G(X) = (x-a^0)(x-a^1)(x-a^2)......(x-a^(m-1)),当x= a^0,a^1,a^2,a^2.......,a^(m-1)时G(x) = 0,所以RS码多项式也为零,这说明a^0,a^1,a^2,a^2.......,a^(m-1)都是RS码多项式的根。因此如果读取到的RS数据没有损坏,结果应当是0。如果不是,这些伴随式里就包含了完成纠错所必需的信息。计算伴随式的实现很简单,代码如下:

def rs_calc_syndromes(msg, nsym):
    '''给定原信息和纠错标记数,计算伴随式
    从数学角度看,这个过程就是一个傅里叶变换 (Chien搜索刚好相反).
    '''    
    synd = [0] * nsym
    for i in range(0, nsym):
        synd[i] = gf_poly_eval(msg, gf_pow(2,i))
    return [0] + synd

  

猜你喜欢

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