?? dcs.cpp
字號(hào):
#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];
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);
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;}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -