?? cdma1.cpp
字號:
///////////MC-cdma系統///////////
///////////Tb:數據符號的間隔
///////////Tc:擴頻碼的符號間隔
///////////時域擴頻因子N1=Tb/Tc
///////////頻域擴頻因子N2 Tb=Tc
///////////fc 載波頻率
///////////發射周期T=N2*Tb
///////////#f=1/(N2*Tb)
////////
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include<iostream.h>
#include<math.h>
#include<fstream.h>
#include "fft.cpp"
#define N 10
#define Tb 1
#define fc 1
#define N2 8
#define r 8
#define PI 3.1415926535
#define ff (1.0/(N2*Tb))
#define sqr(x) ((x)*(x))
void random(int a[])
{ int i;
time_t t;
srand((unsigned) time(&t));
for(i=0; i<N; i++)
{ a[i]=rand() % (2);
}
}
int main(void)
{
int a[1000],b[1000]={0},ab[100][100],c[1000]={0},d[1000]={0},cd[100][100],z[100]={0},i,j,k;
complex<double> *TD=new complex<double>[1280];
complex<double> *FD=new complex<double>[1280];
double e[1000],f[10000],g[1000]={0},md[10][1000],de[10][1000],ee[10][100]={0},sp[10][100],I[10][100],Q[10][100],rI[10][1000],rQ[10][1000];
double dic[4],min,fI[10][1000],fQ[10][1000],finde[10][1000]={0},n=log(N2)/log(2);
int m[7]={1,1,1,-1,-1,1,-1},M[1000],u=(int)n;
random(a);
/////////////////
cout<<"原始數據"<<"\n";
for(i=0; i<10; i++)
cout<<a[i]<<" ";
cout<<"\n";
///////////系列的生成///////////
for(i=0;i<100;i++)
for(j=0;j<7;j++)
M[7*i+j]=m[j];
/////////////////////////
cout<<"M序列"<<"\n";
for(i=0; i<100; i++)
cout<<M[i]<<" ";
cout<<"\n";
/////////////////單雙極性變換/////////////////
for(i=0;i<100;i++)
b[i]=a[i]*2-1;
//////////////////
cout<<"單雙極性變換"<<"\n";
for(i=0; i<10; i++)
cout<<b[i]<<" ";
cout<<"\n";
//////////////復制///////////////
for(i=0;i<N2;i=i++)
for(j=0;j<10;j++)
ab[i][j]=b[j];
//////////////////////
cout<<"復制"<<"\n";
for(i=0; i<N2; i++)
{for(j=0; j<10; j++)
cout<<ab[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
/////////////////////擴頻///////////
for(i=0;i<N2;i++)
for(j=0;j<10;j++)
cd[i][j]=ab[i][j]*M[i];
////////////////////////
cout<<"相乘"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<10;j++)
cout<<cd[i][j]<<" ";
cout<<"\n";
}
//////////////////調制////////////////
/////////////qpsk///////////////////
////////星座點映射//////////////
for(k=0;k<N2;k++)
for(i=1;i<N/2+1;i++)
{ if(cd[k][i*2-2]+2*cd[k][2*i-1]==-3) I[k][i-1]=1*sqrt(2)/2,Q[k][i-1]=1*sqrt(2)/2;
else if(cd[k][i*2-2]+2*cd[k][2*i-1]==-1) I[k][i-1]=1*sqrt(2)/2,Q[k][i-1]=-1*sqrt(2)/2;
else if(cd[k][i*2-2]+2*cd[k][2*i-1]==1) I[k][i-1]=-1*sqrt(2)/2,Q[k][i-1]=1*sqrt(2)/2;
else if(cd[k][i*2-2]+2*cd[k][2*i-1]==3) I[k][i-1]=-1*sqrt(2)/2,Q[k][i-1]=-1*sqrt(2)/2;
}
////////////////////////
cout<<"調相"<<"\n";
for(k=0;k<N2;k++)
{ for(i=1;i<N/2+1;i++)
cout<<cd[k][i*2-2]+2*cd[k][2*i-1]<<" ";
cout<<"\n";
}
cout<<"I支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<I[i][j]<<" ";
cout<<"\n";
}
cout<<"Q支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<Q[i][j]<<" ";
cout<<"\n";
}
////////////////////////
// cout<<"調制"<<"\n";
// for(i=0;i<N2-1;i++)
//{ for(j=0;j<100;j++)
// cout<<md[i][j]<<" ";
// cout<<"\n";
//}
////////////////////////IFFT變換/////////////
cout<<"\n";
cout<<"--------------IFFT變換-------------------";
cout<<"\n";
for(i=0;i<N/2;i++)
{for( k=0;k<N2;k++)
FD[k]=complex<double>(I[k][i], Q[k][i]);
//fft(TD,FD,n,-1);
// for( k=0;k<N2;k++)
//cout<<FD[k].real()<<"+J"<<FD[k].imag()<<" ";
//cout<<n<<"\n";
// fft(TD,FD,int(n+0.5),1);
// for( k=0;k<N2;k++)
// cout<<FD[k].real()<<"+J"<<FD[k].imag()<<" ";
// cout<<"\n";
fft(TD,FD,int(n+0.5),-1);
// for( k=0;k<N2;k++)
//cout<<TD[k].real()<<"+J"<<TD[k].imag()<<" ";
// cout<<"\n";
for( k=0;k<N2;k++)
{rI[k][i]=TD[k].real();
rQ[k][i]=TD[k].imag();
}
/// fft(TD,FD,int(n+0.5),1);
// for( k=0;k<N2;k++)
//cout<<FD[k].real()<<"+J"<<FD[k].imag()<<" ";
// cout<<"\n";
}
cout<<"I支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<rI[i][j]<<" ";
cout<<"\n";
}
cout<<"Q支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<rQ[i][j]<<" ";
cout<<"\n";
}
////////////// 加噪///////////////////
/////////////FFT變換//////////
cout<<"\n";
cout<<"--------------FFT變換-------------------";
cout<<"\n";
for(i=0;i<N/2;i++)
{for( k=0;k<N2;k++)
TD[k]=complex<double>(rI[k][i], rQ[k][i]);
fft(TD,FD,int(n+0.5),1);
// for( k=0;k<N2;k++)
// cout<<FD[k].real()<<"+J"<<FD[k].imag()<<" ";
// cout<<"\n";
for( k=0;k<N2;k++)
{rI[k][i]=FD[k].real();
rQ[k][i]=FD[k].imag();
}
}
cout<<"I支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<rI[i][j]<<" ";
cout<<"\n";
}
cout<<"Q支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<rQ[i][j]<<" ";
cout<<"\n";
}
//////////////// 解調/////////////////
///////////////計算每個點到每個星座點的最短距離//////////
for(k=0;k<N2;k++)
{ for(i=0;i<N/2;i++)
{
dic[0]=sqrt(sqr(rI[k][i]-1*sqrt(2)/2)+sqr(rQ[k][i]-1*sqrt(2)/2));///0,0///
dic[1]=sqrt(sqr(rI[k][i]+1*sqrt(2)/2)+sqr(rQ[k][i]-1*sqrt(2)/2));///0,1///
dic[2]=sqrt(sqr(rI[k][i]-1*sqrt(2)/2)+sqr(rQ[k][i]+1*sqrt(2)/2));///1,0//
dic[3]=sqrt(sqr(rI[k][i]+1*sqrt(2)/2)+sqr(rQ[k][i]+1*sqrt(2)/2));///1,1//
//cout<<dic[0]<<" ";
min=dic[0];
for(j=0;j<4;j++)
{
if(dic[j]<min)
min= dic[j];
}
if(min==dic[0])
fI[k][i]=1*sqrt(2)/2,fQ[k][i]=1*sqrt(2)/2;
else if(min==dic[1])
fI[k][i]=-1*sqrt(2)/2,fQ[k][i]=1*sqrt(2)/2;
else if(min==dic[2])
fI[k][i]=1*sqrt(2)/2,fQ[k][i]=-1*sqrt(2)/2;
else if(min==dic[3])
fI[k][i]=-1*sqrt(2)/2,fQ[k][i]=-1*sqrt(2)/2;
//cout<<min<<" ";
}
cout<<"\n";
}
/////////////////////////////////////////////
cout<<"解調"<<"\n";
cout<<"I支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<fI[i][j]<<" ";
cout<<"\n";
}
cout<<"Q支路"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N/2;j++)
cout<<fQ[i][j]<<" ";
cout<<"\n";
}
/////////////////////合并IQ兩路///////////////////////////////
for(k=0;k<N2;k++)
for(i=1;i<N/2+1;i++)
{
// cout<<fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)<<" ";
if(fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)>2.5&&fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)<3.5) finde[k][i*2-2]=-1,finde[k][i*2-1]=-1;
else if(fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)>0&&fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)<1.5) finde[k][i*2-2]=-1,finde[k][i*2-1]=1;
else if(fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)>-1.5&&fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)<0) finde[k][i*2-2]=1,finde[k][i*2-1]=-1;
else if(fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)>-3.5&&fI[k][i-1]*sqrt(2)+2*fQ[k][i-1]*sqrt(2)<-2.5) finde[k][i*2-2]=1,finde[k][i*2-1]=1;
//finde[k][i*2-2]=fI[k][i-1]*sqrt(2);
//finde[k][i*2-1]=fQ[k][i-1]*sqrt(2);
//cout<<finde[k][i*2-2]<<" ";
}
cout<<"\n";
////////////////////////////////////////////////////
cout<<"解調合并"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N;j++)
cout<<finde[i][j]<<" ";
cout<<"\n";
}
/////////////////////////////////////////////////
//for(k=0;k<N2-1;k++)
// for(i=0;i<N;i++)
// for(j=0;j<50;j++)
//de[k][j+50*i]=md[k][j+50*i]*cos(j*2*PI/50*(fc+ff*k));
/////////////////////////
// cout<<"解調"<<"\n";
//for(i=0;i<N2-1;i++)
//{ for(j=0;j<100;j++)
// cout<<de[i][j]<<" ";
//cout<<"\n";
//}
///////////////////////////////
// for(k=0;k<N2-1;k++)
// for(j=0;j<N;j++)
// for(i=0;i<50;i++)
// ee[k][j]=ee[k][j]+de[k][i+50*j];
/////////////////////////////////
// cout<<"抽樣"<<"\n";
//for(i=0;i<N2-1;i++)
//{ for(j=0;j<N;j++)
// cout<<ee[i][j]<<" ";
//cout<<"\n";
//}
////////////////////////
// for(k=0;k<N2-1;k++)
// for(i=0;i<N;i++)
// if(ee[k][i]>0) ee[k][i]=1;
// else ee[k][i]=-1;
////////////////////////
// cout<<"解調"<<"\n";
//for(i=0;i<N2-1;i++)
//{ for(j=0;j<N;j++)
// cout<<ee[i][j]<<" ";
// cout<<"\n";
//}
////////////////解擴/////////////////////
for(k=0;k<N2;k++)
for(i=0;i<N;i++)
sp[k][i]=finde[k][i]*M[k];
//for(k=0;k<n2-1;k++)
//for(j=0;j<10;j++)
//for(i=0;i<r;i++)
// sp2[k][j]=sp2[k][j]+sp[k][i+r*j];
//for(i=0;i<10;i++)
// if(de2[i]>0) de2[i]=1;
// else de2[i]=0;
////////////////////////
cout<<"解擴"<<"\n";
for(i=0;i<N2;i++)
{ for(j=0;j<N;j++)
cout<<sp[i][j]<<" ";
cout<<"\n";
}
//////////////////
for(i=0;i<N;i++)
for(k=0;k<N2;k++)
z[i]=z[i]+sp[k][i];
for(i=0;i<N;i++)
if(z[i]>0) z[i]=1;
else z[i]=0;
////////////////////////
cout<<"最終信號"<<"\n";
for(i=0;i<N;i++)
cout<<z[i]<<" ";
cout<<"\n";
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -