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

📄 transmitter.cpp

📁 单用户多载波mccdma的仿真
💻 CPP
字号:

#include <iostream>
using namespace std;
#include <complex>
#include "transmitter.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include<math.h>
#include<fstream>
#define PI 3.1415926535
#define sqr(x) ((x)*(x))
#define x1 100
void transmitter::StartFdomaintransmit ( )
{
	//int a[1000],b[1000]={0},ab[100][100],c[1000]={0},d[1000]={0},cd[100][100],z[100]={0},i,j,k,N2x;
	//FILE *fp;
	int i,j,k,N=10,n=3;
	double ni,nq;
	double n1,snr=2;
    complex<double> *TD=new complex<double>[12800];
    complex<double> *FD=new complex<double>[12800];
//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;
 n1=log(Fspreadfactor)/log(2);
Userbit=new int[10000];
//////////这是测试数据/////////////////////
//for(i=0;i<1000;i++)
  //  Userbit[i]=-1;
 random(numberofuserbit);
   /*  cout<<"单双极性变换"<<"\n";
for(i=0; i<numberofuserbit; i++)
    cout<<Userbit[i]<<" ";
   cout<<"\n";*/
   ///////////////////////////
   Mseq=new int[10000];
M_seq(n);
/*cout<<"M序列"<<"\n";
for(i=0; i<100; i++)
    cout<<Mseq[i] <<" ";
   cout<<"\n";*/
////////////////////////////
   SpreadOut=Allocate2DArray(x1,10000);           //动态2维数组分配内存
F_domainSpread(Fspreadfactor);
delete Mseq;
//////////////text////////
//for(i=0;i<Fspreadfactor;i++)
 //{for(j=0;j<numberofuserbit;j++) 
 //SpreadOut[i][j]*=1.0/Fspreadfactor;

//
 // }
//////////////////////////
/* cout<<"扩频"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit;j++) 
    cout<<SpreadOut[i][j]<<" ";
 cout<<"\n";
}*/

//////////////////////////////
Ireal=Allocate2DArray(x1,10000);                       //动态2维数组分配内存
Qimag=Allocate2DArray(x1,10000);                      //动态2维数组分配内存
QPSK(Fspreadfactor);
DeAllocate2DArray(SpreadOut,x1);                //删除内存
/* cout<<"I支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
  
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<<Ireal[i][j]<<" ";
    cout<<"\n";
}   
 cout<<"Q支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<<Qimag[i][j]<<" ";
    cout<<"\n";
}  */
 

IFFTrealout=Allocate2DArray(x1,10000);                       //动态2维数组分配内存
IFFTimagout=Allocate2DArray(x1,10000);                      //动态2维数组分配内存
 //cout<<"--------------IFFT变换-------------------";
 //cout<<"\n";
for(i=0;i<numberofuserbit/2+numberofuserbit%2;i++)
{for( k=0;k<Fspreadfactor;k++)
 FD[k]=complex<double>(Ireal[k][i], Qimag[k][i]); 
  for( k=0;k<Fspreadfactor;k++)
 //cout<<FD[k].real()<<"+ "<<FD[k].imag()<<"i   ";
  //cout<<"\n------------------\n";
FFT(TD,FD,int(n1+0.5),-1);

  for( k=0;k<Fspreadfactor;k++)
  {IFFTrealout[k][i]=TD[k].real();
   IFFTimagout[k][i]=TD[k].imag();
  }

}
DeAllocate2DArray(Ireal,x1);                                   //删除内存
DeAllocate2DArray(Qimag,x1);                                   //删除内存
/*cout<<"I支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)                                  
  
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<<IFFTrealout[i][j]<<" ";
    cout<<"\n";
}   
 cout<<"Q支路"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<<IFFTimagout[i][j]<<" ";
    cout<<"\n";
} */


}
/////////////////////////////////////////////////////////
//                                                  /////
//                    产生随机数                   ///////
//////////////////////////////////////////////////////////
void transmitter::random(int bitnumber)
{  int i;
   time_t t;
   srand((unsigned) time(&t));
   
   for(i=0; i<bitnumber; i++)
   {  Userbit[i]=rand() % (2);
   
  
   }
   /* cout<<"原始数据"<<"\n";
for(i=0; i<numberofuserbit; i++)
    cout<<Userbit[i]<<" ";
   cout<<"\n";*/
   /////////////////单双极性变换/////////////////
   for(i=0;i<bitnumber;i++)
   {  Userbit[i]=Userbit[i]*2-1;
     // Userbit[i]=Userbit[i];
   }

}
/////////////////////////////////////////////////////////
//                                                  /////
//                    产生m序列扩频码             ///////
//////////////////////////////////////////////////////////
	void transmitter::M_seq(int n)
    {
		int zita[8200],i,k,N;
		N=int(pow(2,n)-1);
	for(i=0;i<n;i++)                    //对zita[k]赋初值
	{
      zita[i]=1;
	   Mseq[i]=1;
    }
	
	switch(n)
	{
	case 2: 
		    for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-1];	
               Mseq[k]=(2*zita[k]-1);
			 // cout<<Mseq[k]<<"  ";
			 
            }
		    break;
case 3: 
		    for(k=n;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-2];	
               Mseq[k]=(2*zita[k]-1);
			   //cout<<Mseq[k]<<"  ";
			    
            }
		    break;
	case 4:
		    for(k=n;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-3];	
               Mseq[k]=(2*zita[k]-1);
			  // cout<<Mseq[k]<<"  ";
			   
            }
		    break;
	case 5:
		    for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-3];	
               Mseq[k]=(2*zita[k]-1);
			  // cout<<Mseq[k]<<"  ";
			  
            }
		    break;
	case 6:
		     for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-5];	
               Mseq[k]=(2*zita[k]-1);
			  // cout<<Mseq[k]<<"  ";
			    
            }
		    break;
	case 7:
		    for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-4];	
               Mseq[k]=(2*zita[k]-1);
			  // cout<<Mseq[k]<<"  ";
			    
            }
		    break;
	case 9: 
		     for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-5];	
               Mseq[k]=(2*zita[k]-1);
			  // cout<<Mseq[k]<<"  ";
			   
            }
		    break;
	case 10: 
		     for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-7];	
               Mseq[k]=(2*zita[k]-1);
			 //  cout<<Mseq[k]<<"  ";
			   
            }
		    break;
	case 11:
		    for(k=n+1;k<=2041;k++)
			{
               zita[k]=zita[k-n]^zita[k-9];	
               Mseq[k]=(2*zita[k]-1);
			 //  cout<<Mseq[k]<<"  ";
			   
            }
		    break;   
	case 8:
		    for(k=n+1;k<=2047;k++)
			{
               zita[k]=zita[k-n]^zita[k-7]^zita[k-6]^zita[k-1];
               Mseq[k]=(2*zita[k]-1);
			 //  cout<<Mseq[k]<<"  "; 
			    
			}
			break;
	case 12:
		    for(k=n+1;k<=N;k++)
			{
               zita[k]=zita[k-n]^zita[k-8]^zita[k-5]^zita[k-1];
               Mseq[k]=(2*zita[k]-1);
			 //  cout<<Mseq[k]<<"  "; 
			   
			}
			break;
	case 13:
		    for(k=n+1;k<=N;k++)
			{
               zita[k]=zita[k-n]^zita[k-8]^zita[k-6]^zita[k-1];
               Mseq[k]=(2*zita[k]-1);
			//   cout<<Mseq[k]<<"  "; 
			    
			}
			break;
	default: 
		    cout<<"请重新输入2到13之间的数:";
			}
	}
/////////////////////////////////////////////////////////
//                                                  /////
//                    进行频域扩频                  ///////
//////////////////////////////////////////////////////////
void transmitter::F_domainSpread(int factor)
{
int **ab,i,j;
 ab=intAllocate2DArray(x1,10000); 
   //////////////复制///////////////
   for(i=0;i<factor;i=i++)
     for(j=0;j<numberofuserbit;j++)
    ab[i][j]= Userbit[j];
  //////////////////////
/*	    cout<<"复制"<<"\n";
 for(i=0; i<factor; i++)
 {for(j=0; j<numberofuserbit; j++)
   cout<<ab[i][j]<<" ";
  cout<<"\n";
 }  
 cout<<"\n";*/
   /////////////////////扩频///////////
 for(i=0;i<factor;i++)
 {for(j=0;j<numberofuserbit;j++) 
  SpreadOut[i][j]=ab[i][j]*Mseq[i];
SpreadOut[i][j]=0;

  }
intDeAllocate2DArray(ab,x1);                                   //删除内存
}

/////////////////////////////////////////////////////////
//                 调制                             /////
//                 qpsk                              ///
///               星座点映射                       /////
//////////////////////////////////////////////////////////
void transmitter::QPSK(int factor)
{
  int i,j,k;
for(k=0;k<factor;k++)
  for(i=1;i<numberofuserbit/2+1+numberofuserbit%2;i++)
  {  if(SpreadOut[k][i*2-2]+2*SpreadOut[k][2*i-1]==-3.0) Ireal[k][i-1]=1.0*sqrt(2)/2,Qimag[k][i-1]=1*sqrt(2)/2;
     else if(SpreadOut[k][i*2-2]+2*SpreadOut[k][2*i-1]==-1.0) Ireal[k][i-1]=1.0*sqrt(2)/2,Qimag[k][i-1]=-1*sqrt(2)/2;
	 else if(SpreadOut[k][i*2-2]+2*SpreadOut[k][2*i-1]==1.0) Ireal[k][i-1]=-1.0*sqrt(2)/2,Qimag[k][i-1]=1*sqrt(2)/2;
	 else if(SpreadOut[k][i*2-2]+2*SpreadOut[k][2*i-1]==3.0) Ireal[k][i-1]=-1.0*sqrt(2)/2,Qimag[k][i-1]=-1*sqrt(2)/2;
  }
////////////////////////
  //cout<<SpreadOut[0][10];
 /*cout<<"调相"<<"\n";
 for(k=0;k<factor;k++)
  
{ for(i=1;i<numberofuserbit/2+1+numberofuserbit%2;i++) 
    cout<<SpreadOut[k][i*2-2]+2*SpreadOut[k][2*i-1]<<" ";
    cout<<"\n";
}   */
 
}
/////////////////////////////////////////////////////////
//                                                 ///
///               IFFT变换                        /////
//////////////////////////////////////////////////////////

