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

📄 channel.cpp

📁 单用户dscdma的仿真
💻 CPP
字号:
#include <iostream>
using namespace std;
#include <complex>
#include "channel.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
#define x2 30000
void channel::AWGN ( )
{
int i,j,k;
double ro;
double   seed=(double)time(NULL);
inoise= new double[x2];
SNR=pow(10,SNRdB/10);
SignalPower=0;
//cout<<"------------------------"<<numberofuserbit<<"--------------"<<Fspreadfactor<<"--------------"<<nsamp<<"\n";
//cout<<sqr(ChannelRealIn[0][0]);
for(i=0;i<Fspreadfactor;i++)
for(j=0;j<nsamp;j++) 
{SignalPower=SignalPower+sqr(ChannelRealIn[i][j])+sqr(ChannelImagIn[i][j]);
       
}


//cout<<"ChannelRealIn[0][0]="<<ChannelRealIn[0][10]<<"\n";
//cout<<"SignalPower="<<SignalPower<<"\n";
//cout<<numberofuserbit/Tspreadfactor<<"\n";
SignalPower=SignalPower/((1.0*nsamp)/Tspreadfactor);//符号功率
//SignalPower=1;
//cout<<"((numberofuserbit/2+numberofuserbit%2)/Tspreadfactor)="<<((numberofuserbit/2+numberofuserbit%2)/Tspreadfactor)<<"\n";
//cout<<"SignalPower="<<SignalPower<<"\n";
sigma=0.5*0.5*SignalPower/(SNR);
sigma=sqrt(sigma);
//cout<<"sigma="<<sigma<<"\n";
ro=1;


//for(i=0;i<100;i++)
//cout<<inoise[i]<<"\n";
/*for(i=0;i<Fspreadfactor;i++)
{    for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
		cout<<ChannelImagIn[i][j]<<" ";
        cout<<"\n";
}
*/

randn(inoise,0,ro,seed,2*nsamp*Fspreadfactor);
//for(k=0;k<numberofuserbit*Fspreadfactor;k++)
/*cout<<inoise[k]*sigma<<" \n";
cout<<"\n";
*/
if(rayornot!=0)
{for(i=0;i<Fspreadfactor;i++)
{ 
    for(j=0;j<nsamp;j++) 
	{ChannelRealOut[i][j]=sefadeRealOut[i][j]+inoise[i*Fspreadfactor+j]*sigma;
	   ChannelImagOut[i][j]=sefadeImagOut[i][j]+inoise[i*Fspreadfactor+j+nsamp]*sigma;
//ChannelRealOut[i][j]=ChannelRealIn[i][j];
//	   ChannelImagOut[i][j]=ChannelImagIn[i][j];
	}
}

}
else
{for(i=0;i<Fspreadfactor;i++)
{ 
    for(j=0;j<nsamp;j++) 
	{ChannelRealOut[i][j]=ChannelRealIn[i][j]+inoise[i*Fspreadfactor+j]*sigma;
	   ChannelImagOut[i][j]=ChannelImagIn[i][j]+inoise[i*Fspreadfactor+j+nsamp]*sigma;
//ChannelRealOut[i][j]=ChannelRealIn[i][j];
//	   ChannelImagOut[i][j]=ChannelImagIn[i][j];
	}
}


}

delete [] inoise;
DeAllocate2DArray(sefadeRealOut,x1);                //删除内存
DeAllocate2DArray(sefadeImagOut,x1);                //删除内存
    delete ramp;  
    delete rcos;
    delete rsin;
/*cout<<"I支路加噪"<<"\n";
for(i=0;i<Fspreadfactor;i++)
  
{ for(j=0;j<nsamp;j++) 
    cout<<ChannelRealOut[i][j]<<" ";
    cout<<"\n";
}   
 cout<<"Q支路加噪"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<nsamp;j++) 
    cout<< ChannelImagOut[i][j]<<" ";
    cout<<"\n";
} */

}

