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

📄 bchdeco192.cpp

📁 BCH编解码的源代码
💻 CPP
字号:
/********************************************
        BCH(192,116,21) DECODER
*********************************************/

#include <stdio.h>
#define N 192
#define T 10
#define min 8      /*极小多项式m(x)的最高次数*/

static int gf[256][8];   /*read from gffield table*/

/******求余式r(x)函数******/
int *residue(int mx[min+1],int RC[N])
{
	static int rx[min+1];
	int i,j,temp;
	for(i=0;i<=min;i++)
		rx[i]=0;
	for(j=N-1;j>=0;j--)
	{
		rx[0]=RC[j];
	    if(mx[8]==1)
		{
			temp=rx[min];
			for(i=min;i>0;i--)
				if(mx[i-1]==0)
					rx[i]=rx[i-1];
				else if(mx[i-1]==1)
					rx[i]=rx[i-1]^temp;
		}
		else if(mx[8]==0)
		{
			temp=rx[4];
			for(i=4;i>0;i--)
				if(mx[i-1]==0)
					rx[i]=rx[i-1];
				else if(mx[i-1]==1)
					rx[i]=rx[i-1]^temp;
		}

	}
	return(rx);
}

/******自然基乘法函数 a=b*c ******/
int *multiply(int b[8],int c[8])
{
	static int a[8];
	int i,temp;

	for(i=0;i<8;i++)
		a[i]=0;
	for(i=7;i>=0;i--)
	{
		temp=a[7];
		a[7]=(c[i]&b[7])^a[6];
		a[6]=(c[i]&b[6])^a[5];
		a[5]=(c[i]&b[5])^a[4];
		a[4]=(c[i]&b[4])^a[3]^temp;
		a[3]=(c[i]&b[3])^a[2]^temp;
		a[2]=(c[i]&b[2])^a[1]^temp;
		a[1]=(c[i]&b[1])^a[0];
		a[0]=(c[i]&b[0])^temp;
	}
	return(a);
}


int *adverse(int a[8])        /*查表法求逆*/
{
	int *q,k,i=0,j=0;
	bool flag;
	do
	{
		flag=true;
		j=0;
		while((flag==true)&(j<8))
			if(a[j]!=gf[i][j])
				flag=false;
			else
				j++;
		i++;
	}while((flag==false)&(i<255));
	k=255-(i-1);
	q=gf[k];
	return(q);
}


int max(int x,int y)
{
	int z;
    z=(x>=y)?x:y;
	return(z);
}


