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

📄 co_tpc.cpp

📁 通信系统里面的信道编码中的乘积码合作编码visual c++程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//		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 + -