📄 sefade.cpp
字号:
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
#include "Sefade.h"
#define pi 3.1415926535897932384626433832795
Sefade::Sefade()
{
}
Sefade::~Sefade()
{
}
void Sefade::sefd(double *idt,double *qdt,int *itau,double *dlvl,double *th,int n0,double *itn,int n1,int nsamp,double tstp,double fd,double flat,double *ramp)
{
int a,b,c=0;
double total_attn,atts;
double *idata,*qdata,*iout,*qout;
idata=new double [nsamp];
qdata=new double [nsamp];
iout=new double [nsamp];
qout=new double [nsamp];
for(a=0;a<nsamp;a++)
{
*(iout+a)=0;
*(qout+a)=0;
*(ramp+a)=0;
}
total_attn=0;
for(a=0;a<n1;a++) total_attn=total_attn+pow(10,(0.1*dlvl[a]));
for(a=0;a<n1;a++)
{
for(b=0;b<nsamp;b++)
{
*(idata+b)=*(idt+b);
*(qdata+b)=*(qdt+b);
}
atts=pow(10,(0.05*dlvl[a]));
if(dlvl[a]<=-40.0)
atts=0.0;
delay(idata,qdata,nsamp,itau[a]);
fade(idata,qdata,nsamp,tstp,fd,n0,itn[a],flat);
for(b=0;b<nsamp;b++)
{
iout[b]=iout[b]+atts*idata[b]/sqrt(total_attn);
qout[b]=qout[b]+atts*qdata[b]/sqrt(total_attn);
}
}
for(b=0;b<nsamp;b++)
{
*(th+b)=atan2(qout[b],iout[b])+3.14159;
*(ramp+b)=sqrt(pow(*(iout+b),2)+pow(*(qout+b),2));
*(idt+b)=*(iout+b);
*(qdt+b)=*(qout+b);
}
delete [] idata;
delete [] qdata;
delete [] iout;
delete [] qout;
}
void Sefade::fade(double *idata,double *qdata,int nsamp,double tstp,double fd,int n0,double counter,double flat)
{
double ac0,as0,N;
double *ic,*cwn,*cwmt,*xc,*xs,*iout,*qout;
int n;
ic=new double [nsamp];
cwn=new double [nsamp];
cwmt=new double [nsamp];
xc=new double [nsamp];
xs=new double [nsamp];
iout=new double [nsamp];
qout=new double [nsamp];
if(fd!=0.0)
{
ac0=sqrt(1.0/(2.0*((double)n0+1)));//power normalized constant(ich)
as0=sqrt(1.0/(2.0*(double)n0));//power normalized constant(qch)
N=4*n0+2;
for(i=0;i<nsamp;i++)
{
*(xc+i)=0;
*(xs+i)=0;
*(ic+i)=(double)counter+i+1;
}
for(i=0;i<nsamp;i++)
{
for(n=1;n<=n0;n++)
{
cwn[i]=cos(cos(2.0*pi*(double)n/N)*ic[i]*2.0*pi*fd*tstp);
xc[i]=xc[i]+cos(pi*(double)n/n0)*cwn[i];
xs[i]=xs[i]+sin(pi*(double)n/n0)*cwn[i];
}
}
for(i=0;i<nsamp;i++)
{
cwmt[i]=sqrt(2.0)*cos(ic[i]*2.0*pi*fd*tstp);
xc[i]=(2.0*xc[i]+cwmt[i])*ac0;
xs[i]=2.0*xs[i]*as0;
if(flat==1)
{
iout[i]=sqrt(pow(xc[i],2)+pow(xs[i],2))*idata[i];
qout[i]=sqrt(pow(xc[i],2)+pow(xs[i],2))*qdata[i];
}
else
{
iout[i]=xc[i]*idata[i]-xs[i]*qdata[i];
qout[i]=xs[i]*idata[i]+xc[i]*qdata[i];
}
}
for(i=0;i<nsamp;i++)
{
*(idata+i)=*(iout+i);
*(qdata+i)=*(qout+i);
}
}
delete [] ic;
delete [] cwn;
delete [] cwmt;
delete [] xc;
delete [] xs;
delete [] iout;
delete [] qout;
}
void Sefade::delay(double *idata,double *qdata,int nsamp,int idel)
{
double *iout,*qout;
iout=new double [nsamp];
qout=new double [nsamp];
for(i=0;i<nsamp;i++)
{
*(iout+i)=0;
*(qout+i)=0;
}
if(idel!=0)
{
for(i=0;i<idel;i++)
{
*(iout+i)=0;
*(qout+i)=0;
}
for(i=idel;i<nsamp;i++)
{
*(iout+i)=*(idata+i-idel);
*(qout+i)=*(qdata+i-idel);
}
for(i=0;i<nsamp;i++)
{
*(idata+i)=*(iout+i);
*(qdata+i)=*(qout+i);
}
}
delete [] iout;
delete [] qout;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -