📄 co_tpc.cpp
字号:
// cout<<"3"<<endl;
for(j=0;j<8;j++)
{
decode_bch(test_code,j);
}
// cout<<"4"<<endl;
for(j=0;j<8;j++)
{
for(k=0;k<N;k++)
{
if(test_code[j*N+k]==0)
{
test_code[j*N+k]=-1;
}
}
}
// cout<<"1"<<endl;
//求欧氏距离确定输出码字和竞争码字
int code_D[1][N]; //判决码字
int d; //判决码字在被选码组中的编号
int code_C[1][N]; //竞争码字
int c; //竞争码字在被选码组中的编号
double *dis_c;
dis_c=(double*)malloc(sizeof(double)*8);
for(j=0;j<8;j++)
{
dis_c[j]=0;
}
double dis_D=10000,dis_C;
// cout<<"2"<<endl;
for(j=0;j<8;j++)
{
// dis_c[j]=DIS(Receive,test_code,i,j);
for(int k=0;k<N;k++)
{
dis_c[j]=(dis_c[j]+((Receive[i][k]-test_code[j*N+k])*(Receive[i][k]-test_code[j*N+k])));
}
}
for(j=0;j<8;j++)
{
if(dis_c[j]<dis_D)
{
d=j;
dis_D=dis_c[j];
}
}
for(j=0;j<N;j++)
{
c=-1;
dis_C=100;
// cout<<"3"<<endl;
for(k=0;k<8;k++)
{// cout<<c<<d<<" "<<k<<endl;
if(test_code[k*N+j]!=test_code[d*N+j])
{//cout<<"5"<<endl;
if(dis_c[k]<dis_C)
{ //cout<<"6"<<endl;
c=k;
dis_C=dis_c[k];
}
}
}
// cout<<d<<"___"<<c<<"__"<<dis_C<<endl;
if(c!=-1)
{
Receive[i][j]=(Receive[i][j]+alpha[Num]*(((dis_C-dis_D)/4)*test_code[d*N+j]-Receive[i][j]));
}
else
{
Receive[i][j]=(Receive[i][j]+alpha[Num]*(beta[Num]*test_code[d*N+j]-Receive[i][j]));
}
}
free(dis_c);
free(test_code);
}
}
chase_decode_line() //有问题,要改正
{
int i,j,k;
for(i=0;i<N;i++)
{
int p1,p2,p3;
int *test_code;
test_code=(int*)malloc(sizeof(int)*(8*N));
// int optional_code[8][N];
if(fabs(Receive[0][i])<fabs(Receive[1][i]))
{
if(fabs(Receive[1][i])<fabs(Receive[2][i]))
p1=0,p2=1,p3=2;
else
{
if(fabs(Receive[2][i])<fabs(Receive[0][i]))
p1=2,p2=0,p3=1;
else
p1=0,p2=2,p3=1;
}
}
else
{
if(fabs(Receive[0][i])<fabs(Receive[2][i]))
p1=1,p2=0,p3=2;
else
{
if(fabs(Receive[2][i])<fabs(Receive[1][i]))
p1=2,p2=1,p3=0;
else
p1=1,p2=2,p3=0;
}
}
for(j=3;j<N;j++)
{
if(fabs(Receive[j][i])<fabs(Receive[p1][i]))
{
p3=p2;
p2=p1;
p1=j;
}
else
{
if(fabs(Receive[j][i])<fabs(Receive[p2][i]))
{
p3=p2;
p2=j;
}
else
{
if(fabs(Receive[j][i])<fabs(Receive[p3][i]))
{
p3=j;
}
}
}
}
// cout<<p1<<"---"<<p2<<"---"<<p3<<endl;
// cout<<Code[i][p1]<<"---"<<Code[i][p2]<<"---"<<Code[i][p3]<<endl;
// cout<<Receive[i][p1]<<"---"<<Receive[i][p2]<<"---"<<Receive[i][p3]<<endl;
for(j=0;j<8;j++)
{
for(k=0;k<N;k++)
{
if(Receive[k][i]>=0)
{
test_code[j*N+k]=1;
}
else
{
test_code[j*N+k]=0;
}
}
}
for(j=0;j<8;j++)
{
test_code[j*N+p1]=test[j][0];
test_code[j*N+p2]=test[j][1];
test_code[j*N+p3]=test[j][2];
}
for(j=0;j<8;j++)
{
decode_bch(test_code,j);
}
for(j=0;j<8;j++)
{
for(k=0;k<N;k++)
{
if(test_code[j*N+k]==0)
{
test_code[j*N+k]=-1;
}
}
}
// cout<<"3"<<endl;
//求欧氏距离确定输出码字和竞争码字
int code_D[1][N]; //判决码字
int d; //判决码字在被选码组中的编号
int code_C[1][N]; //竞争码字
int c; //竞争码字在被选码组中的编号
double *dis_c;
dis_c=(double*)malloc(sizeof(double)*8);
for(j=0;j<8;j++)
{
dis_c[j]=0;
}
double dis_D=10000,dis_C;
// cout<<"4"<<endl;
for(j=0;j<8;j++)
{
// dis_c[j]=DIS_line(Receive,test_code,i,j);
for(k=0;k<N;k++)
{
dis_c[j]=(dis_c[j]+((Receive[k][i]-test_code[j*N+k])*(Receive[k][i]-test_code[j*N+k])));
}
}
for(j=0;j<8;j++)
{
if(dis_c[j]<dis_D)
{
d=j;
dis_D=dis_c[j];
}
}
for(j=0;j<N;j++)
{
c=-1;
dis_C=100;
for(k=0;k<8;k++)
{
if(test_code[k*N+j]!=test_code[d*N+j])
{
if(dis_c[k]<dis_C)
{
c=k;
dis_C=dis_c[k];
}
}
}
// cout<<d<<"___"<<c<<"__"<<dis_C<<endl;
if(c!=-1)
{
Receive[j][i]=(Receive[j][i]+alpha[Num]*(((dis_C-dis_D)/4)*test_code[d*N+j]-Receive[j][i]));
}
else
{
Receive[j][i]=(Receive[j][i]+alpha[Num]*(beta[Num]*test_code[d*N+j]-Receive[j][i]));
}
}
free(dis_c);
free(test_code);
}
}
decode_TPC()
{
chase_decode_row();
chase_decode_line();
}
main()
{
int i,j;
int code0[K][K];
int code1[K][K];
GH();
FILE *fp;
fp = fopen("result.txt", "a");
if(fp == NULL)
{
printf("\n open file error");
exit(0);
}
fprintf(fp, "\n snr_db = [");
for(double EbN0_dB = startsnr;EbN0_dB <= endsnr;EbN0_dB += snrstep)
fprintf(fp,"%f ",EbN0_dB);
fprintf(fp,"]\nber = [");
fclose(fp);
for(double snr=startsnr;snr<=endsnr;snr+=snrstep)
{
double sigma=sqrt(0.5*(pow(10,-0.1*snr)));
int errorNum=0;
int errorNum1=0;
int Number=0;
for(int aaa=0;aaa<1000;aaa++)
// for(;errorNum<500;)
{
encode_TPC();
Channel1(sigma,Code,Receive);
Channel2(sigma,Code,Receive);
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
if(Receive[i][j]>=0)
{
code0[i][j]=1;
}
else
{
code0[i][j]=0;
}
}
}
// cout<<"e"<<endl;
errorNum1+=Error_Statistic(code0,Info);
for(Num=0;Num<6;Num++)
{
decode_TPC();
}
// cout<<"f"<<endl;
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
if(Receive[i][j]>=0)
{
code1[i][j]=1;
}
else
{
code1[i][j]=0;
}
}
}
errorNum+=Error_Statistic(code1,Info);
Number+=Infolength;
}
double ber=(double(errorNum)/Number);
cout<<(double(errorNum1)/Number)<<endl;
cout<<ber<<endl;
// cout<<"errorNum="<<errorNum<<endl;
// cout<<"errorNum1="<<errorNum1<<endl;
// cout<<"Num="<<Num<<endl;
cout<<"snr="<<snr<<endl;
fp = fopen("result.txt","a");
if(fp == NULL)
{
printf("\n open file error");
exit(0);
}
fprintf(fp, "%e ", ber);
fclose(fp);
}
fp = fopen("result.txt","a");
if(fp == NULL)
{
printf("\n open file error");
exit(0);
}
fprintf(fp,"]\n");
fclose(fp);
/*
encode_TPC();
// decode_TPC();
// Code[0][1]=(Code[0][1]+1)%2;
// for(int x=0;x<N;x++)
// {
// Code[x][x]=1;
// }
// chase_decode();
double snr=0.8;
double sigma=sqrt(pow(10,-0.1*snr))*0.56;
Channel(sigma,Code,Receive);
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
if(Receive[i][j]>=0)
{
code0[i][j]=1;
}
else
{
code0[i][j]=0;
}
}
}
for(Num=0;Num<2;Num++)
{
chase_decode_row();
// decode_TPC();
}
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
{
if(Receive[i][j]>=0)
{
code1[i][j]=1;
}
else
{
code1[i][j]=0;
}
}
}
FILE *fp;
fp = fopen("H.txt", "a");
if(fp == NULL)
{
printf("\n open file error");
exit(0);
}
//输出k[Infolength]
fprintf(fp, "\nk = [\n");
for(i=0;i<Infolength;i++)
{
if(i%K==0)
{
fprintf(fp,"\n");
}
fprintf(fp,"%d,",k[i]);
}
fprintf(fp,"]\n");
//输出Info[K][K]
fprintf(fp, "\nInfo = [\n");
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
fprintf(fp,"%d,",Info[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"]\n");
//输出code0
fprintf(fp, "\ncode0 = [\n");
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
fprintf(fp,"%d,",code0[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"]\n");
//输出code1
fprintf(fp, "\ncode1 = [\n");
for(i=0;i<K;i++)
{
for(j=0;j<K;j++)
fprintf(fp,"%d,",code1[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"]\n");
//输出Code[N][N]
fprintf(fp, "\nCode = [\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
fprintf(fp,"%d,",Code[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"]\n");
//输出Receive[N][N]
fprintf(fp, "\Receive = [\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
fprintf(fp,"%3.1f,",Receive[i][j]);
fprintf(fp,"\n");
}
fprintf(fp,"]\n");
fclose(fp);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -