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

📄 rsdec255_191.cpp

📁 RS码译码器C语言工程
💻 CPP
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"


void gf_add(unsigned char a[], unsigned char b[],unsigned char c[])//GF域加法
{int i;

for (i=0;i<=7;i++)
{
	c[i] = (a[i] + b[i])%2;
}
}//



void gf_multi(unsigned char a[], unsigned char b[],unsigned char c[])//GF域乘法

{

c[7] = (a[7] & b[7]) ^ (a[6] & b[0]) ^ (a[5] & b[1]) ^ (a[4] & b[2]) ^ (a[3] & b[3]) ^ (a[2] & b[4]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[6]) ^ (a[0] & b[2]) ^ (a[0] & b[1]) ^ (a[0] & b[0]) ;
c[6] = (a[7] & b[6]) ^ (a[6] & b[7]) ^ (a[5] & b[0]) ^ (a[4] & b[1]) ^ (a[3] & b[2]) ^ (a[2] & b[3]) ^ (a[1] & b[4]) ^ (a[1] & b[0]) ^ (a[0] & b[5]) ^ (a[0] & b[1]) ^ (a[0] & b[0]);
c[5] = (a[7] & b[5]) ^ (a[6] & b[6]) ^ (a[6] & b[0]) ^ (a[5] & b[7]) ^ (a[5] & b[1]) ^ (a[4] & b[2]) ^ (a[4] & b[0]) ^ (a[3] & b[3]) ^ (a[3] & b[1]) ^ (a[2] & b[4]) ^ (a[2] & b[2]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[3]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[6]) ^ (a[0] & b[4]) ^ (a[0] & b[2]) ^ (a[0] & b[1]);
c[4] = (a[7] & b[4]) ^ (a[6] & b[5]) ^ (a[6] & b[0]) ^ (a[5] & b[6]) ^ (a[5] & b[1]) ^ (a[5] & b[0]) ^ (a[4] & b[7]) ^ (a[4] & b[2]) ^ (a[4] & b[1]) ^ (a[3] & b[3]) ^ (a[3] & b[2]) ^ (a[3] & b[0]) ^ (a[2] & b[4]) ^ (a[2] & b[3]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[4]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[0] & b[6]) ^ (a[0] & b[5]) ^ (a[0] & b[3]) ^ (a[0] & b[2]);
c[3] = (a[7] & b[3]) ^ (a[6] & b[4]) ^ (a[6] & b[0]) ^ (a[5] & b[5]) ^ (a[5] & b[1]) ^ (a[5] & b[0]) ^ (a[4] & b[6]) ^ (a[4] & b[2]) ^ (a[4] & b[1]) ^ (a[4] & b[0]) ^ (a[3] & b[7]) ^ (a[3] & b[3]) ^ (a[3] & b[2]) ^ (a[3] & b[1]) ^ (a[2] & b[4]) ^ (a[2] & b[3]) ^ (a[2] & b[2]) ^ (a[1] & b[5]) ^ (a[1] & b[4]) ^ (a[1] & b[3]) ^ (a[0] & b[6]) ^ (a[0] & b[5]) ^ (a[0] & b[4]) ^ (a[0] & b[0]);
c[2] = (a[7] & b[2]) ^ (a[6] & b[3]) ^ (a[5] & b[4]) ^ (a[5] & b[0]) ^ (a[4] & b[5]) ^ (a[4] & b[1]) ^ (a[4] & b[0]) ^ (a[3] & b[6]) ^ (a[3] & b[2]) ^ (a[3] & b[1]) ^ (a[3] & b[0]) ^ (a[2] & b[7]) ^ (a[2] & b[3]) ^ (a[2] & b[2]) ^ (a[2] & b[1]) ^ (a[1] & b[4]) ^ (a[1] & b[3]) ^ (a[1] & b[2]) ^ (a[0] & b[5]) ^ (a[0] & b[4]) ^ (a[0] & b[3]);
c[1] = (a[7] & b[1]) ^ (a[6] & b[2]) ^ (a[5] & b[3]) ^ (a[4] & b[4]) ^ (a[4] & b[0]) ^ (a[3] & b[5]) ^ (a[3] & b[1]) ^ (a[3] & b[0]) ^ (a[2] & b[6]) ^ (a[2] & b[2]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[7]) ^ (a[1] & b[3]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[0] & b[4]) ^ (a[0] & b[3]) ^ (a[0] & b[2]);
c[0] = (a[7] & b[0]) ^ (a[6] & b[1]) ^ (a[5] & b[2]) ^ (a[4] & b[3]) ^ (a[3] & b[4]) ^ (a[3] & b[0]) ^ (a[2] & b[5]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[6]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[7]) ^ (a[0] & b[3]) ^ (a[0] & b[2]) ^ (a[0] & b[1]);

}//


