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

📄 rsheader_decode.h

📁 (31,25)RS码编码以及解码的C程序
💻 H
字号:
#include "RSHeader_public.h"

typedef struct Iterate
{ 
	int iterate[7];
	int length; /*the valuable length */
}Iterate;

typedef struct Root
{
	int root[7];
	int length;
}Root;

typedef struct forney
{
	int value[7];
	int site[7];
	int length;
}forney;

int temp_synd[7];


int rs_poly(int [], int ,int);
int rs_rev(int);
void circshift(int [], int , int);

/*calculate the syndrome polynomial according to the received sequence*/
void rs_decode_syndrome(int [], int);
/*calculate the locator polynomial according to the syndrome polynomial*/
Iterate rs_decode_iterate(int [], int);
/*calculate the roots of locator polynomial*/
Root rs_decode_root(int [], int);
/*calculate evaluator polynomial using forney arithmetic, according to 
syndrome polynomial & locator polynomial & roots of locator polynomial*/
forney rs_decode_forney(int [], int , int [], int , int [], int);



void decode();



int rs_rev(int a)
{
	int a1,y1;
	a1=find(T,a,31)-1;
	y1=(31-a1)%31;
	return T[y1];
}

int rs_poly(int t[], int array_size, int x)
{
	int xx,y1,i;
	xx=find(T,x,31)-1;
	y1=t[0];
	for(i=0;i<array_size-1;i++)
	{
		y1=rs_add(y1,rs_mul(t[i+1],T[((i+1)*xx)%31]));
	}
	return y1;
}

void rs_decode_syndrome(int r_x[], int array_size)
{
	int i;
	temp_synd[0]=1;
	for(i=0;i<6;i++)
	{
		temp_synd[i+1]=rs_poly(r_x, array_size, T[i+1]);
	}
}

Iterate rs_decode_iterate(int synd_x[], int array_size)
{
	int sigma[8][7],D[8],d[8],sigmaji[7];
	int i,j,r;
	int flag;
	Iterate temp;
	/*Initial values*/
	for(i=0;i<8;i++)
		for(j=0;j<7;j++)
			sigma[i][j]=0;

	assignValueInt(D,0,8);
	assignValueInt(d,0,8);
	assignValueInt(sigmaji,0,8);

	D[-2+2]=0;
	d[-2+2]=1;
	sigma[-1+2][0]=1;
	D[-1+2]=0;
	d[-1+2]=synd_x[0+1];
	

	flag=-2;
	for(j=-1;j<5;j++)
	{
		/*massey arithmetic*/
		if(d[j+2] ==0)
		{
			for(i=0;i<7;i++)
				sigma[j+2+1][i]=sigma[j+2][i];
			D[j+2+1]=D[j+2];
		}
		else
		{
			for(i=0;i<7;i++)
			{
				sigmaji[i]=sigma[flag+2][i];
			}
			circshift(sigmaji,7,j-flag);

			for(i=0;i<7;i++)
				sigma[j+2+1][i]=rs_add(sigma[j+2][i],rs_mul(rs_mul(d[j+2],
										rs_rev(d[flag+2])),sigmaji[i]));

			/*to get the D(j)*/
			for(i=0;i<7;i++)
			{
				if(sigma[j+2+1][i] != 0)
					D[j+2+1]=i;
			}
			flag=j;
		}
		
		if(j != 4)
		{
			r=j+1;
			d[r+2]=synd_x[r+1+1];
			for(i=0;i<D[r+2];i++)
			{
				d[r+2]=rs_add(d[r+2],rs_mul(sigma[r+2][i+1],synd_x[r+1-i]));
			}
		}
	}

	for(i=0;i<(D[7]+1);i++)
	{
		temp.iterate[i]=sigma[7][i];
	}
	temp.length=D[7]+1;

	return temp;
}

Root rs_decode_root(int x[], int array_size)
{
	Root temp;
	int i,result,j=0;
	for(i=-1;i<30;i++)
	{
		result = rs_poly(x,array_size,T[i+1]);
		if(result == 0)
		{
			temp.root[j]=T[i+1];
			j=j+1;
		}
	}
	temp.length=j;

	return temp;
}

forney rs_decode_forney(int synd[], int synd_size, int sigma_x[], int sigma_size, int root[], int root_size)
{
	forney temp;
	int w1[20],len_w1,t,i,j;
	int w[6],s[4];
	int s_final,w_final;
	len_w1=synd_size+sigma_size-1;
	assignValueInt(w1,0,len_w1);
	t=3;
	for(i=0;i<synd_size-1;i++)
		for(j=0;j<sigma_size;j++)
			w1[i+j]=rs_add(w1[i+j],rs_mul(synd[i+1],sigma_x[j]));

	/*evaluator polynomial*/
	assignValue(w,w1,2*t);
	assignValueInt(s,0,sigma_size);

	for(i=0;i<sigma_size;i++)
	{
		if(i%2 == 0)
		{
			s[i]=sigma_x[i+1];
		}
	}
	s[sigma_size-1]=0;
	for(i=0;i<root_size;i++)
	{
		w_final = rs_poly(w,6,root[i]);
		s_final = rs_poly(s,sigma_size,root[i]);
		/*error value*/
		if(s_final == 0)
		{
			temp.value[i] = 0;
		}
		else
		{
			temp.value[i] = rs_mul(w_final,rs_rev(s_final));
		}
		temp.site[i] = (32 - find(T,root[i],31))%31;
	}
	temp.length=root_size;

	return temp;
}

void decode()
{
	Iterate temp_iterate;
	Root temp_root;
	forney temp_forney;
	int i;
	int temp[31];

	rs_decode_syndrome(temp_Bdecode, 31);
	printf("the synd_x is\n");
	for(i=0;i<7;i++)
	{
		printf("%d ",temp_synd[i]);
	}

	
	temp_iterate = rs_decode_iterate(temp_synd,7);
	printf("\nthe sigma_x is\n");
	for(i=0;i<temp_iterate.length;i++)
	{
		printf("%d ",temp_iterate.iterate[i]);
	}

	temp_root = rs_decode_root(temp_iterate.iterate,temp_iterate.length);
	printf("\nthe root is\n");
	for(i=0;i<temp_root.length;i++)
	{
		printf("%d ",temp_root.root[i]);
	}
	printf("\n");

	if(temp_root.length == 0)
	{
		printf("no error!\n");
		for(i=0;i<25;i++)
		{
			temp_Adecode[i] = temp_Bdecode[i+6];
		}
	}
	else
	{
		temp_forney = rs_decode_forney(temp_synd,7,temp_iterate.iterate,temp_iterate.length
						,temp_root.root,temp_root.length);
		assignValue(temp,temp_Bdecode,31);
		for(i=0;i<temp_forney.length;i++)
		{
			temp[temp_forney.site[i]] = rs_add(temp_Bdecode[temp_forney.site[i]],temp_forney.value[i]);
		}

		if(temp_forney.length>3)
		{
			printf("too many errors occur, can not correct them all\n");
			for(i=0;i<25;i++)
			{
				temp_Adecode[i] = temp[i+6];
			}			
		}
		else
		{
			printf("output!\n");
			for(i=0;i<25;i++)
			{
				temp_Adecode[i] = temp[i+6];
			}	
		}
	}
}

⌨️ 快捷键说明

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