分享

DataMatrix编码3

 昵称27006061 2015-08-06
        DataMatrix ECC200采用Reed-Solomon纠错编码来为其提供纠错能力。RS编码的目标是计算出纠错码字,参考表http://blog.sina.com.cn/s/blog_4572df4e01019vhd.html来确定纠错码字的长度,考虑数据码字:66 67 68 69 70 142 129 56(“ABCDE12”通过ASCII编码),长度为8,则纠错码字长度为10,表示为RS(n,k)=RS(18, 8)。     设C(x)为数据码DataMatrix编码3——生成纠错码(RS编码)
  E(x)为纠错码字DataMatrix编码3——生成纠错码(RS编码),G(x)为生成多项式,则:
    DataMatrix编码3——生成纠错码(RS编码)
    由RS检验码生成多项式的一般形式为:DataMatrix编码3——生成纠错码(RS编码),则有:   DataMatrix编码3——生成纠错码(RS编码)
X分别取值DataMatrix编码3——生成纠错码(RS编码),得到方程组:
   DataMatrix编码3——生成纠错码(RS编码)
   然后用通过高斯消除法计算出E(x)={75 145 55 46 20 95 253 237 62 111},最终生成18位码字{66 67 68 69 70 142 129 56 75 145 55 46 20 95 253 237 62 111}。

算法如下:
int GfAdd(int a, int b){
  return  a ^ b;
}
//a * b
int GfMult(int a, int b){
   return (a == 0 || b == 0) ? 0 : alphaTo[(expOf[a] + expOf[b]) % nn];
}
// a * alpha^b
int GfMult2(int a, int b){
   return a== 0 ? 0 : alphaTo[(expOf[a] + b) % nn];
}
// a/b
int GfDiv(int a, int b) {
    if( a==0 )return 0;
    if( a==b )return 1;
    return expOf[a] > expOf[b] ?
    alphaTo[ expOf[a] - expOf[b] ] : alphaTo[ nn + expOf[a] - expOf[b] ] ;
}
void gaussion(){
    int total = 18;
    int data = 8;
    int error = 10;
    int* codes = new int[total];
    int* errors = new int[error];
    int* polys = new int[error*error];

    int i, j, k, d;       
    codes[0] = 66;
    codes[1] = 67;
    codes[2] = 68;
    codes[3] = 69;
    codes[4] = 70;
    codes[5] = 142;
    codes[6] = 129;
    codes[7] = 56;

    for( i=0;i         //sum of each polynomial
        int sum = 0;
        for( j=0;j             sum = GfAdd( sum, GfMult2( codes[j], (total-1-j)*(i+1) ) );
        errors[i] = sum;
        //polynomial matrix
        int index = i*error;
        for( j=0;j             polys[index+j] = alphaTo[j*(i+1)];
    }
    //gaussion elimination
    for( i=0;i         //diagonal postion
        d = i*error+i;
        int diagonal = polys[d];
        //diagonal --> 1
        int index = i*error;
        for( j=0;j             polys[index+j] = GfDiv( polys[index+j], diagonal );
        errors[i] = GfDiv( errors[i], diagonal );
        //otherrows - thisrow
        for( k=0;k             if( k!=i ){//another row
                int index2 = k*error;
                int coefficient = polys[index2+i];
                //each column( polynomial[k] = polynomial[k] - polynomial[i]*coefficient )
                for( int m=0;m                     polys[index2+m] = GfAdd( polys[index2+m], GfMult(coefficient, polys[index+m]) );
                }
                errors[k] =GfAdd( errors[k], GfMult(coefficient, errors[i]) );
            }
        }
    }
    //errors --> codes
    for( j=data++,i=error-1;i>=0;i-- )
        codes[j++] = errors[i];
}



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多