📄 modbaseclass.cpp
字号:
// ModBaseClass.cpp: implementation of the ModBaseClass class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "mod_demod.h"
#include "ModBaseClass.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ModBaseClass::ModBaseClass(CString pnameModel,CString ptypeModel,
long vmodelSampleFreq, long vinputSampleFreq,
int vtimeStep, CString pnameGetDataFile,
CString pnamePutDataFile, double vampCarrier,
long vfreqCarrier, double vphaseCarrier,
double vModPara)
{
nameModel=pnameModel;
typeModel=ptypeModel;
modelSampleFreq=vmodelSampleFreq;
inputSampleFreq=vinputSampleFreq;
timeStep=vtimeStep;
nameGetDataFile=pnameGetDataFile;
namePutDataFile=pnamePutDataFile;
ampCarrier=vampCarrier;
freqCarrier=vfreqCarrier;
phaseCarrier=vphaseCarrier;
ModPara=vModPara;
}
ModBaseClass::~ModBaseClass()
{
}
float *ModBaseClass::getData(CString filename,long start_point,long num_of_points)
{
//函数功能:将文件中的数据读到一个指针中,并返回该指针
//filename:文件
//start_point,起始位置
//num_of_points,数据点数
//若读取成功,则返加一个非空指针,否则,返回一个空指针
CFile inf(filename,CFile::modeRead);
float *fpointer;
long num_of_data;
if (!inf) return NULL;
num_of_data=inf.GetLength()/sizeof(float);
if ((start_point<=0)||(num_of_points<=0)||
(num_of_points>num_of_data)||
(start_point>num_of_data)||
(start_point+num_of_points-1>num_of_data))
return NULL;
fpointer=(float *) malloc(num_of_points*sizeof(float));
if (!fpointer) return NULL;
if(inf.Seek(CFile::begin,(start_point-1)*sizeof(float))!=
(start_point-1)*sizeof(float))
return NULL;
if (inf.ReadHuge(fpointer,num_of_points*sizeof(float))!=num_of_points*sizeof(float))
{
inf.Close();
return NULL;
}
else {
inf.Close();
return fpointer;
}
}
//////////////////////////////
bool ModBaseClass::putData(float *outdata,CString out_put_filename,long length)
{
//函数功能:保存数据
//outdata:指向待保存的数据的指针,以END_FLAG作为结束标志
//out_put_filename:保存数据的文件名
//length,数据长度
//若保存成功,则返回TRUE,否则返回FALSE
CFile outf(out_put_filename,
CFile::modeCreate|CFile::modeWrite);
if (!outf) return FALSE;
outf.WriteHuge(outdata,length*sizeof(float));
outf.Close();
return TRUE;
}
void ModBaseClass::fht(float *x,long n)
{
long i,j,k,m,l1,l2,l3,l4,n1,n2,n4;
double a,e,c,s,t,t1,t2;
for(j=1,i=1;i<32;i++)
{
m=i;
j=2*j;
if(j==n)
break;
}
n1=n-1;
for(j=0,i=0;i<n1;i++)
{
if(i<j)
{
t=*(x+j);
*(x+j)=*(x+i);
*(x+i)=t;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=0;i<n;i+=2)
{
t=*(x+i);
*(x+i)=t+(*(x+i+1));
*(x+i+1)=t-(*(x+i+1));
}
n2=1;
for(k=2;k<=m;k++)
{
n4=n2;
n2=n4+n4;
n1=n2+n2;
e=6.283185307179586/n1;
for(j=0;j<n;j+=n1)
{
l2=j+n2;
l3=j+n4;
l4=l2+n4;
t=*(x+j);
*(x+j)=t+(*(x+l2));
*(x+l2)=t-(*(x+l2));
t=*(x+l3);
*(x+l3)=t+(*(x+l4));
*(x+l4)=t-(*(x+l4));
a=e;
for(i=1;i<n4;i++)
{
l1=j+i;
l2=j-i+n2;
l3=l1+n2;
l4=l2+n2;
c=cos(a);
s=sin(a);
t1=*(x+l3)*c+(*(x+l4))*s;
t2=*(x+l3)*s-(*(x+l4))*c;
a=(i+1)*e;
t=*(x+l1);
*(x+l1)=t+t1;
*(x+l3)=t-t1;
t=*(x+l2);
*(x+l2)=t+t2;
*(x+l4)=t-t2;
}
}
}
}
bool ModBaseClass::hilbth(float *x,long n,CString out_put_filename)
{
//希尔波特变换
//x,指向等待进行变换的数据
//n,数据点数
//out_put_filename,卷积后保存输出数据的文件名
//若成功,返回TRUE,否则,返回FALSE
long i,n1,n2;
double t;
bool flag;
long temp_n;
temp_n=1;
while(temp_n<n) temp_n*=2;
if(temp_n>n)
{
x=(float *)realloc(x,temp_n*sizeof(float));
if(!x)
{
free(x);
return FALSE;
}
for(i=n;i<temp_n;i++)
*(x+i)=0;
n1=n;
n=temp_n;
temp_n=n1;
flag=TRUE;
}
else flag=FALSE;
n1=n/2;
n2=n1+1;
fht(x,n);
for(i=1;i<n1;i++)
{
t=*(x+i);
*(x+i)=*(x+n-i);
*(x+n-i)=t;
}
for(i=n2;i<n;i++)
*(x+i)=-(*(x+i));
*x=0.0;
*(x+n1)=0.0;
fht(x,n);
t=1.0/n;
for(i=0;i<n;i++)
*(x+i)*=t;
if(flag)
{
x=(float *)realloc(x,(temp_n*sizeof(float)));
if(!x)
{
free(x);
return FALSE;
}
}
if(putData(x,out_put_filename,temp_n)==FALSE)
return FALSE;
free(x);
return TRUE;
}
/////////////////////////////////////////
float *ModBaseClass::firwin(int n,int band,double fln,double fhn,int wn)
{
//n 滤波器的阶数
//band 滤波器类型,1--低通,2--高通,3--带通,4--带阻
//fln,对于低通和高通滤波器:通带边界频率,对于带通和带阻
//fln:通带下边界频率,fhn:通带上边界频率
//wn 窗函数类型:1--海明窗,2--汉宁窗,3--布拉克曼窗
//h 一个指针,指向返回的h(n)
//若失败,则返回一个空指针(NULL)
int i,n2,mid;
double s,wc1,wc2,delay;
float *h;
h=(float *) malloc((n+1)*sizeof(float));
if(!h) return NULL;
if((n%2)==0)
{
n2=n/2-1;
mid=1;
}
else
{
n2=n/2;
mid=0;
}
delay=n/2.0;
wc1=2.0*pi*fln;
if(band>=3)
wc2=2.0*pi*fhn;
switch(band)
{
case 1:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc1*s)/(pi*s))*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=wc1/pi;
break;
}
case 2:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(pi*s)-sin(wc1*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=1.0-wc1/pi;
break;
}
case 3:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc2*s)-sin(wc1*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=(wc2-wc1)/pi;
break;
}
case 4:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=(wc1+pi-wc2)/pi;
break;
}
}
return h;
}
////////////////////////////////////////////
double ModBaseClass::window(int type,int n,int i)
{
double w;
w=1.0;
switch(type)
{
case 1:
{ w=0.54-0.46*cos(2*i*pi/(n-1));
break;
}
case 2:
{ w=0.5*(1.0-cos(2*i*pi/(n-1)));
break;
}
case 3:
{ w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));
break;
}
}
return(w);
}
/////////////////////////////////////////
void ModBaseClass::convold(CString hfname,CString xfname,CString yfname,long n)
{
long i,j,m,i1,n2,len,num,nblks;
double t;
float *h,*r,*s,*x;
CFile fp,fp1,fp2;
long x_length;
fp1.Open(xfname,CFile::modeRead);
if(!fp1) exit(1);
fp2.Open(yfname,CFile::modeCreate|CFile::modeWrite);
if(!fp1)
{
fp1.Close();
exit(1);
}
x_length=fp1.GetLength()/sizeof(float);
x=(float *)malloc(x_length*sizeof(float));
if(!x)
{
fp1.Close();
fp2.Close();
exit(1);
}
r=(float* )malloc(n*sizeof(float));
if(!r)
{
free(x);
fp1.Close();
fp2.Close();
exit(1);
}
h=(float* )malloc(n*sizeof(float));
if(!h)
{
free(x);
fp1.Close();
fp2.Close();
free(r);
exit(1);
}
n2=n/2;
fp.Open(hfname,CFile::modeRead);
if(!fp)
{
free(x);
fp1.Close();
fp2.Close();
free(r);
free(h);
exit(1);
}
m=fp.GetLength()/sizeof(float);
if(fp.ReadHuge(h,m*sizeof(float))!=m*sizeof(float))
{
free(x);
fp1.Close();
fp2.Close();
free(r);
free(h);
exit(1);
}
fp.Close();
for(i=m;i<n;i++)
{
h[i]=0.0;
}
rfft(h,n);
s=(float* )malloc((m-1)*sizeof(float));
if(!s)
{
free(x);
fp1.Close();
fp2.Close();
free(r);
free(h);
exit(1);
}
for(i=0;i<m-1;i++)
s[i]=0.0;
num=n-m+1;
len=x_length;
if(fp1.ReadHuge(x,len*sizeof(float))!=len*sizeof(float))
{
free(x);
fp1.Close();
fp2.Close();
free(r);
free(h);
exit(1);
}
fp1.Close();
nblks=floor((len-n+m)/(double)num)+1;
for(j=0;j<nblks;j++)
{
for(i=0;i<num;i++)
{
i1=i+j*num;
r[i]=x[i1];
}
for(i=num;i<n;i++)
{
r[i]=0;
}
rfft(r,n);
r[0]=r[0]*h[0];
r[n2]=r[n2]*h[n2];
for(i=1;i<n2;i++)
{
t=h[i]*r[i]-h[n-i]*r[n-i];
r[n-i]=h[i]*r[n-i]+h[n-i]*r[i];
r[i]=t;
}
irfft(r,n);
for(i=0;i<(m-1);i++)
{
r[i]+=s[i];
}
for(i=0;i<num;i++)
{
i1=i+j*num;
x[i1]=r[i];
}
for(i=0;i<(m-1);i++)
{
s[i]=r[i+num];
}
}
i1=j*num;
fp2.WriteHuge((x+(m-1)/2),(i1-(m-1)/2)*sizeof(float));
fp2.Write(s,(m-1)/2*sizeof(float));
fp2.Close();
free(r);
free(s);
free(h);
free(x);
}
/////////////////////////////
void ModBaseClass::rfft(float *x,long n)
{
long i,j,k,m,i1,i2,i3,i4,n1,n2,n4;
double a,e,cc,ss,xt,t1,t2;
for(j=1,i=1;i<32;i++)
{
m=i;
j=2*j;
if(j==n)
break;
}
n1=n-1;
for(j=0,i=0;i<n1;i++)
{
if(i<j)
{
xt=x[j];
x[j]=x[i];
x[i]=xt;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=0;i<n;i+=2)
{
xt=x[i];
x[i]=xt+x[i+1];
x[i+1]=xt-x[i+1];
}
n2=1;
for(k=2;k<=m;k++)
{
n4=n2;
n2=2*n4;
n1=2*n2;
e=6.28318530718/n1;
for(i=0;i<n;i+=n1)
{
xt=x[i];
x[i]=xt+x[i+n2];
x[i+n2]=xt-x[i+n2];
x[i+n2+n4]=-x[i+n2+n4];
a=e;
for(j=1;j<=(n4-1);j++)
{
i1=i+j;
i2=i-j+n2;
i3=i+j+n2;
i4=i-j+n1;
cc=cos(a);
ss=sin(a);
a=a+e;
t1=cc*x[i3]+ss*x[i4];
t2=ss*x[i3]-cc*x[i4];
x[i4]=x[i2]-t2;
x[i3]=-x[i2]-t2;
x[i2]=x[i1]-t1;
x[i1]=x[i1]+t1;
}
}
}
}
////////////////////////////////////////
void ModBaseClass::irfft(float *x,long n)
{
long i,j,k,m,i1,i2,i3,i4,i5,i6,i7,i8,n2,n4,n8,id,is;
double a,e,a3,t1,t2,t3,t4,t5,cc1,cc3,ss1,ss3;
for(j=1,i=1;i<32;i++)
{
m=i;
j=2*j;
if(j==n)
break;
}
n2=2*n;
for(k=1;k<m;k++)
{
is=0;
id=n2;
n2=n2/2;
n4=n2/4;
n8=n4/2;
e=6.28318530718/n2;
do
{
for(i=is;i<n;i+=id)
{
i1=i;
i2=i1+n4;
i3=i2+n4;
i4=i3+n4;
t1=x[i1]-x[i3];
x[i1]=x[i1]+x[i3];
x[i2]=2*x[i2];
x[i3]=t1-2*x[i4];
x[i4]=t1+2*x[i4];
if(n4==1)
continue;
i1+=n8;
i2+=n8;
i3+=n8;
i4+=n8;
t1=(x[i2]-x[i1])/sqrt(2.0);
t2=(x[i4]+x[i3])/sqrt(2.0);
x[i1]=x[i1]+x[i2];
x[i2]=x[i4]-x[i3];
x[i3]=2*(-t2-t1);
x[i4]=2*(-t2+t1);
}
is=2*id-n2;
id=4*id;
}while(is<(n-1));
a=e;
for(j=1;j<n8;j++)
{
a3=3*a;
cc1=cos(a);
ss1=sin(a);
cc3=cos(a3);
ss3=sin(a3);
a=(j+1)*e;
is=0;
id=2*n2;
do
{
for(i=is;i<=(n-1);i=i+id)
{
i1=i+j;
i2=i1+n4;
i3=i2+n4;
i4=i3+n4;
i5=i+n4-j;
i6=i5+n4;
i7=i6+n4;
i8=i7+n4;
t1=x[i1]-x[i6];
x[i1]=x[i1]+x[i6];
t2=x[i5]-x[i2];
x[i5]=x[i5]+x[i2];
t3=x[i8]+x[i3];
x[i6]=x[i8]-x[i3];
t4=x[i4]+x[i7];
x[i2]=x[i4]-x[i7];
t5=t1-t4;
t1=t1+t4;
t4=t2-t3;
t2=t2+t3;
x[i3]=t5*cc1+t4*ss1;
x[i7]=-t4*cc1+t5*ss1;
x[i4]=t1*cc3-t2*ss3;
x[i8]=t2*cc3+t1*ss3;
}
is=2*id-n2;
id=4*id;
}while(is<(n-1));
}
}
is=0;
id=4;
do
{
for(i=is;i<n;i=i+id)
{
i1=i+1;
t1=x[i];
x[i]=t1+x[i1];
x[i1]=t1-x[i1];
}
is=2*id-2;
id=4*id;
}while(is<(n-1));
for(j=0,i=0;i<(n-1);i++)
{
if(i<j)
{
t1=x[j];
x[j]=x[i];
x[i]=t1;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=0;i<n;i++)
x[i]=x[i]/n;
}
////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -