⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs.c

📁 Reed-Solomoon 纠错算法C语言的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
  mb[2] = gadd6(gmult3(*(Syndrome+2), matrix[0], matrix[4]),
                gmult3(*(Syndrome+1), matrix[1], matrix[6]),
                gmult3(*(Syndrome+0), matrix[3], matrix[7]),
                gmult3(*(Syndrome+1), matrix[0], matrix[7]),
                gmult3(*(Syndrome+2), matrix[1], matrix[3]),
                gmult3(*(Syndrome+0), matrix[4], matrix[6]));

  data[0] = gdiv(ma, mb[0]);
  data[1] = gdiv(ma, mb[1]);
  data[2] = gdiv(ma, mb[2]);

  for (i=0; i<3; i++) {
    if (*(location+i) > ulCnt) i++;
    code[i] = *(codeword+(*(location+i)));
    data[i] = ((unsigned int)code[i]) ^ data[i];
    code[i] = (unsigned char) data[i];
    *(codeword+(*(location+i))) = code[i];
  }
}

//---------------------------------------------------------------------------------
//      Function name  :   Four_Error_Correction
//      Description    :   four error corrction
//      Parameter      :   unsigned int ulCnt
//                     :   unsigned int *Syndrome
//                     :   unsigned int *location
//                     :   unsigned int *codeword
//      Return value   :   NULL
//---------------------------------------------------------------------------------

