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

📄 berlekamp.c

📁 rs
💻 C
字号:
//#include <stdio.h>#include "rs.h"static int Lambda[MAXDEG];static int Omega[MAXDEG];static unsigned char ErrorLocs[128];static int NErrors;static unsigned char ErasureLocs[128];static int NErasures;static int compute_discrepancy(int lambda[], int S[], int L, int n);static void init_gamma(int gamma[]);static void compute_modified_omega (int NPAR);static void mul_z_poly (int src[]);void Modified_Berlekamp_Massey (int NPAR){	  int n, L, L2, k, d, i;  int psi[MAXDEG], psi2[MAXDEG], D[MAXDEG];  int gamma[MAXDEG];	  init_gamma(gamma);  copy_poly(D, gamma);  mul_z_poly(D);	  copy_poly(psi, gamma);	  k = -1; L = NErasures;	  for (n = NErasures; n < NPAR; n++)   {	    d = compute_discrepancy(psi, synBytes, L, n);		    if (d != 0)     {		      for (i = 0; i < MAXDEG; i++) psi2[i] = psi[i] ^ gmult(d, D[i]);				      if (L < (n-k))	  {	L2 = n-k;	k = n-L;	for (i = 0; i < MAXDEG; i++) D[i] = gmult(psi[i], ginv(d));	L = L2;      }			      for (i = 0; i < MAXDEG; i++) psi[i] = psi2[i];    }		    mul_z_poly(D);  }	  for(i = 0; i < MAXDEG; i++) Lambda[i] = psi[i];  compute_modified_omega(NPAR);	}void compute_modified_omega (int NPAR){  int i;  int product[MAXDEG*2];	  mult_polys(product, Lambda, synBytes);	  zero_poly(Omega);  for(i = 0; i < NPAR; i++) Omega[i] = product[i];}void mult_polys(int dst[],int pp1[],int pp2[]){  int i, j;  int tmp1[MAXDEG*2];	  for (i=0; i < (MAXDEG*2); i++) dst[i] = 0;	  for (i = 0; i < MAXDEG; i++) {    for(j=MAXDEG; j<(MAXDEG*2); j++) tmp1[j]=0;		    for(j=0; j<MAXDEG; j++) tmp1[j]=gmult(pp2[j], pp1[i]);    for (j = (MAXDEG*2)-1; j >= i; j--) tmp1[j] = tmp1[j-i];    for (j = 0; j < i; j++) tmp1[j] = 0;		    for(j=0; j < (MAXDEG*2); j++) dst[j] ^= tmp1[j];  }}	void init_gamma (int gamma[]){  int e, tmp[MAXDEG];	  zero_poly(gamma);  zero_poly(tmp);  gamma[0] = 1;	  for (e = 0; e < NErasures; e++)   {    copy_poly(tmp, gamma);    scale_poly(gexp[ErasureLocs[e]], tmp);    mul_z_poly(tmp);    add_polys(gamma, tmp);  }}			int compute_discrepancy (int lambda[], int S[], int L, int n){  int i, sum=0;	  for (i = 0; i <= L; i++)     sum ^= gmult(lambda[i], S[n-i]);  return (sum);}void add_polys (int dst[], int src[]) {  int i;  for (i = 0; i < MAXDEG; i++) dst[i] ^= src[i];}void copy_poly (int dst[], int src[]) {  int i;  for (i = 0; i < MAXDEG; i++) dst[i] = src[i];}void scale_poly (int k, int poly[]) {	  int i;  for (i = 0; i < MAXDEG; i++) poly[i] = gmult(k, poly[i]);}void zero_poly (int poly[]) {  int i;  for (i = 0; i < MAXDEG; i++) poly[i] = 0;}static void mul_z_poly (int src[]){  int i;  for (i = MAXDEG-1; i > 0; i--) src[i] = src[i-1];  src[0] = 0;}void  Find_Roots (int NPAR){  int sum, r, k;	  NErrors = 0;    for (r = 1; r < 256; r++)   {    sum = 0;    for (k = 0; k < NPAR+1; k++)     {      sum ^= gmult(gexp[(k*r)%255], Lambda[k]);    }    if (sum == 0)       { 	     ErrorLocs[NErrors] = (255-r); NErrors++; 	     //fprintf(stderr, "Root found at r = %d, (255-r) = %d\n", r, (255-r));      }  }}int correct_errors_erasures (unsigned char *buffer, int nbytes,int csize,int nerasures, int erasures[],int NPAR,unsigned char *parity_point){  int r, i, j, err;  unsigned char codeword[150];  for(i=0;i<nbytes;i++)  {    codeword[i]=*(buffer+i);  }  for(i=0;i<NPAR;i++)  {    codeword[i+nbytes]=*(parity_point+i);  }  NErasures = nerasures;  for (i = 0; i < NErasures; i++) ErasureLocs[i] = erasures[i];  Modified_Berlekamp_Massey(NPAR);  Find_Roots(NPAR);    if ((NErrors <= NPAR) && NErrors > 0)   {     for (r = 0; r < NErrors; r++) 	  {        if (ErrorLocs[r] >= csize) 	    {         	 return -1;      }     }    for (r = 0; r < NErrors; r++) 	 {      int num, denom;      i = ErrorLocs[r];      num = 0;      for (j = 0; j < 2*NPAR; j++) 	       num ^= gmult(Omega[j], gexp[((255-i)*j)%255]);            denom = 0;      for (j = 1; j < 2*NPAR; j += 2) 	   {        	denom ^= gmult(Lambda[j], gexp[((255-i)*(j-1)) % 255]);      }            err = gmult(num, ginv(denom));             	  if((csize-i-1)<nbytes)   *(buffer+(csize-i-1))^= err;	  else *(parity_point+(csize-i-1-nbytes))^= err;    }    return 1;  }  else   {	if ( NErrors)		return -1;
	else
		return 1;      }}

⌨️ 快捷键说明

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