📄 bchdeco192.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 + -