void Four_Error_Correction(unsigned int ulCnt,
                           unsigned int *Syndrome, 
                           unsigned int *location,
                           unsigned char *codeword)
{
  unsigned int i;
  unsigned int parity[4];
  unsigned int loc[4];
  unsigned int matrix[16];
  unsigned int s[4];
  unsigned int ma;
  unsigned int mb[4];
  unsigned int data[4];
  unsigned char code[4];

  loc[0] = gexp[ulCnt+8-*location];
  loc[1] = gexp[ulCnt+8-*(location+1)];
  loc[2] = gexp[ulCnt+8-*(location+2)];
  loc[3] = gexp[ulCnt+8-*(location+3)];

  matrix[0]  = loc[0];
  matrix[1]  = loc[1];
  matrix[2]  = loc[2];
  matrix[3]  = loc[3];
              
  matrix[4]  = gmult(loc[0], loc[0]);
  matrix[5]  = gmult(loc[1], loc[1]);
  matrix[6]  = gmult(loc[2], loc[2]);
  matrix[7]  = gmult(loc[3], loc[3]);
              
  matrix[8]  = gmult3(loc[0], loc[0], loc[0]);
  matrix[9]  = gmult3(loc[1], loc[1], loc[1]);
  matrix[10] = gmult3(loc[2], loc[2], loc[2]);
  matrix[11] = gmult3(loc[3], loc[3], loc[3]);

  matrix[12] = gmult4(loc[0], loc[0], loc[0], loc[0]);
  matrix[13] = gmult4(loc[1], loc[1], loc[1], loc[1]);
  matrix[14] = gmult4(loc[2], loc[2], loc[2], loc[2]);
  matrix[15] = gmult4(loc[3], loc[3], loc[3], loc[3]);

  s[0] = gadd6(gmult4(matrix[0], matrix[5], matrix[10], matrix[15]),
               gmult4(matrix[0], matrix[6], matrix[11], matrix[13]),
               gmult4(matrix[0], matrix[7], matrix[9],  matrix[14]),
               gmult4(matrix[0], matrix[5], matrix[11], matrix[14]),
               gmult4(matrix[0], matrix[6], matrix[9],  matrix[15]),
               gmult4(matrix[0], matrix[7], matrix[10], matrix[13]));

  s[1] = gadd6(gmult4(matrix[1], matrix[4], matrix[10], matrix[15]),
               gmult4(matrix[1], matrix[6], matrix[11], matrix[12]),
               gmult4(matrix[1], matrix[7], matrix[8],  matrix[14]),
               gmult4(matrix[1], matrix[4], matrix[11], matrix[14]),
               gmult4(matrix[1], matrix[6], matrix[8],  matrix[15]),
               gmult4(matrix[1], matrix[7], matrix[10], matrix[12]));

  s[2] = gadd6(gmult4(matrix[2], matrix[4], matrix[9],  matrix[15]),
               gmult4(matrix[2], matrix[5], matrix[11], matrix[12]),
               gmult4(matrix[2], matrix[7], matrix[8],  matrix[13]),
               gmult4(matrix[2], matrix[4], matrix[11], matrix[13]),
               gmult4(matrix[2], matrix[5], matrix[8],  matrix[15]),
               gmult4(matrix[2], matrix[7], matrix[9],  matrix[12]));

  s[3] = gadd6(gmult4(matrix[3], matrix[4], matrix[9],  matrix[14]),
               gmult4(matrix[3], matrix[5], matrix[10], matrix[12]),
               gmult4(matrix[3], matrix[6], matrix[8],  matrix[13]),
               gmult4(matrix[3], matrix[4], matrix[10], matrix[13]),
               gmult4(matrix[3], matrix[5], matrix[8],  matrix[14]),
               gmult4(matrix[3], matrix[6], matrix[9],  matrix[12]));

  ma = gadd4(s[0], s[1], s[2], s[3]);


  s[0] = gadd6(gmult4(*(Syndrome+0), matrix[5], matrix[10], matrix[15]),
               gmult4(*(Syndrome+0), matrix[6], matrix[11], matrix[13]),
               gmult4(*(Syndrome+0), matrix[7], matrix[9],  matrix[14]),
               gmult4(*(Syndrome+0), matrix[5], matrix[11], matrix[14]),
               gmult4(*(Syndrome+0), matrix[6], matrix[9],  matrix[15]),
               gmult4(*(Syndrome+0), matrix[7], matrix[10], matrix[13]));

  s[1] = gadd6(gmult4(*(Syndrome+1), matrix[1], matrix[10], matrix[15]),
               gmult4(*(Syndrome+3), matrix[1], matrix[6],  matrix[11]),
               gmult4(*(Syndrome+2), matrix[1], matrix[7],  matrix[14]),
               gmult4(*(Syndrome+1), matrix[1], matrix[11], matrix[14]),
               gmult4(*(Syndrome+2), matrix[1], matrix[6],  matrix[15]),
               gmult4(*(Syndrome+3), matrix[1], matrix[7],  matrix[10]));

  s[2] = gadd6(gmult4(*(Syndrome+1), matrix[2], matrix[9],  matrix[15]),
               gmult4(*(Syndrome+3), matrix[2], matrix[5],  matrix[11]),
               gmult4(*(Syndrome+2), matrix[2], matrix[7],  matrix[13]),
               gmult4(*(Syndrome+1), matrix[2], matrix[11], matrix[13]),
               gmult4(*(Syndrome+2), matrix[2], matrix[5],  matrix[15]),
               gmult4(*(Syndrome+3), matrix[2], matrix[7],  matrix[9]));

  s[3] = gadd6(gmult4(*(Syndrome+1), matrix[3], matrix[9],  matrix[14]),
               gmult4(*(Syndrome+3), matrix[3], matrix[5],  matrix[10]),
               gmult4(*(Syndrome+2), matrix[3], matrix[6],  matrix[13]),
               gmult4(*(Syndrome+1), matrix[3], matrix[10], matrix[13]),
               gmult4(*(Syndrome+2), matrix[3], matrix[5],  matrix[14]),
               gmult4(*(Syndrome+3), matrix[3], matrix[6],  matrix[9]));

  mb[0] = gadd4(s[0], s[1], s[2], s[3]);

  s[0] = gadd6(gmult4(*(Syndrome+1), matrix[0], matrix[10], matrix[15]),
               gmult4(*(Syndrome+3), matrix[0], matrix[6],  matrix[11]),
               gmult4(*(Syndrome+2), matrix[0], matrix[7],  matrix[14]),
               gmult4(*(Syndrome+1), matrix[0], matrix[11], matrix[14]),
               gmult4(*(Syndrome+2), matrix[0], matrix[6],  matrix[15]),
               gmult4(*(Syndrome+3), matrix[0], matrix[7],  matrix[10]));

  s[1] = gadd6(gmult4(*(Syndrome+0), matrix[4], matrix[10], matrix[15]),
               gmult4(*(Syndrome+0), matrix[6], matrix[11], matrix[12]),
               gmult4(*(Syndrome+0), matrix[7], matrix[8],  matrix[14]),
               gmult4(*(Syndrome+0), matrix[4], matrix[11], matrix[14]),
               gmult4(*(Syndrome+0), matrix[6], matrix[8],  matrix[15]),
               gmult4(*(Syndrome+0), matrix[7], matrix[10], matrix[12]));

  s[2] = gadd6(gmult4(*(Syndrome+2), matrix[2], matrix[4],  matrix[15]),
               gmult4(*(Syndrome+1), matrix[2], matrix[11], matrix[12]),
               gmult4(*(Syndrome+3), matrix[2], matrix[7],  matrix[8]),
               gmult4(*(Syndrome+3), matrix[2], matrix[4],  matrix[11]),
               gmult4(*(Syndrome+1), matrix[2], matrix[8],  matrix[15]),
               gmult4(*(Syndrome+2), matrix[2], matrix[7],  matrix[12]));

  s[3] = gadd6(gmult4(*(Syndrome+2), matrix[3], matrix[4],  matrix[14]),
               gmult4(*(Syndrome+1), matrix[3], matrix[10], matrix[12]),
               gmult4(*(Syndrome+3), matrix[3], matrix[6],  matrix[8]),
               gmult4(*(Syndrome+3), matrix[3], matrix[4],  matrix[10]),
               gmult4(*(Syndrome+1), matrix[3], matrix[8],  matrix[14]),
               gmult4(*(Syndrome+2), matrix[3], matrix[6],  matrix[12]));

  mb[1] = gadd4(s[0], s[1], s[2], s[3]);

  s[0] = gadd6(gmult4(*(Syndrome+2), matrix[0], matrix[5],  matrix[15]),
               gmult4(*(Syndrome+1), matrix[0], matrix[11], matrix[13]),
               gmult4(*(Syndrome+3), matrix[0], matrix[7],  matrix[9]),
               gmult4(*(Syndrome+3), matrix[0], matrix[5],  matrix[11]),
               gmult4(*(Syndrome+1), matrix[0], matrix[9],  matrix[15]),
               gmult4(*(Syndrome+2), matrix[0], matrix[7],  matrix[13]));

  s[1] = gadd6(gmult4(*(Syndrome+2), matrix[1], matrix[4],  matrix[15]),
               gmult4(*(Syndrome+1), matrix[1], matrix[11], matrix[12]),
               gmult4(*(Syndrome+3), matrix[1], matrix[7],  matrix[8]),
               gmult4(*(Syndrome+3), matrix[1], matrix[4],  matrix[11]),
               gmult4(*(Syndrome+1), matrix[1], matrix[8],  matrix[15]),
               gmult4(*(Syndrome+2), matrix[1], matrix[7],  matrix[12]));

  s[2] = gadd6(gmult4(*(Syndrome+0), matrix[4], matrix[9],  matrix[15]),
               gmult4(*(Syndrome+0), matrix[5], matrix[11], matrix[12]),
               gmult4(*(Syndrome+0), matrix[7], matrix[8],  matrix[13]),
               gmult4(*(Syndrome+0), matrix[4], matrix[11], matrix[13]),
               gmult4(*(Syndrome+0), matrix[5], matrix[8],  matrix[15]),
               gmult4(*(Syndrome+0), matrix[7], matrix[9],  matrix[12]));

  s[3] = gadd6(gmult4(*(Syndrome+3), matrix[3], matrix[4],  matrix[9]),
               gmult4(*(Syndrome+2), matrix[3], matrix[5],  matrix[12]),
               gmult4(*(Syndrome+1), matrix[3], matrix[8],  matrix[13]),
               gmult4(*(Syndrome+2), matrix[3], matrix[4],  matrix[13]),
               gmult4(*(Syndrome+3), matrix[3], matrix[5],  matrix[8]),
               gmult4(*(Syndrome+1), matrix[3], matrix[9],  matrix[12]));

  mb[2] = gadd4(s[0], s[1], s[2], s[3]);


  s[0] = gadd6(gmult4(*(Syndrome+3), matrix[0], matrix[5],  matrix[10]),
               gmult4(*(Syndrome+2), matrix[0], matrix[6],  matrix[13]),
               gmult4(*(Syndrome+1), matrix[0], matrix[9],  matrix[14]),
               gmult4(*(Syndrome+2), matrix[0], matrix[5],  matrix[14]),
               gmult4(*(Syndrome+3), matrix[0], matrix[6],  matrix[9]),
               gmult4(*(Syndrome+1), matrix[0], matrix[10], matrix[13]));

  s[1] = gadd6(gmult4(*(Syndrome+3), matrix[1], matrix[4],  matrix[10]),
               gmult4(*(Syndrome+2), matrix[1], matrix[6],  matrix[12]),
               gmult4(*(Syndrome+1), matrix[1], matrix[8],  matrix[14]),
               gmult4(*(Syndrome+2), matrix[1], matrix[4],  matrix[14]),
               gmult4(*(Syndrome+3), matrix[1], matrix[6],  matrix[8]),
               gmult4(*(Syndrome+1), matrix[1], matrix[10], matrix[12]));

  s[2] = gadd6(gmult4(*(Syndrome+3), matrix[2], matrix[4],  matrix[9]),
               gmult4(*(Syndrome+2), matrix[2], matrix[5],  matrix[12]),
               gmult4(*(Syndrome+1), matrix[2], matrix[8],  matrix[13]),
               gmult4(*(Syndrome+2), matrix[2], matrix[4],  matrix[13]),
               gmult4(*(Syndrome+3), matrix[2], matrix[5],  matrix[8]),
               gmult4(*(Syndrome+1), matrix[2], matrix[9],  matrix[12]));

  s[3] = gadd6(gmult4(*(Syndrome+0), matrix[4], matrix[9],  matrix[14]),
               gmult4(*(Syndrome+0), matrix[5], matrix[10], matrix[12]),
               gmult4(*(Syndrome+0), matrix[6], matrix[8],  matrix[13]),
               gmult4(*(Syndrome+0), matrix[4], matrix[10], matrix[13]),
               gmult4(*(Syndrome+0), matrix[5], matrix[8],  matrix[14]),
               gmult4(*(Syndrome+0), matrix[6], matrix[9],  matrix[12]));

  mb[3] = gadd4(s[0], s[1], s[2], s[3]);

  data[0] = gdiv(ma, mb[0]);
  data[1] = gdiv(ma, mb[1]);
  data[2] = gdiv(ma, mb[2]);
  data[3] = gdiv(ma, mb[3]);

  for (i=0; i<4; i++) {
    if (*(location+i) > ulCnt) i++;
    code[i] = *(codeword+(*(location+i)));
    data[i] = ((unsigned int)code[i]) ^ data[i];
    code[i] = (unsigned char) data[i];
    *(codeword+(*(location+i))) = code[i];
  }
}

//---------------------------------------------------------------------------------
//      Function name  :   Find_Location
//      Description    :   find out error location
//      Parameter      :   unsigned int ulCnt
//                     :   unsigned int *Sigma
//                     :   unsigned int *Location
//      Return value   :   int
//--------------------------------------------------------------------------------- 
static unsigned int Find_Location (unsigned int ulCnt, unsigned int *Sigma, unsigned int *Location)
{
  unsigned int i, j;
  unsigned int x[4];
  unsigned int y;

  gexp[1024] = 1; 
  j = 0;
  for (i=0; i<ulCnt+8; i++) {
    x[0] = gexp[i+1023-ulCnt-8+1+1];
    x[1] = gmult(x[0], x[0]);
    x[2] = gmult(x[1], x[0]);
    x[3] = gmult(x[2], x[0]);
    y    = gadd4(gmult(*(Sigma+3), x[3]), gmult(*(Sigma+2), x[2]),
                 gmult(*(Sigma+1), x[1]), gmult(*(Sigma+0), x[0]));

    if (gadd(y, 1) == 0) {
      *(Location + j) = i;
      j++;
    }
  }
  return (j);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -