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

📄 cdma1.cpp

📁 简单的cdma基础仿真
💻 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 + -