/////////////////////////////////////////////////////////
//                                                  /////
//                  产生正态分布的随机数         ///////
//       产生任意均值与方差的n个正态分布随机数     /////
//        函数的参数:mu和ro(μ和σ值)要事先给定。//////
//////////////////////////////////////////////////////////
void channel::randn(double *out,double mu,double ro,double seed,int number)
{
 int i;
 int M;
 M=65536;
 for ( i=0; i<number; i++)
 {
  double rand=0.0;
  for (int j=1; j<=12; j++)    //产生多个[0,1]区间内均匀分布伪随机数
  {
   seed=(seed)*2053+13849;
   seed=(unsigned long)seed%M;   //以65536为模对种子取余
   rand=rand+(seed)/(double)M;
  }
  out[i]=mu+ro*(rand-6.0);
 }

}
/////////////////////////////////////////////////////////
//                                                  /////
//                                                 ///////
//        frequency selecting fade信道            /////
//                                                 //////
//////////////////////////////////////////////////////////
void channel::frequencyselectingfade ( )
{  int i,j,k;
	double *iout,*qout,*itmp,*qtmp,*idata,*qdata,*itmp3,*qtmp3;
	double atts[10],theta[10]; 
    double total_attn=0;
   
   idata=new double[nsamp];
   qdata=new double[nsamp];
   iout=new double[nsamp];
   qout=new double[nsamp];
   for(i=0;i<nsamp;i++)
   {iout[i]=0;
    qout[i]=0;
   }
  for(i=0;i<Fspreadfactor;i++)
   for(j=0;j<nsamp;j++) 
   {  idata[i*(nsamp)+j]=ChannelRealIn[i][j];
	  qdata[i*(nsamp)+j]=ChannelImagIn[i][j];
   }
   for(i=0;i<numberofpath;i++)
   total_attn+=pow(10,(-1.0 * dlvl[i]/ 10.0));
   //cout<<"total_attn="<<total_attn<<"\n";
  for(k=0;k<numberofpath;k++)
  {  atts[k]=pow(10,(-0.05*dlvl[k]));
	  if (dlvl[k]>=40.0) atts[k]=0.0;
	  theta[k]=th[k]*PI/180.0;
      itmp=new double[nsamp];
      qtmp=new double[nsamp];
	  delay ( idata,qdata,itmp,  qtmp,itau[k]);               //delay 函数
//cout<<"\n";	  
/*cout<<"支路延迟"<<"\n";
for(i=0;i<nsamp;i++)
	   {
	     cout<<itmp[i]<<" ";
       
      
	   }*/
     delete idata;
    delete  qdata;
     itmp3=new double[nsamp];
     qtmp3=new double[nsamp];
      Rayleighfade(itmp,qtmp,itmp3,qtmp3,itn[k],n0[k]);  //Rayleighfade函数
	/*  cout<<"\n";	
cout<<"支路瑞丽"<<"\n";
for(i=0;i<nsamp;i++)
	   {
	     cout<<itmp3[i]<<" ";
       
      
	   }*/

     delete itmp;
     delete qtmp;
	 for(i=0;i<nsamp;i++)
	 {iout[i]=iout[i]+atts[k]*itmp3[i]/sqrt(total_attn); 
      qout[i]=qout[i]+atts[k]*qtmp3[i]/sqrt(total_attn); 
	 }
  /*cout<<"\n";	
   cout<<"支路瑞丽2"<<"\n";
   for(i=0;i<nsamp;i++)
	   {
	     cout<<iout[i]<<" ";
       
      
	   }
*/
     delete itmp3;
     delete qtmp3;
  }
sefadeRealOut=Allocate2DArray(x1,10000);           //动态2维数组分配内存
sefadeImagOut=Allocate2DArray(x1,10000);           //动态2维数组分配内存
  for(i=0;i<Fspreadfactor;i++)
   for(j=0;j<nsamp;j++) 
   {  sefadeRealOut[i][j]=iout[i*(numberofuserbit/2+numberofuserbit%2)+j];
	  sefadeImagOut[i][j]=qout[i*(numberofuserbit/2+numberofuserbit%2)+j];
   }
delete iout;
delete qout;
//cout<<"\n";
/*cout<<"I支路多径"<<"\n";
for(i=0;i<Fspreadfactor;i++)
  
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<<sefadeRealOut[i][j]<<" ";
    cout<<"\n";
}   
 cout<<"Q支路多径"<<"\n";
for(i=0;i<Fspreadfactor;i++)
{ for(j=0;j<numberofuserbit/2+numberofuserbit%2;j++) 
    cout<< sefadeImagOut[i][j]<<" ";
    cout<<"\n";
} */

}
/////////////////////////////////////////////////////////
//                                                  /////
//                                                 ///////
//                 Rayleighfade信道                /////
//                                                 //////
//////////////////////////////////////////////////////////
void channel::Rayleighfade (double *itmp,double *qtmp,double *itmp3, double *qtmp3,double counter,int no)
{

double as0,ac0,ic0,wm,n,ts,wmts,paino;
double *xc,*xs,*ic,*cwn,*cwmt;
int i,j,k,nn;
                   
if (fd!=0.0)  
{   
 
	ac0 = sqrt(1.0 / (2.0*(no + 1)));   //power normalized constant(ich)
    as0 = sqrt(1.0 / (2.0*no));         //power normalized constant(qch)
    ic0 = counter;                        //fading counter 
    wm = 2.0*PI*fd;
	//cout<<"\n"<<wm;
    n = 4*no + 2;
	//cout<<"\n"<<n;
    ts = tstp;
    wmts = wm*ts;
	//cout<<"\n"<<wmts;
    paino = PI/no;
//cout<<"\n"<<paino;
	ic=new double[nsamp];
    xc=new double[nsamp];
    xs=new double[nsamp];
    cwn=new double[nsamp];
	cwmt=new double[nsamp];
	for(i=0;i<nsamp;i++)
	{ xc[i]=0;
      xs[i]=0;
    }
    for(i=0;i<nsamp;i++)
        ic[i]=i+ic0;
    for (nn = 1;nn<no+1; nn++)
	  for(i=0;i<nsamp;i++)
	  {cwn[i] = cos( cos(2.0*PI*nn/n)*ic[i]*wmts );
	    xc[i] = xc[i] + cos(paino*nn)*cwn[i];
		//cout<<"\n"<<"cwn[i]="<<cwn[i]<<" ";
	    xs[i] = xs[i] + sin(paino*nn)*cwn[i];
      }
	 for(i=0;i<nsamp;i++)
	  {//cout<<"\n"<<"cos(paino*nn)*cwn[i]="<<cos(paino*nn)*cwn[i]<<" ";
		 //cout<<"\n"<<"cwn[i]1="<<cwn[i]<<" ";
	//	cout<<"\n"<<"xc[i]1="<<xc[i]<<" ";
		 //cout<<"\n"<<"xs[i]="<<xs[i]<<" ";
	    
      }
	for(i=0;i<nsamp;i++)
	  {
        cwmt[i] = sqrt(2.0)*cos(ic[i]*wmts);
        xc[i] = (2.0*xc[i] + cwmt[i])*ac0;
        xs[i] = 2.0*xs[i]*as0;
      }
    for(i=0;i<nsamp;i++)
	  {//cout<<"\n"<<"cwn[i]1="<<cwn[i]<<" ";
		 //cout<<"\n"<<"xc[i]="<<xc[i]<<" ";
		 //cout<<"\n"<<"xs[i]="<<xs[i]<<" ";
	    
      }


        ramp=new double[nsamp];  
        rcos=new double[nsamp];
        rsin=new double[nsamp];
      for(i=0;i<nsamp;i++)
      {  ramp[i]=sqrt(sqr(xc[i])+sqr(xs[i]));
         rcos[i]=xc[i]/ramp[i];
         rsin[i]=xs[i]/ramp[i];
      }
     /*for(i=0;i<nsamp;i++)
      { cout<<"\n"<<"ramp[i]="<<ramp[i]<<" ";
        
      }*/

     if(flat==1)
	 { for(i=0;i<nsamp;i++)
		{
		 itmp3[i]=sqrt(sqr(xc[i])+sqr(xs[i]))*itmp[i]; 
		 qtmp3[i]=sqrt(sqr(xc[i])+sqr(xs[i]))*qtmp[i];
        }
	 }
     else
	 {
       for(i=0;i<nsamp;i++)
	   {
	     itmp3[i]=xc[i]*itmp[i]-xs[i]*qtmp[i];
         qtmp3[i]=xs[i]*itmp[i]+xc[i]*qtmp[i];
      
	   }
	 }
	
	 delete ic;
    delete xc;
    delete xs;
    delete cwn;
	delete cwmt;

  
}
 else
 {for(i=0;i<nsamp;i++)
  { itmp3[i]=itmp[i];
    qtmp3[i]=qtmp[i];
  }
 }

}
/////////////////////////////////////////////////////////
//                                                  /////
//                                                 ///////
//                 产生delay                          /////
//                                                 //////
//////////////////////////////////////////////////////////
void channel::delay (double *idata,double *qdata,double *itmp,double *qtmp,int idel)  
{
	int i;
  if(idel!=0)
   for(i=0;i<idel;i++)
	{itmp[i]=0;
     qtmp[i]=0; 
    }
  
   for(i=0;i<nsamp-idel;i++)
   { itmp[i+idel]=idata[i];
     qtmp[i+idel]=qdata[i];
   }
}

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

int ** channel::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 channel::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 + -