void main()
{
	static int RX[N];     /*接收多项式*/
	static int 
		m1[min+1]={1,0,1,1,1,0,0,0,1},
		m3[min+1]={1,1,1,0,1,1,1,0,1},
		m5[min+1]={1,1,0,0,1,1,1,1,1},
		m7[min+1]={1,0,0,1,0,1,1,0,1},
		m9[min+1]={1,0,1,1,1,1,0,1,1},
		m11[min+1]={1,1,1,0,0,1,1,1,1},
		m13[min+1]={1,1,0,1,0,1,0,0,1},
		m15[min+1]={1,1,1,0,1,0,1,1,1},
		m17[min+1]={1,1,0,0,1,0,0,0,0},
		m19[min+1]={1,0,1,0,0,1,1,0,1};       /*极小多项式*/
	static int r1[min+1],r3[min+1],r5[min+1],r7[min+1],r9[min+1],
		r11[min+1],r13[min+1],r15[min+1],r17[min+1],r19[min+1];   /*除法余式*/
	static int s[2*T+1][min];
	int *p;
	int i,j;

	static int d[2*T+1][8],dx[2*T+1];
	static int D[2*T+1];
	static int det[T+1][8],detw[T+1][8],detx[T+1][8],detwtmp[T+1][8];
	int *pt,w,m,h,k,tmp[8];

	static int ax[T+1][8]={{1,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0},{0,0,1,0,0,0,0,0},
	{0,0,0,1,0,0,0,0},{0,0,0,0,1,0,0,0},{0,0,0,0,0,1,0,0},{0,0,0,0,0,0,1,0},
	{0,0,0,0,0,0,0,1},{1,0,1,1,1,0,0,0},{0,1,0,1,1,1,0,0},{0,0,1,0,1,1,1,0}};
	static int ab[T+1][8]={{1,0,0,0,0,0,0,0},{1,0,0,0,0,1,0,1},{0,1,1,0,0,1,1,0},
	{1,1,1,0,1,0,1,0},{1,0,1,1,0,1,0,1},{1,0,0,1,1,1,0,1},{1,0,1,0,0,0,1,1},
	{0,1,1,1,0,1,1,0},{0,1,1,0,1,1,0,0},{0,1,0,1,1,1,0,1},{1,1,0,1,1,1,0,0}};
	static int sum[8],CX[N];
	int sumx=0;

	FILE *fp0,*fp1,*fp2,*fp3;
    
	fp0=fopen("e:\\radiowork\\bch\\gffield.txt","r");
	fp1=fopen("e:\\radiowork\\bch\\data\\ercode20.txt","r");
	fp2=fopen("e:\\radiowork\\bch\\data\\decode20.txt","w");
    fp3=fopen("e:\\radiowork\\bch\\data\\demsg20.txt","w");

	for(i=0;i<256;i++)
		for(j=0;j<8;j++)
			fscanf(fp0,"%d",&gf[i][j]);

	for(i=0;i<N;i++)
		fscanf(fp1,"%d",&RX[i]);

	/*求余式*/
	p=residue(m1,RX);
    for(i=0;i<min;i++)
		r1[i]=p[i+1];
	p=residue(m3,RX);
	for(i=0;i<min;i++)
		r3[i]=p[i+1];
	p=residue(m5,RX);
	for(i=0;i<min;i++)
		r5[i]=p[i+1];
	p=residue(m7,RX);
	for(i=0;i<min;i++)
		r7[i]=p[i+1];
	p=residue(m9,RX);
	for(i=0;i<min;i++)
		r9[i]=p[i+1];
	p=residue(m11,RX);
	for(i=0;i<min;i++)
		r11[i]=p[i+1];
	p=residue(m13,RX);
	for(i=0;i<min;i++)
		r13[i]=p[i+1];
	p=residue(m15,RX);
	for(i=0;i<min;i++)
		r15[i]=p[i+1];
	p=residue(m17,RX);
	for(i=0;i<min;i++)
		r17[i]=p[i+1];
	p=residue(m19,RX);
	for(i=0;i<min;i++)
		r19[i]=p[i+1];

	/*****计算伴随多项式s(x)*****/
	for(i=min-1;i>=0;i--)
		s[1][i]=r1[i];
	
	s[2][7]=r1[6];
	s[2][6]=r1[6]^r1[5]^r1[3];
	s[2][5]=r1[5];
	s[2][4]=r1[7]^r1[5]^r1[4]^r1[2];
	s[2][3]=r1[6]^r1[4];
	s[2][2]=r1[6]^r1[5]^r1[4]^r1[1];
	s[2][1]=r1[7];
	s[2][0]=r1[7]^r1[6]^r1[4]^r1[0];

	s[3][7]=r3[4];
	s[3][6]=r3[7]^r3[4]^r3[2];
	s[3][5]=r3[7]^r3[6]^r3[5]^r3[3];
	s[3][4]=r3[7]^r3[3];
	s[3][3]=r3[6]^r3[4]^r3[3]^r3[1];
	s[3][2]=r3[7]^r3[6]^r3[5]^r3[4];
	s[3][1]=r3[5]^r3[3];
	s[3][0]=r3[7]^r3[6]^r3[4]^r3[0];

	s[4][7]=r1[6]^r1[5]^r1[3];
	s[4][6]=r1[4]^r1[3];
	s[4][5]=r1[5];
	s[4][4]=r1[7]^r1[5]^r1[2]^r1[1];
	s[4][3]=r1[7]^r1[6]^r1[4]^r1[3]^r1[2];
	s[4][2]=r1[6]^r1[5]^r1[4]^r1[3]^r1[2];
	s[4][1]=r1[6];
	s[4][0]=r1[6]^r1[3]^r1[2]^r1[0];

	s[5][7]=r5[7]^r5[4];
	s[5][6]=r5[6]^r5[2];
	s[5][5]=r5[6]^r5[4]^r5[3]^r5[2]^r5[1];
	s[5][4]=r5[7]^r5[4]^r5[2];
	s[5][3]=r5[7];
	s[5][2]=r5[7]^r5[4]^r5[3]^r5[2];
	s[5][1]=r5[5]^r5[3];
	s[5][0]=r5[5]^r5[0];

	s[6][7]=r3[7]^r3[4]^r3[2];
	s[6][6]=r3[5]^r3[2]^r3[1];
	s[6][5]=r3[7]^r3[6]^r3[5]^r3[3];
	s[6][4]=r3[7];
	s[6][3]=r3[4]^r3[3]^r3[2];
	s[6][2]=r3[7]^r3[6]^r3[4]^r3[3]^r3[2];
	s[6][1]=r3[4];
	s[6][0]=r3[7]^r3[6]^r3[4]^r3[3]^r3[2]^r3[0];

	s[7][7]=r7[7]^r7[6]^r7[5]^r7[1];
	s[7][6]=r7[3];
	s[7][5]=r7[6]^r7[3];
	s[7][4]=r7[6]^r7[5]^r7[4]^r7[3]^r7[2];
	s[7][3]=r7[7]^r7[5]^r7[4];
	s[7][2]=r7[7]^r7[6]^r7[5]^r7[3];
	s[7][1]=r7[2];
	s[7][0]=r7[6]^r7[3]^r7[2]^r7[0];

	s[8][7]=r1[4]^r1[3];
	s[8][6]=r1[7]^r1[6]^r1[5]^r1[2];
	s[8][5]=r1[5];
	s[8][4]=r1[7]^r1[4]^r1[1];
	s[8][3]=r1[7]^r1[5]^r1[4]^r1[3]^r1[2]^r1[1];
	s[8][2]=r1[7]^r1[6]^r1[4]^r1[3]^r1[2]^r1[1];
	s[8][1]=r1[6]^r1[5]^r1[3];
	s[8][0]=r1[7]^r1[4]^r1[3]^r1[1]^r1[0];

	s[9][7]=r9[7]^r9[5];
	s[9][6]=r9[6]^r9[5];
	s[9][5]=r9[7]^r9[4]^r9[2]^r9[1];
	s[9][4]=r9[6]^r9[1];
	s[9][3]=r9[3]^r9[2]^r9[1];
	s[9][2]=r9[4]^r9[3]^r9[2];
	s[9][1]=r9[1];
	s[9][0]=r9[7]^r9[5]^r9[4]^r9[2]^r9[0];

	s[10][7]=r5[6]^r5[2];
	s[10][6]=r5[7]^r5[4]^r5[3]^r5[1];
	s[10][5]=r5[6]^r5[4]^r5[3]^r5[2]^r5[1];
	s[10][4]=r5[7]^r5[6]^r5[2]^r5[1];
	s[10][3]=r5[7]^r5[6]^r5[4];
	s[10][2]=r5[7]^r5[5]^r5[2]^r5[1];
	s[10][1]=r5[7]^r5[4];
	s[10][0]=r5[6]^r5[5]^r5[0];

	s[11][7]=r11[5]^r11[4]^r11[2]^r11[1];
	s[11][6]=r11[6]^r11[4]^r11[2]^r11[1];
	s[11][5]=r11[7]^r11[6]^r11[5]^r11[4]^r11[3]^r11[2]^r11[1];
	s[11][4]=r11[7];
	s[11][3]=r11[7]^r11[4]^r11[2]^r11[1];
	s[11][2]=r11[7]^r11[4]^r11[3];
	s[11][1]=r11[4]^r11[3]^r11[2];
	s[11][0]=r11[6]^r11[3]^r11[0];

	s[12][7]=r3[5]^r3[2]^r3[1];
	s[12][6]=r3[7]^r3[6]^r3[4]^r3[1];
	s[12][5]=r3[7]^r3[6]^r3[5]^r3[3];
	s[12][4]=r3[5];
	s[12][3]=r3[7]^r3[5]^r3[2]^r3[1];
	s[12][2]=r3[6]^r3[4]^r3[3]^r3[2]^r3[1];
	s[12][1]=r3[7]^r3[4]^r3[2];
	s[12][0]=r3[7]^r3[6]^r3[5]^r3[3]^r3[2]^r3[1]^r3[0];

	s[13][7]=r13[7]^r13[5]^r13[1];
	s[13][6]=r13[6];
	s[13][5]=r13[7]^r13[6]^r13[5]^r13[3];
	s[13][4]=r13[6]^r13[5]^r13[4]^r13[3];
	s[13][3]=r13[6]^r13[5];
	s[13][2]=r13[5]^r13[4]^r13[3]^r13[2]^r13[1];
	s[13][1]=r13[7]^r13[5]^r13[2]^r13[1];
	s[13][0]=r13[7]^r13[3]^r13[1]^r13[0];

	s[14][7]=r7[3];
	s[14][6]=r7[7]^r7[6]^r7[5]^r7[4];
	s[14][5]=r7[6]^r7[3];
	s[14][4]=r7[5]^r7[4]^r7[3]^r7[2]^r7[1];
	s[14][3]=r7[6]^r7[5]^r7[4]^r7[2];
	s[14][2]=r7[5]^r7[4]^r7[3];
	s[14][1]=r7[7]^r7[6]^r7[5]^r7[1];
	s[14][0]=r7[7]^r7[6]^r7[4]^r7[3]^r7[1]^r7[0];

	s[15][7]=r15[6]^r15[4]^r15[3];
	s[15][6]=r15[6]^r15[3]^r15[2];
	s[15][5]=r15[4]^r15[2]^r15[1];
	s[15][4]=r15[7]^r15[6]^r15[4];
	s[15][3]=r15[7]^r15[6]^r15[5]^r15[4];
	s[15][2]=r15[6]^r15[5]^r15[1];
	s[15][1]=r15[7]^r15[6]^r15[5]^r15[1];
	s[15][0]=r15[6]^r15[5]^r15[4]^r15[3]^r15[0];

	s[16][7]=r1[7]^r1[6]^r1[5]^r1[2];
	s[16][6]=r1[6]^r1[5]^r1[4]^r1[3]^r1[1];
	s[16][5]=r1[5];
	s[16][4]=r1[6]^r1[5]^r1[4]^r1[2];
	s[16][3]=r1[6]^r1[5]^r1[4]^r1[2]^r1[1];
	s[16][2]=r1[5]^r1[4]^r1[3]^r1[2]^r1[1];
	s[16][1]=r1[4]^r1[3];
	s[16][0]=r1[7]^r1[6]^r1[5]^r1[4]^r1[2]^r1[0];

	s[17][7]=r17[7]^r17[5]^r17[4]^r17[1];
	s[17][6]=r17[6]^r17[5]^r17[2];
	s[17][5]=0;
	s[17][4]=r17[7]^r17[5]^r17[4]^r17[1];
	s[17][3]=r17[4]^r17[3]^r17[2]^r17[1];
	s[17][2]=r17[6]^r17[5]^r17[2];
	s[17][1]=r17[7]^r17[5]^r17[3]^r17[2];
	s[17][0]=r17[7]^r17[4]^r17[0];

	s[18][7]=r9[6]^r9[5];
	s[18][6]=r9[7]^r9[6]^r9[5]^r9[4]^r9[3];
	s[18][5]=r9[7]^r9[4]^r9[2]^r9[1];
	s[18][4]=r9[6]^r9[5]^r9[3];
	s[18][3]=r9[5]^r9[1];
	s[18][2]=r9[7]^r9[5]^r9[4]^r9[2]^r9[1];
	s[18][1]=r9[7]^r9[5];
	s[18][0]=r9[5]^r9[4]^r9[2]^r9[1]^r9[0];

	s[19][7]=r19[5]^r19[3]^r19[2];
	s[19][6]=r19[7]^r19[5]^r19[1];
	s[19][5]=r19[7]^r19[6]^r19[5]^r19[3];
	s[19][4]=r19[6]^r19[4]^r19[3]^r19[2]^r19[1];
	s[19][3]=r19[7]^r19[6]^r19[4]^r19[3]^r19[1];
	s[19][2]=r19[7]^r19[6]^r19[4]^r19[2];
	s[19][1]=r19[6]^r19[5]^r19[4]^r19[3]^r19[1];
	s[19][0]=r19[7]^r19[0];

	s[20][7]=r5[7]^r5[4]^r5[3]^r5[1];
	s[20][6]=r5[4]^r5[2];
	s[20][5]=r5[6]^r5[4]^r5[3]^r5[2]^r5[1];
	s[20][4]=r5[6]^r5[5]^r5[4]^r5[3]^r5[1];
	s[20][3]=r5[6]^r5[4]^r5[3]^r5[2];
	s[20][2]=r5[7]^r5[4]^r5[1];
	s[20][1]=r5[6]^r5[2];
	s[20][0]=r5[6]^r5[5]^r5[4]^r5[3]^r5[0];

	/*******求错误位置多项式det(x)*******/
	j=0;
	det[0][0]=1;
	D[0]=0;
	for(i=0;i<min;i++)      /*d[0]=s[1]*/
	{
		d[0][i]=s[1][i];
		dx[0]=dx[0]+d[0][i];
	}
	detw[0][0]=det[0][0];     /*detw:the det of bigest 2j-D[j]*/
	
	for(i=0;i<min;i++)        /*det[0] needn't change*/
		det[1][i]=s[1][i];
	D[j+1]=1;     /*D[1]=1*/
	m=0;          /*m:the bigest value of 2j-D[j]*/
	w=0;          /*w:j vs m*/
 	
	for(j=1;j<=(T-1);j++)
	{
		for(k=0;k<min;k++)            /*count d[j]*/
			d[j][k]=s[2*j+1][k];
		for(i=1;i<=D[j];i++)
		{
			pt=multiply(s[2*j+1-i],det[i]);
			for(k=0;k<min;k++)
				d[j][k]=d[j][k]^pt[k];
		}
		for(i=0;i<min;i++)
			dx[j]=dx[j]+d[j][i];    /*judge d[j]?=0*/
		if(dx[j]==0)        /*d[j]=0,det not change*/
			D[j+1]=D[j];
		else                /*d[j]!=0*/
		{
			for(i=0;i<=T;i++)
				for(h=0;h<min;h++)
					detx[i][h]=det[i][h];  /*detx:save det[j] to assign detw*/
			p=adverse(d[w]);            /*count det[j+1]*/
			pt=multiply(d[j],p);
			for(i=0;i<min;i++)
				tmp[i]=pt[i];       /*place d[j]*d[w]_1 temporay*/
			for(k=0;k<=T;k++)
			{
				pt=multiply(tmp,detw[k]);
				for(h=0;h<min;h++)
					detwtmp[k][h]=pt[h];   /*place d[j]*d[w]_1*det temporay*/
			}
			for(i=0;i<=T;i++)
				if(i>=(2*(j-w)))        /*i<2(j-w),det[i],detx[i] needn't change*/
					for(h=0;h<min;h++)
						det[i][h]=det[i][h]^detwtmp[i-2*(j-w)][h]; 
            D[j+1]=max(D[j],2*j-m);
			if(m<=(2*j-D[j]))
			{
				m=2*j-D[j];
				w=j;
				for(i=0;i<=T;i++)         /*detw:place det of bigest 2j-D[j]*/ 
					for(h=0;h<min;h++)
						detw[i][h]=detx[i][h];   /*detx place det(j-1)*/
				}
		 
		}

	}

	/*******求错误位置********/
	for(i=0;i<=T;i++)
	{
		pt=multiply(det[i],ab[i]);
		for(j=0;j<8;j++)
			det[i][j]=pt[j];
	}
	for(i=N-1;i>=0;i--)
	{
		for(j=0;j<=T;j++)
		{
			pt=multiply(det[j],ax[j]);
		    for(k=0;k<8;k++)
				det[j][k]=pt[k];
		}
		sumx=0;
		for(j=0;j<8;j++)
		{
			sum[j]=0;
			for(k=0;k<=T;k++)
				sum[j]=sum[j]^det[k][j];
			sumx=sumx+sum[j];
		}
		if(sumx==0)       /*error occurs*/
			CX[i]=RX[i]^1;
		else
			CX[i]=RX[i];
	}
	
	printf("\noutput the estimate code CX:\n");
	for(i=0;i<N;i++)    
	{
		fprintf(fp2,"%d ",CX[i]);
		printf("%d ",CX[i]);
		
	}
	printf("\n");

	for(i=76;i<192;i++)   /*output the demsg,it's MSB vs. cx's MSB*/
		fprintf(fp3,"%d ",CX[i]);
    
	fclose(fp0); 
    fclose(fp1);
	fclose(fp2);
	fclose(fp3);

}


⌨️ 快捷键说明

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