📄 demodclass.cpp
字号:
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 DemodClass::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 DemodClass::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 DemodClass::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;
}
/////////////////////////////////////////
void DemodClass::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 DemodClass::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 DemodClass::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;
}
////////////////////////////////////
bool DemodClass::phasedetect(float *inData,long fc,double dt,long length,CString outfile_name)
//相位检测;
//所需参数:全局变量载波频率fc;
//输入参数:输入信号指针 *inData;
// 采样时间步长 dt;
// 信号采样点数 length;
//输出参数:返回载波相位的指针 *outData。
{
double a[2][2],b[2],c[2],d, x[2],filterBuffer[2],DataBeforFilter,t1,t2,k;
long i;
double fn;
float *outData;
outData=(float *)malloc(length*sizeof(float));
if(!outData) return FALSE;
fn=fc*1.0/40.0;
t1=0.01/fc;
t2=1/(2*pi*fn);
k=2*pi*fn;
a[0][0]=-1*1/t2;
a[0][1]=0;
a[1][0]=1;
a[1][1]=0;
b[0]=1;
b[1]=0;
c[0]=t1/t2;
c[1]=k/t2;
d=0;
filterBuffer[0]=0;
filterBuffer[1]=0;
for (i=0;i<length;i++)
{
*(outData+i)=c[0]*filterBuffer[0]+c[1]*filterBuffer[1];
DataBeforFilter=(*(inData+i))*sin(2*pi*fc*i*dt+(*(outData+i)));
x[0]=filterBuffer[0]+dt*(a[0][0]*filterBuffer[0]+
a[0][1]*filterBuffer[1]+
b[0]*DataBeforFilter);
x[1]=filterBuffer[1]+dt*(a[1][0]*filterBuffer[0]+
a[1][1]*filterBuffer[1]+
b[1]*DataBeforFilter);
filterBuffer[0]=x[0];
filterBuffer[1]=x[1];
}
if(putData(outData,outfile_name,length)==FALSE)
{
free(outData);
return FALSE;
}
else
{
free(outData);
return TRUE;
}
}
///////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -