Java:RS编码和纠错解码


Java:RS编码和纠错解码

  1. package hustspy;  
  2.   
  3. public class RSCode {  
  4.     private static final int MM = 8;  
  5.     private static final int NN = 255;  
  6.     private static final int TT = 10;  
  7.     private static final int KK = 235;  
  8.       
  9.     private int[] pp = {101110001};  
  10.     private int[] alphaTo = new int[NN+1];  
  11.     private int[] indexOf = new int[NN+1];  
  12.     private int[] gg = new int[NN-KK+1];  
  13.     public int[] recd = new int[NN];  
  14.     public int[] data = new int[KK];  
  15.     public int[] bb = new int[NN-KK];  
  16.       
  17.     /** 
  18.      * 构造函数RSCode() 
  19.      * 初始化工作,生成GF空间和对应的生成多项式 
  20.      */  
  21.     public RSCode() {  
  22.         generateGF();  
  23.         generatePolynomial();  
  24.     }  
  25.       
  26.     /** 
  27.      * 函数generateGF() 
  28.      * 生成GF(2^MM)空间 
  29.      */  
  30.     public void generateGF() {  
  31.         int i, mask;  
  32.         mask = 1;  
  33.         alphaTo[MM] = 0;  
  34.         for(i=0; i<MM; i++){  
  35.             alphaTo[i] = mask;  
  36.             indexOf[alphaTo[i]] = i;  
  37.             if(pp[i] != 0){  
  38.                 alphaTo[MM] ^= mask;  
  39.             }  
  40.             mask <<= 1;  
  41.         }  
  42.           
  43.         indexOf[alphaTo[MM]] = MM;  
  44.         mask >>= 1;  
  45.           
  46.         for(i=MM+1; i<NN; i++){  
  47.             if(alphaTo[i-1] >= mask){  
  48.                 alphaTo[i] = alphaTo[MM] ^ ((alphaTo[i-1]^mask)<<1);  
  49.             }else{  
  50.                 alphaTo[i] = alphaTo[i-1]<<1;  
  51.             }  
  52.             indexOf[alphaTo[i]] = i;  
  53.         }  
  54.           
  55.         indexOf[0] = -1;  
  56.         //输出GF空间   
  57. /*      System.out.println("GF空间:"); 
  58.         for(i=0; i<=NN; i++){ 
  59.             System.out.println(i + "   " + alphaTo[i] + "   " + indexOf[i]); 
  60.         }*/  
  61.     }//GenerateGF   
  62.       
  63.     /** 
  64.      * 函数generatePolynomial() 
  65.      * 产生相应的生成多项式的各项系数 
  66.      */  
  67.     public void generatePolynomial() {  
  68.         int i, j;  
  69.         gg[0] = 2;  
  70.         gg[1] = 1;  
  71.         for(i=2; i<=NN-KK; i++) {  
  72.             gg[i] = 1;  
  73.             for(j=i-1; j>0; j--){  
  74.                 if(gg[j] != 0)  
  75.                     gg[j] = gg[j-1] ^ alphaTo[(indexOf[gg[j]]+i) % NN];  
  76.                 else  
  77.                     gg[j] = gg[j-1];  
  78.             }  
  79.             gg[0] = alphaTo[(indexOf[gg[0]]+i) % NN];  
  80.         }  
  81.           
  82.         //转换其到   
  83.         for(i=0; i<=NN-KK; i++) {  
  84.             gg[i] = indexOf[gg[i]];  
  85.         }  
  86.           
  87.         //输出生成多项式的各项系数   
  88.         System.out.println("生成多项式系数:");  
  89.         for(i=0; i<=NN-KK; i++) {  
  90.             System.out.println(gg[i]);  
  91.         }  
  92.     }  
  93.   
  94.     /** 
  95.      * 函数rsEncode() 
  96.      * RS编码 
  97.      */  
  98.     public void rsEncode() {  
  99.         int i, j;  
  100.         int feedback;  
  101.         for(i=0; i<NN-KK; i++) {  
  102.             bb[i] = 0;  
  103.         }  
  104.         for(i=KK-1; i>=0; i--) {  
  105.             //逐步的将下一步要减的,存入bb(i)   
  106.             feedback = indexOf[data[i] ^ bb[NN-KK-1]];  
  107.             if(feedback != -1) {  
  108.                 for(j=NN-KK-1; j>0; j--) {  
  109.                     if(gg[j] != -1)  
  110.                         bb[j] = bb[j-1] ^ alphaTo[(gg[j]+feedback)%NN];  
  111.                     else  
  112.                         bb[j] = bb[j-1];  
  113.                 }  
  114.                 bb[0] = alphaTo[(gg[0]+feedback)%NN];  
  115.             }else {  
  116.                 for(j=NN-KK-1; j>0; j--) {  
  117.                     bb[j] = bb[j-1];  
  118.                 }  
  119.                 bb[0] = 0;  
  120.             }  
  121.         }  
  122.         //输出编码结果   
  123.         System.out.println("编码结果:");  
  124.         for(i=0; i<NN-KK; i++) {  
  125.             System.out.println(bb[i]);  
  126.         }  
  127.     }  
  128.       
  129.     /** 
  130.      * 函数rsDecode() 
  131.      * RS解码 
  132.      */  
  133.     public void rsDecode() {  
  134.         int i, j, u, q;  
  135.         int[][] elp = new int[NN-KK+2][NN-KK];  
  136.         int[] d = new int[NN-KK+2];  
  137.         int[] l = new int[NN-KK+2];  
  138.         int[] u_lu = new int[NN-KK+2];  
  139.         int[] s = new int[NN-KK+1];  
  140.           
  141.         int count = 0;  
  142.         int syn_error = 0;  
  143.         int[] root = new int[TT];  
  144.         int[] loc = new int[TT];  
  145.         int[] z = new int[TT+1];  
  146.         int[] err = new int[NN];  
  147.         int[] reg = new int[TT+1];  
  148.           
  149.         //转换成GF空间   
  150.         for(i=0; i<NN; i++) {  
  151.             if(recd[i] == -1)  
  152.                 recd[i] = 0;  
  153.             else  
  154.                 recd[i] = indexOf[recd[i]];  
  155.         }  
  156.           
  157.         //求伴随多项式   
  158.         for(i=1; i<=NN-KK; i++) {  
  159.             s[i] = 0;  
  160.             for(j=0; j<NN; j++) {  
  161.                 if(recd[j] != -1)  
  162.                     s[i] ^= alphaTo[(recd[j]+i*j)%NN];  
  163.             }  
  164.             if(s[i] != 0)  
  165.                 syn_error = 1;  
  166.             s[i] = indexOf[s[i]];  
  167.         }  
  168.         System.out.println("syn_error=" + syn_error);  
  169.           
  170.         //如果有错,则进行纠正   
  171.         if(syn_error == 1) {  
  172.             //BM迭代求错误多项式的系数   
  173.             d[0] = 0;  
  174.             d[1] = s[1];  
  175.             elp[0][0] = 0;  
  176.             elp[1][0] = 1;  
  177.             for(i=1; i<NN-KK; i++) {  
  178.                 elp[0][i] = -1;  
  179.                 elp[1][i] = 0;  
  180.             }  
  181.             l[0] = 0;  
  182.             l[1] = 0;  
  183.             u_lu[0] = -1;  
  184.             u_lu[1] = 0;  
  185.             u = 0;  
  186.             do {  
  187.                 u++;  
  188.                 if(d[u] == -1) {  
  189.                     l[u+1] = l[u];  
  190.                     for(i=0; i<=l[u]; i++) {  
  191.                         elp[u+1][i] = elp[u][i];  
  192.                         elp[u][i] = indexOf[elp[u][i]];  
  193.                     }  
  194.                 }else {  
  195.                     q = u-1;  
  196.                     while((d[q]==-1) && (q>0)) {  
  197.                         q--;  
  198.                     }  
  199.                     if(q > 0) {  
  200.                         j = q;  
  201.                         do {  
  202.                             j--;  
  203.                             if((d[j] != -1) && (u_lu[q] < u_lu[j])) {  
  204.                                 q = j;  
  205.                             }  
  206.                         }while(j > 0);  
  207.                     }  
  208.                       
  209.                     if(l[u] > l[q] + u - q) {  
  210.                         l[u+1] = l[u];  
  211.                     }else {  
  212.                         l[u+1] = l[q] + u -q;  
  213.                     }  
  214.                       
  215.                     for(i=0; i<NN-KK; i++) {  
  216.                         elp[u+1][i] = 0;  
  217.                     }  
  218.                     for(i=0; i<=l[q]; i++) {  
  219.                         if(elp[q][i] != -1)  
  220.                             elp[u+1][i+u-q] = alphaTo[(d[u]+NN-d[q]+elp[q][i])%NN];  
  221.                     }  
  222.                       
  223.                     for(i=0; i<=l[u]; i++) {  
  224.                         elp[u+1][i] ^= elp[u][i];  
  225.                         elp[u][i] = indexOf[elp[u][i]];  
  226.                     }  
  227.                 }  
  228.                 u_lu[u+1] = u-l[u+1];  
  229.                   
  230.                 if(u < NN-KK) {  
  231.                     if(s[u+1] != -1) {  
  232.                         d[u+1] = alphaTo[s[u+1]];  
  233.                     }else {  
  234.                         d[u+1] = 0;  
  235.                     }  
  236.                       
  237.                     for(i=1; i<=l[u+1]; i++) {  
  238.                         if((s[u+1-i] != -1) && (elp[u+1][i] != 0)) {  
  239.                             d[u+1] ^= alphaTo[(s[u+1-i]+indexOf[elp[u+1][i]])%NN];  
  240.                         }  
  241.                     }  
  242.                     d[u+1] = indexOf[d[u+1]];  
  243.                 }  
  244.             }while((u<NN-KK) && (l[u+1]<=TT));  
  245.             u++;  
  246.             System.out.println("错误数目:" + l[u]);  
  247.               
  248.             //求错误位置,以及改正错误   
  249.             if(l[u] <= TT) {  
  250.                 for(i=0; i<= l[u]; i++) {  
  251.                     elp[u][i] = indexOf[elp[u][i]];  
  252.                 }  
  253.                 //求错误位置多项式的根   
  254.                 for(i=1; i<= l[u]; i++) {  
  255.                     reg[i] = elp[u][i];  
  256.                 }  
  257.                 count = 0;  
  258.                 for(i=1; i<=NN; i++) {  
  259.                     q = 1;  
  260.                     for(j=1; j<=l[u]; j++) {  
  261.                         if(reg[j]!=-1) {  
  262.                             reg[j] = (reg[j] + j)%NN;  
  263.                             q ^= alphaTo[reg[j]];  
  264.                         }  
  265.                     }  
  266.                       
  267.                     if(q==0) {  
  268.                         root[count] = i;  
  269.                         loc[count] = NN-i;  
  270.                         System.out.println("错误位置:" + loc[count]);  
  271.                         count++;                          
  272.                     }  
  273.                 }  
  274.                   
  275.                 //   
  276.                 if(count == l[u]) {  
  277.                     for(i=1; i<=l[u]; i++) {  
  278.                         if((s[i]!=-1) && elp[u][i]!=-1) {  
  279.                             z[i] = alphaTo[s[i]] ^ alphaTo[elp[u][i]];  
  280.                         }else if((s[i]!=-1) && (elp[u][i]==-1)) {  
  281.                             z[i] = alphaTo[s[i]];  
  282.                         }else if((s[i]==-1) && (elp[u][i]!=-1)) {  
  283.                             z[i] = alphaTo[elp[u][i]] ;  
  284.                         }else {  
  285.                             z[i] = 0;  
  286.                         }  
  287.                           
  288.                         for(j=1; j<i; j++) {  
  289.                             if((s[j]!=-1) && (elp[u][i-j]!=-1)) {  
  290.                                 z[i] ^= alphaTo[(elp[u][i-j] + s[j])%NN];  
  291.                             }  
  292.                         }  
  293.                           
  294.                         z[i] = indexOf[z[i]];  
  295.                     }  
  296.                       
  297.                     //计算错误图样   
  298.                     for(i=0; i<NN; i++) {  
  299.                         err[i] = 0;  
  300.                         if(recd[i] != -1)  
  301.                             recd[i] = alphaTo[recd[i]];  
  302.                         else  
  303.                             recd[i] = 0;  
  304.                     }  
  305.                     for(i=0; i<l[u]; i++) {  
  306.                         err[loc[i]] = 1;  
  307.                         for(j=1; j<=l[u]; j++) {  
  308.                             if(z[j] != -1)  
  309.                                 err[loc[i]] ^= alphaTo[(z[j]+j*root[i])%NN];  
  310.                         }  
  311.                           
  312.                         if(err[loc[i]] != 0) {  
  313.                             err[loc[i]] = indexOf[err[loc[i]]];  
  314.                             q = 0;  
  315.                             for(j=0; j<l[u]; j++) {  
  316.                                 if(j!=i)  
  317.                                     q += indexOf[1^alphaTo[(loc[j]+root[i])%NN]];  
  318.                             }  
  319.                             q = q%NN;  
  320.                             err[loc[i]] = alphaTo[(err[loc[i]]-q+NN)%NN];  
  321.                             recd[loc[i]] ^= err[loc[i]];  
  322.                         }  
  323.                     }  
  324.                 }else {  
  325.                     //错误太多,无法改正   
  326.                     for(i=0; i<NN; i++) {  
  327.                         if(recd[i] != -1)  
  328.                             recd[i] = alphaTo[recd[i]];  
  329.                         else  
  330.                             recd[i] = 0;  
  331.                     }  
  332.                 }  
  333.             }else {  
  334.                 //错误太多,无法改正   
  335.                 for(i=0; i<NN; i++) {  
  336.                     if(recd[i] != -1)  
  337.                         recd[i] = alphaTo[recd[i]];  
  338.                     else  
  339.                         recd[i] = 0;  
  340.                 }  
  341.             }  
  342.         }else {  
  343.             for(i=0; i<NN; i++) {  
  344.                 if(recd[i] != -1)  
  345.                     recd[i] = alphaTo[recd[i]];  
  346.                 else  
  347.                     recd[i] = 0;  
  348.             }  
  349.         }  
  350.     }  
  351.     /** 
  352.      * @param args 
  353.      */  
  354.     public static void main(String[] args) {  
  355.         // TODO Auto-generated method stub   
  356.         RSCode rs = new RSCode();  
  357.           
  358.         //输入要编码的数据   
  359.         int i;  
  360.         for(i=0; i<KK; i++) {  
  361.             rs.data[i] = 0;  
  362.         }  
  363.         for(i=0; i<10; i++) {  
  364.             rs.data[i] = 48 + i;  
  365.         }  
  366.           
  367.         //编码   
  368.         rs.rsEncode();  
  369.           
  370.         for(i=0; i<NN-KK; i++)  
  371.             rs.recd[i] = rs.bb[i];  
  372.         for(i=0; i<KK; i++)  
  373.             rs.recd[i+NN-KK] = rs.data[i];  
  374.           
  375.         //主动弄点错误   
  376.         for(i=0; i<6; i++)  
  377.             rs.recd[i] = 1;  
  378.           
  379.         //解码,纠错   
  380.         rs.rsDecode();  
  381.           
  382.         //输出正确编码和纠错后的编码   
  383.         System.out.println("i  data  recd");  
  384.         for(i=0; i<NN-KK; i++) {  
  385.             System.out.println(i + "   " + rs.bb[i] + "   " + rs.recd[i]);  
  386.         }  
  387.         for(i=NN-KK; i<NN; i++) {  
  388.             System.out.println(i + "   " + rs.data[i-NN+KK] + "   " + rs.recd[i]);  
  389.         }  
  390.     }  
  391.   
  392. }  

相关内容