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

📄 dcs.cpp

📁 用VC模拟数字通信系统
💻 CPP
字号:
#include "DCS.H"
using namespace std;
#define pi 3.1415926

//Global variables
int		input_symbol[16];	
int		output_symbol[16];
int		character[28];
double	real_signal[14];
double	imagine_signal[14];
long	number_of_error;

int DCS_Code(double k,int times)
{
	number_of_error=0;
	for(int count=0;count<times;count++)
	{
		Input();
		Encoder();
		Modulate(k);
		Mod_Transfer();
		Demodulate();
		Decoder();
		Statistics();
	}
	return number_of_error;
}
int DCS_Uncode(double k,int times)
{
	number_of_error=0;
	for(int count=0;count<times;count++)
	{
		Input();
		Mod_16PSK(k);
		Mod_Transfer();
		De_16PSK();
		Statistics();
	}
	return number_of_error;
}
int DCS_QPSK(double k,int times)
{
	number_of_error=0;
	for(int count=0;count<times;count++)
	{
		Input();
		Encoder();
		Mod_QPSK(k);
		Mod_Transfer();
		De_QPSK();
		Decoder();
		Statistics();
	}
	return number_of_error;
}
void Mod_Transfer()
{
	for(int i=0;i<7;i++)
	{
		real_signal[i]=real_signal[i]+AWGN();
		imagine_signal[i]=imagine_signal[i]+AWGN();
	}
}

void Input()
{
	for(int i=0;i<16;i++)
		input_symbol[i]=rand()%2;
}

void Statistics()
{
	for(int i=0;i<16;i++)
	{
		if(input_symbol[i]!=output_symbol[i])
			number_of_error++;
	}
}

void Base_Transfer(double k)
{
	double output_buffer;
	for(int i=0;i<16;i++)
	{
		if(input_symbol[i]==0)
			output_buffer=-1;	
		else
			output_buffer=1;
		output_buffer=double(output_buffer)+AWGN()/k;
		if(output_buffer>0)
			output_symbol[i]=1;
		else
			output_symbol[i]=0;
	}
}
double AWGN()
{
	double ua,u1,u2,s,g;
	do{
	ua=double(rand()%1000)/1000;
	u1=1-2*ua;
	ua=double(rand()%1000)/1000;
	u2=1-2*ua;
	s=u1*u1+u2*u2;
	}while(s>=1);
	g=u1*sqrt(-0.5*log(s)/s);
	return g;
}
/*void Encoder()
{  int i;
	for(i=0;i<4;i++)
	   {
		character[7*i]=input_symbol[4*i];
		character[7*i+1]=input_symbol[4*i+1];
		character[7*i+2]=input_symbol[4*i+2];
		character[7*i+3]=input_symbol[4*i+3];
	    character[7*i+4]=input_symbol[4*i]^input_symbol[4*i+1]^input_symbol[4*i+2];
		character[7*i+5]=input_symbol[4*i+1]^input_symbol[4*i+2]^input_symbol[4*i+3];
		character[7*i+6]=input_symbol[4*i]^input_symbol[4*i+1]^input_symbol[4*i+3];
	   }

}*/
void Encoder()
{
	for(int i=0;i<4;i++)
	{
		character[7*i]=input_symbol[4*i];	//a6
		character[7*i+1]=input_symbol[4*i+1];		//a5
		character[7*i+2]=input_symbol[4*i+2];		//a4
		character[7*i+3]=input_symbol[4*i+3];		//a3
	    character[7*i+4]=input_symbol[4*i]^input_symbol[4*i+1]^input_symbol[4*i+2];		//a2
		character[7*i+5]=input_symbol[4*i]^input_symbol[4*i+1]^input_symbol[4*i+3];		//a1
		character[7*i+6]=input_symbol[4*i]^input_symbol[4*i+2]^input_symbol[4*i+3];		//a0
	}
}
void Modulate(double k)
{	int i;
	int a;
	for(i=0;i<7;i++)
	{
	  a=8*character[4*i]+4*character[4*i+1]+2*character[4*i+2]+character[4*i+3];
	  Get_ri(i,a,k);
	}
}

void Get_ri(int i,int a,double k)
{
	switch(a)
	{
	case 0:
		real_signal[i]=0.98078528040323;
		imagine_signal[i]=0.19509032201613;
		break;
	case 1:
		real_signal[i]=0.83146961230255;
		imagine_signal[i]=0.55557023301960;
		break;
	case 3:
		real_signal[i]=0.55557023301960;
		imagine_signal[i]=0.83146961230255;
		break;
	case 2:
		real_signal[i]=0.19509032201613;
		imagine_signal[i]=0.98078528040323;
		break;
	case 6:
		real_signal[i]=-0.19509032201613;
		imagine_signal[i]=0.98078528040323;
		break;
	case 7:
		real_signal[i]=-0.55557023301960;
		imagine_signal[i]=0.83146961230255;
		break;
	case 5:
		real_signal[i]=-0.83146961230255;
		imagine_signal[i]=0.55557023301960;
		break;
	case 4:
		real_signal[i]=-0.98078528040323;
		imagine_signal[i]=0.19509032201613;
		break;
	case 12:
		real_signal[i]=-0.98078528040323;
		imagine_signal[i]=-0.19509032201613;
		break;
	case 13:
		real_signal[i]=-0.83146961230255;
		imagine_signal[i]=-0.55557023301960;
		break;
	case 15:
		real_signal[i]=-0.55557023301960;
		imagine_signal[i]=-0.83146961230255 ;
		break;
	case 14:
		real_signal[i]=-0.19509032201613;
		imagine_signal[i]=-0.98078528040323;
		break;
	case 10:
		real_signal[i]=0.19509032201613;
		imagine_signal[i]= -0.98078528040323 ;
		break;
	case 11:
		real_signal[i]=0.55557023301960;
		imagine_signal[i]=-0.83146961230255;
		break;
	case 9:
		real_signal[i]=0.83146961230255;
		imagine_signal[i]=-0.55557023301960;
		break;
	case 8:
		real_signal[i]=0.98078528040323;
		imagine_signal[i]=-0.19509032201613;
		break;
	}
	real_signal[i]=k*real_signal[i];
	imagine_signal[i]=k*imagine_signal[i];
}

void Demodulate()
{	
	
	double b;
	int i;
	for(i=0;i<7;i++)
	{
		b=imagine_signal[i]/real_signal[i];
		double sita=atan(b);
		if(real_signal[i]<=0 && imagine_signal[i]>0)
			sita=sita+pi;
		else if(real_signal[i]<0 && imagine_signal[i]<=0)
			sita=pi+sita;
		else if(real_signal[i]>0 && imagine_signal[i]<=0)
			sita=2*pi+sita;
		int temp=int(sita*8/pi);
		temp=Dec2Geray(temp);
		character[4*i+3]=temp%2;
		character[4*i+2]=temp/2%2;
		character[4*i+1]=temp/4%2;
		character[4*i]=temp/8%2;
	}
}
int	Dec2Geray(int temp)
{
	switch(temp)
	{
	case 0:
		return 0;
		break;
	case 1:
		return 1;
		break;
	case 2:
		return 3;
		break;
	case 3:
		return 2;
		break;
	case 4:
		return 6;
		break;
	case 5:
		return 7;
		break;
	case 6:
		return 5;
		break;
	case 7:
		return 4;
		break;
	case 8:
		return 12;
		break;
	case 9:
		return 13;
		break;
	case 10:
		return 15;
		break;
	case 11:
		return 14;
		break;
	case 12:
		return 10;
		break;
	case 13:
		return 11;
		break;
	case 14:
		return 9;
		break;
	default:				//case 15
		return 8;
		break;
	}
}

void Mod_16PSK(double k)
{	int i;
	int a;
	for(i=0;i<4;i++)
	{
	  a=8*input_symbol[4*i]+4*input_symbol[4*i+1]+2*input_symbol[4*i+2]+input_symbol[4*i+3];
	  Get_ri(i,a,k);
	}
}

void De_16PSK()
{	
	
	double b;
	int i;
	for(i=0;i<4;i++)
	{
		b=imagine_signal[i]/real_signal[i];
		double sita=atan(b);
		if(real_signal[i]<=0 && imagine_signal[i]>0)
			sita=sita+pi;
		else if(real_signal[i]<0 && imagine_signal[i]<=0)
			sita=pi+sita;
		else if(real_signal[i]>0 && imagine_signal[i]<=0)
			sita=2*pi+sita;
		int temp=int(sita*8/pi);
		temp=Dec2Geray(temp);
		output_symbol[4*i+3]=temp%2;
		output_symbol[4*i+2]=temp/2%2;
		output_symbol[4*i+1]=temp/4%2;
		output_symbol[4*i]=temp/8%2;
	}
}

void Decoder()
{
	int s[3];
	for(int i=0;i<4;i++)
	{
		s[0]=character[7*i]^character[7*i+2]^character[7*i+3]^character[7*i+6];//s3
		s[1]=character[7*i]^character[7*i+1]^character[7*i+3]^character[7*i+5];//s2
		s[2]=character[7*i]^character[7*i+1]^character[7*i+2]^character[7*i+4];//s1
	    output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];
		if(s[2]==0&&s[1]==1&&s[0]==1)
			output_symbol[4*i+3]=1-output_symbol[4*i+3];
		else
			if(s[2]==1&&s[1]==0&&s[0]==1)
			output_symbol[4*i+2]=1-output_symbol[4*i+2];
		else
			if(s[2]==1&&s[1]==1&&s[0]==0)
			output_symbol[4*i+1]=1-output_symbol[4*i+1];
		else
			if(s[2]==1&&s[1]==1&&s[0]==1)
			output_symbol[4*i]=1-output_symbol[4*i];
	}

}
/*
void Decoder()
{
	int s[3];
	for(int i=0;i<4;i++)
	{	s[2]=character[7*i]^character[7*i+1]^character[7*i+4];
		s[1]=character[7*i+1]^character[7*i+2]^character[7*i+3]^character[7*i+5];
		s[0]=character[7*i]^character[7*i+1]^character[7*i+3]^character[7*i+6];
		
	    if(s[2]==0&&s[1]==1&&s[0]==1)
	   {character[7*i+3]=character[7*i+3]^1;
	    output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];}
	   else if(s[2]==1&&s[1]==0&&s[0]==1)
		{character[7*i+2]=character[7*i+2]^1;
	    output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];}
	   else if(s[2]==1&&s[1]==1&&s[0]==0)
		{character[7*i+1]=character[7*i+1]^1;
	    output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];}
		else if(s[2]==1&&s[1]==1&&s[0]==1)
		{character[7*i]=character[7*i]^1;
	    output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];}
		else 
		{output_symbol[4*i]=character[7*i];
		output_symbol[4*i+1]=character[7*i+1];
		output_symbol[4*i+2]=character[7*i+2];
		output_symbol[4*i+3]=character[7*i+3];}
	}
}
*/
void Mod_QPSK(double k)
{
	for(int i=0;i<14;i++)
	{
	if (character[2*i]==0 && character[2*i+1]==0)
	{real_signal[i]=1*k;imagine_signal[i]=1*k;}
	else if(character[2*i]==0 && character[2*i+1]==1)
		{real_signal[i]=(-1)*k;imagine_signal[i]=1*k;}
	else if(character[2*i]==1 && character[2*i+1]==1)
		{real_signal[i]=(-1)*k;imagine_signal[i]=(-1)*k;}
	else {real_signal[i]=1*k;imagine_signal[i]=(-1)*k;}
	}
}
void De_QPSK()
{   
	for(int i=0;i<14;i++)
    {
    if (real_signal[i]>0&&imagine_signal[i]>=0)
	{character[2*i]=0;character[2*i+1]=0;}
	else if(real_signal[i]<=0&&imagine_signal[i]>0)
		{character[2*i]=0;character[2*i+1]=1;}
	else if(real_signal[i]<0&&imagine_signal[i]<=0)
		{character[2*i]=1;character[2*i+1]=1;}
	else {character[2*i]=1;character[2*i+1]=0;}
	}
}

⌨️ 快捷键说明

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