void transmitter::FFT(complex<double> * TimeDomain, complex<double> * FreqDomain, int ex,int sign)
{
	
	long Nfft;        //进行傅立叶变换的数据个数
	int	i,j,k;     //定义循环变量
	int	Block;     //划分子块的大小
	int OffSet;    //计算偏移量
	double Angle;  //相位角度
	complex<double> *Wn,*Temp1,*Temp2,*Temp; //定义数据指针

	Nfft = 1 << ex; // 计算付立叶变换点数
	
	// 分配运算所需存储器
	Wn  = new complex<double>[Nfft / 2];
	Temp1 = new complex<double>[Nfft];
	Temp2 = new complex<double>[Nfft];
	
	for(i = 0; i < Nfft / 2; i++) //计算加权系数Wn
	{
		Angle = -i * PI * 2 / Nfft;  //计算相应的角度
		Wn[i] = complex<double> (cos(Angle), sin(Angle)); //计算对应的复数
	}

	for(j = 0; j < Nfft; j++)            //重新排列傅立叶变换结果的次序
	{
		OffSet = 0;                   //初始化原来的数据处理后的新位置
		for(i = 0; i < ex; i++)       //对位置序号的二进制进行倒序反转
		{
			if (j&(1<<i))             //提取二进制的位信息
			{
				OffSet+=1<<(ex-i-1);  //反转二进制位序
			}
		}
	   if(sign==1)	 Temp1[j]=TimeDomain[OffSet]; 
	   else {
		   Temp1[j]=FreqDomain[OffSet];
	   
	      // -imag (Temp1[j])->imag (Temp1[j]);
	    
		     Temp1[j]= complex<double> (real(Temp1[j]), -imag(Temp1[j]))  ;                      //按照新位序将结果重排
	         }     
	   
     	}

	// 采用时间抽取的蝶形算法进行快速傅立叶变换
	for(k = 0; k < ex; k++)  //迭代次数
	{
		for(j = 0; j < 1 << (ex-k-1); j++)  //每次迭代分块
		{
			Block = 1 << (k+1);  //块内数据量
			for(i = 0; i < Block / 2; i++)  //块内进行蝶形计算
			{
				OffSet = j * Block;  //计算偏移量
				Temp2[i + OffSet] = Temp1[i + OffSet] + Temp1[i + OffSet + Block / 2] * Wn[i * (1<<(ex-k-1))]; // A=a+b*Wn
				Temp2[i + OffSet + Block / 2] = Temp1[i + OffSet] - Temp1[i + OffSet + Block / 2] * Wn[i * (1<<(ex-k-1))]; //B=a-b*Wn
			}
		}
		Temp = Temp1;    Temp1 = Temp2;    Temp2 = Temp;    //交换操作和结果数据的指针
	}
	

	for(j = 0; j < Nfft; j++)  //将结果赋给频域数组
	{
		if(sign==1)  FreqDomain[j]=Temp1[j];
		else {
		//	real(TimeDomain)=real(Temp1[j])/Nfft;
        //    imag(TimeDomain)=-imag(Temp1[j])/Nfft;
			
           TimeDomain[j]=complex<double> (real(Temp1[j])/Nfft, -imag(Temp1[j])/Nfft);
		}
		
	}



	//释放内存
	delete Wn;
	delete Temp1;
	delete Temp2;
}
// --------------------------------------------------------------------------
// 动态分配二维数组
// 使用方法(以int类型8行10列为例): int **dyarr = Allocate2DArray<int>(8,10)
//template<double>
 double ** transmitter::  Allocate2DArray(size_t pm_Rows, size_t pm_Cols)
{
    double **arr = new double*[pm_Rows];
    for (int i = 0; i < pm_Rows; i++)
        arr[i] = new double[pm_Cols];
    return arr;
}

// --------------------------------------------------------------------------
// 释放动态分配的二维数组
// 使用方法(以int类型8行10列为例): Allocate2DArray<int>(dyarr,8)
//template<double>
void transmitter::DeAllocate2DArray(double **arr, size_t pm_Rows)
{
    for (int i = 0; i < pm_Rows; i++)
        delete[] arr[i];
    delete[] arr;
}

int ** transmitter::intAllocate2DArray(size_t pm_Rows, size_t pm_Cols)
{
    int **arr = new int*[pm_Rows];
    for (int i = 0; i < pm_Rows; i++)
        arr[i] = new int[pm_Cols];
    return arr;
}

// --------------------------------------------------------------------------
// 释放动态分配的二维数组
// 使用方法(以int类型8行10列为例): Allocate2DArray<int>(dyarr,8)
//template<double>
void transmitter::intDeAllocate2DArray(int **arr, size_t pm_Rows)
{
    for (int i = 0; i < pm_Rows; i++)
        delete[] arr[i];
    delete[] arr;
}

⌨️ 快捷键说明

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