void gf_pow(int order,unsigned char gf_pow_table[255][8], unsigned char pw[])//GF域乘方
{int order_255,k;
 order_255 = order%255;
 
 for (k=0;k<=7;k++)
   {
	   pw[k] = gf_pow_table[order_255][k];
   }
   
}//


void gf_devid(unsigned char dividend[],unsigned char divider[],unsigned char gf_inverse_table[256][8], unsigned char pw[])//GF域除法
{int index,k;
unsigned char inverse_data[8];
index = divider[0]*128 + divider[1]*64 + divider[2]*32 + divider[3]*16 + divider[4]*8 + divider[5]*4 + divider[6]*2 + divider[7];

for (k=0;k<=7;k++)
{
	   inverse_data[k] = gf_inverse_table[index][k];
}
gf_multi(dividend,inverse_data,pw);

}//



void dec_print(unsigned char gf_bi[])//打印十进制数
{int num_dec;
num_dec = gf_bi[0]*128 + gf_bi[1]*64 + gf_bi[2]*32 + gf_bi[3]*16 + gf_bi[4]*8 + gf_bi[5]*4 + gf_bi[6]*2 + gf_bi[7];
printf("%d ",num_dec);

}//


//void rs_dec(unsigned char data_in[255][8], unsigned char error_out[255][8])
void main()//RS(255,191) decoder 
{
	FILE *fp;
	int i, j, k, jj;
	unsigned char s[64][8];
	unsigned char alpha_cf[8];
	unsigned char s_mul[8];
	unsigned char gf_pow_table[255][8];
	unsigned char gf_inverse_table[256][8];
	unsigned char data_in[255][8];
		
	unsigned char lambda[33][8]={0};//lambda=gf(zeros(1,33),8,285);;lambda(1)=1;
	unsigned char omega[33][8]={0};//omega = gf(zeros(1,33),8,285);;omega(1) = 1;
	unsigned char delta[8];
	unsigned char b[32][8]={0};//b=gf([1,zeros(1,31)],8);
	unsigned char a[32][8]={0};//a = gf(zeros(1,32),8);
	int l=0;
	unsigned lamida;
	unsigned char sigema[8]={0,0,0,0,0,0,0,1};//sigema = gf(1,8);
	unsigned char acc[8]={0,0,0,0,0,0,0,0};//acc = gf(0,8);
	unsigned char lambda_tmp[41][8]={0};//lambda_tmp = gf(0,8);gf(zeros(1,41),8)
	unsigned char omega_tmp[41][8]={0};//omega_tmp = gf(0,8);gf(zeros(1,41),8)
	unsigned char b_tmp[41][8]={0};//b_tmp = gf(0,8);gf(zeros(1,41),8)
	unsigned char a_tmp[41][8]={0};//a_tmp = gf(0,8);gf(zeros(1,41),8)
	unsigned char s_tmp[64][8];
	unsigned char s_tmp1[41][8] = {0};
	
	unsigned char m1_out[41][8];
	unsigned char m2_out[41][8];
	unsigned char m3_out[41][8];
	unsigned char m4_out[41][8];
	unsigned char m5_out[41][8];
	
	unsigned char s_buf[8];
	
	unsigned char tmp[8]={0};
	unsigned char tmp1[8]={0};	
	unsigned char tmp2[8]={0};
	unsigned char error_out[255][8]={0};
	unsigned char chien_mul[8] = {0};

	
	
		  if ( (fp = fopen("gf_pow.dat","rb")) == NULL)//生成指数表
		  {
			  printf("Open file \"gf_pow.dat\" error!");
			  exit(1);
		  }
		  else
		  {
			  for (i = 0; i <= 254; i++)
			  {
				  for (jj=0;jj<=7;jj++)
					  fscanf(fp,"%c",&gf_pow_table[i][jj]);			
			  }
			  fclose(fp);
		  }//
		  
		  
			if ( (fp = fopen("gf_inverse.dat","rb")) == NULL)//生成求逆表
			{
			printf("Open file \"gf_inverse.dat\" error!");
			exit(1);
			}
			else
			{
			for (i = 0; i <= 255; i++)
			{
			for (j=0;j<=7;j++)
			fscanf(fp,"%c",&gf_inverse_table[i][j]);			
			}
			fclose(fp);//
			}

		  
            if ( (fp = fopen("dec_data_in.dat","rb")) == NULL)//读取输入数据
			{
			  printf("Open file \"dec_data_in.dat\" error!");
			  exit(1);
			}
			else
			{
			for (i = 0; i <= 254; i++)
			{
			  for (j=0;j<=7;j++)
			  fscanf(fp,"%c",&data_in[i][j]);			
			}
			fclose(fp);
			}//
//////////////////////////////////////////////////////////////////////////////////
		  for (i=0;i<=254;i++)//伴随多项式计算
		  {
			  for (j=0;j<=63;j++)
			  { gf_pow(j+1,gf_pow_table,alpha_cf); 
			  gf_multi(s[j],alpha_cf,s_mul);
			  gf_add(s_mul,data_in[i],s[j]);
			  }
		  }//
/////////////////////////////////////////////////////////////////////////////////////////		  
          
		 lambda[0][7] = 1;//lambda(1)=1;
		 omega[0][7] = 1; //omega(1) = 1;
         b[0][7] = 1;//b(1) = 1;

		  for(jj=0;jj<=7;jj++)//delta=gf(s(1),8);
		  {
			  delta[jj] = s[0][jj];
		  }
		  
		  
		  for (i=0;i<=63;i++)//s_tmp = [s(3:64) s(1) s(2)];
		  { 
			  for(jj=0;jj<=7;jj++)
			  {
				  s_tmp[i][jj] = s[(i+2)%64][jj];
			  }
		  }

		  printf("s_tmp: ");//
		  for (j=0;j<=63;j++)//测试输出
		  {
			  dec_print(s_tmp[j]);
		  }
		  printf("\n");//


		  
		  for (i=1;i<=64;i++)//main BM
		  {
			  if ((2*l <= i-1)&&((delta[0]*128 + delta[1]*64 + delta[2]*32 + delta[3]*16 + delta[4]*8 + delta[5]*4 + delta[6]*2 + delta[7]) != 0))
				  lamida = 1;
			  else 
				  lamida = 0;
			  
			  l = lamida*(i-l)+(1-lamida)*l;
			  for (j= 1;j<=33;j++)//s_tmp1 = [0 0 0 0 s_tmp(32:64) 0 0 0 0];
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  s_tmp1[j+3][jj] = s_tmp[j+30][jj];
				  }
			  }
			  
			  
			  for (j=0;j<=40;j++)////m1_out = 0;
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  m1_out[j][jj] = 0;
				  }
			  }
			  
			  for (j=0;j<=40;j++)////m2_out = 0;
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  m2_out[j][jj] = 0;
				  }
			  }
			  
			  for (j=0;j<=40;j++)////m3_out = 0;
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  m3_out[j][jj] = 0;
				  }
			  }
			  
			  for (j=0;j<=40;j++)////m4_out = 0;
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  m4_out[j][jj] = 0;
				  }
			  }
			  
			  for (j=0;j<=40;j++)////m5_out = 0;
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  m5_out[j][jj] = 0;
				  }
			  }
			  
			  
			  for (k=3;k<=3+33+4;k++)//for k = 1+3:9+3+1+4
			  {
				  if (k <= 36)
				  {
					  gf_multi(b[31],delta,m1_out[k]);//m1_out(k) = b(32) * delta;
					  gf_multi(sigema,lambda[32],m2_out[k]);//m2_out(k) = sigema * lambda(33);
					  
					  if (lamida == 1)
					  {
						  for (jj=0;jj<=7;jj++)//b_tmp(k) = lambda(33);
						  {
							  b_tmp[k][jj] = lambda[32][jj];  
						  }
					  }
					  else
					  {
						  for (jj=0;jj<=7;jj++)//b_tmp(k) = b(32);
						  {
							  b_tmp[k][jj] = b[31][jj];  
						  }
					  }
					  

					  for (j=31;j>=0;j--)//lambda(2:33) = lambda(1:32);    
					  {
						  for (jj=0;jj<=7;jj++)
						  {
							  lambda[j+1][jj] = lambda[j][jj];
						  }
					  }  //    

					  
					  gf_multi(a[31],delta,m4_out[k]);//m4_out(k) = a(32) * delta;%cycle1
					  gf_multi(sigema,omega[32],m5_out[k]);//m5_out(k) = sigema * omega(33);
					  
					
					  if (lamida == 1)
					  {
						  for (jj=0;jj<=7;jj++)//a_tmp(k) = omega(33);
						  {
							  a_tmp[k][jj] = omega[32][jj];  
						  }
					  }
					  else
					  {
						  for (jj=0;jj<=7;jj++)//a_tmp(k) = a(32);
						  {
							  a_tmp[k][jj] = a[31][jj];  
						  }
					  }//

					  for (j=31;j>=0;j--)//omega(2:33) = omega(1:32);   
					  {
						  for (jj=0;jj<=7;jj++)
						  {
							  omega[j+1][jj] = omega[j][jj];
						  }
					  }

					  

					  gf_add(m1_out[k-1],m2_out[k-1],lambda[0]);//lambda(1)= m1_out(k-1)+ m2_out(k-1);
					  
					  for (j=30;j>=0;j--)//b(1:32) = [b_tmp(k-1) b(1:31)]; 
					  {
						  for (jj=0;jj<=7;jj++)
						  {
							  b[j+1][jj] = b[j][jj];
						  }
					  }
					  for (jj=0;jj<=7;jj++)
					  {
						  b[0][jj] = b_tmp[k-1][jj];
					  }

					  
					  
					  gf_add(m4_out[k-1],m5_out[k-1],omega[0]);//omega(1)= m4_out(k-1)+ m5_out(k-1);
					  
					  for (j=30;j>=0;j--)//a(1:32) = [a_tmp(k-1) a(1:31)];   
					  {
						  for (jj=0;jj<=7;jj++)
						  {
							  a[j+1][jj] = a[j][jj];
						  }
					  }
					  for (jj=0;jj<=7;jj++)
					  {
						  a[0][jj] = a_tmp[k-1][jj];
					  }
 
				  }
				  
				  gf_add(m1_out[k-1],m2_out[k-1],lambda_tmp[k]);//lambda_tmp(k) = m1_out(k-1)+ m2_out(k-1);
				  gf_add(m4_out[k-1],m5_out[k-1],omega_tmp[k]);//omega_tmp(k) = m4_out(k-1)+ m5_out(k-1);       
				  gf_multi(s_tmp1[k-1],lambda_tmp[k-1],m3_out[k]);//m3_out(k) = s_tmp1(k-1)*lambda_tmp(k-1);%cycle3
				  gf_add(acc,m3_out[k-3],acc);//acc = acc + m3_out(k-3);  %cycle4
				  
				  
			  }
			  
			  for (jj=0;jj<=7;jj++)
			  {
				  s_buf[jj] = s_tmp[0][jj];
			  }
			  for (j=1;j<=63;j++)//s_tmp = [s_tmp(2:64) s_tmp(1)];
			  {
				  for (jj=0;jj<=7;jj++)
				  {
					  s_tmp[j-1][jj] = s_tmp[j][jj];
				  }
			  }
			  for (jj=0;jj<=7;jj++)
			  {
				  s_tmp[15][jj] = s_buf[jj];
			  }
			  
			  
			  if (lamida == 1)//sigema = lamida*delta + (1-lamida)*sigema;
			  {
				  for (jj=0;jj<=7;jj++)//sigema = delta;
				  {
					  sigema[jj] = delta[jj];  
				  }
			  }
			  
			  for (jj=0;jj<=7;jj++)//delta = acc;
			  {
				  delta[jj] = acc[jj];
			  }
			  
			  for (jj=0;jj<=7;jj++)//acc = 0;
			  {
				  acc[jj] = 0;
			  }


		  }

		  printf("lambda: ");//
		  for (j=0;j<=32;j++)//测试输出
		  {
			  dec_print(lambda[j]);
		  }
		  printf("\n");//
		  
/////////////////////////////////////////////////////////////////////////////////////////////////		  
		  for (i=1;i<=255;i++)
		  {
			  for (jj=0;jj<=7;jj++)//tmp = 0;
			  {
				  tmp[jj] = 0;
			  }
			  for (j=0;j<=32;j++)//[1 alpha^i  alpha^(2*i)  alpha^(3*i)  alpha^(4*i)  alpha^(5*i)  alpha^(6*i)  alpha^(7*i) alpha^(8*i) alpha^(9*i)  alpha^(10*i)  alpha^(11*i)  alpha^(12*i)  alpha^(13*i)  alpha^(14*i) alpha^(15*i) alpha^(16*i)  alpha^(17*i)  alpha^(18*i)  alpha^(19*i)  alpha^(20*i)  alpha^(21*i) alpha^(22*i)  alpha^(23*i) alpha^(24*i) alpha^(25*i) alpha^(26*i)  alpha^(27*i)  alpha^(28*i)  alpha^(29*i)  alpha^(30*i)  alpha^(31*i) alpha^(32*i)]*lambda';%chien搜索,错误位置计算
			  {
				  gf_pow(j*i,gf_pow_table,alpha_cf);
				  gf_multi(lambda[j],alpha_cf,chien_mul);
				  gf_add(tmp,chien_mul,tmp);
			  }
			  
			  if ( (tmp[0]*128 + tmp[1]*64 + tmp[2]*32 + tmp[3]*16 + tmp[4]*8 + tmp[5]*4 + tmp[6]*2 + tmp[7]) == 0)
			  {
				  for (jj=0;jj<=7;jj++)//tmp1 = 0;
				  {
					  tmp1[jj] = 0;
				  }
				  for (j=0;j<=32;j++)//[alpha^(i)  alpha^(2*i)  alpha^(3*i)  alpha^(4*i)  alpha^(5*i)  alpha^(6*i)  alpha^(7*i) alpha^(8*i) alpha^(9*i)  alpha^(10*i)  alpha^(11*i)  alpha^(12*i)  alpha^(13*i)  alpha^(14*i) alpha^(15*i) alpha^(16*i)  alpha^(17*i)  alpha^(18*i)  alpha^(19*i)  alpha^(20*i)  alpha^(21*i) alpha^(22*i)  alpha^(23*i) alpha^(24*i) alpha^(25*i) alpha^(26*i)  alpha^(27*i)  alpha^(28*i)  alpha^(29*i)  alpha^(30*i)  alpha^(31*i) alpha^(32*i) alpha^(33*i)]*omega(1:33)';
				  {
					  gf_pow((j+1)*i,gf_pow_table,alpha_cf);
					  gf_multi(omega[j],alpha_cf,chien_mul);
					  gf_add(tmp1,chien_mul,tmp1);
				  }
				  

				  for (jj=0;jj<=7;jj++)//tmp2 = 0;
				  {
					  tmp2[jj] = 0;
				  }
				  for (j=0;j<=32;j=j+2)//[alpha^(1*i)   alpha^(3*i)  alpha^(5*i) alpha^(7*i) alpha^(9*i)   alpha^(11*i)  alpha^(13*i) alpha^(15*i) alpha^(17*i)   alpha^(19*i)  alpha^(21*i) alpha^(23*i) alpha^(25*i) alpha^(27*i) alpha^(29*i) alpha^(31*i) alpha^(33*i)]*lambda([1:2:33])';
				  {
					  gf_pow((j+1)*i,gf_pow_table,alpha_cf);
					  gf_multi(lambda[j],alpha_cf,chien_mul);
					  gf_add(tmp2,chien_mul,tmp2);
				  }
				  
				  
				  
				  gf_devid(tmp1,tmp2,gf_inverse_table,error_out[i]);//error_out(i) = tmp1/tmp2;%错误值计算
				  
				  printf("错误位置%d 错误值",i);
				  dec_print(error_out[i]);
                  printf("\n");
			  }
			  
			  
			  
		  }
		  
}

⌨️ 快捷键说明

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