#include
#include
#include
#include"FFT.h"
//½«ÎļþfilenameÖеÄÄÚÈݶÁÈë¶þάÊý×éa
void MyReadFile(char *filename,float **a,int m,int n)
{
int i,j;
FILE *fp;
fp=fopen(filename,"rb" );
for(i=0; i
for(j=0; j
fread(&a[ i ][j],sizeof(float),1,fp);
fclose(fp);
}
//½«¶þάÊý×éaÖеÄÊý¾ÝдÈëÎļþfilenameÖÐ
void MyWriteFile(char *filename,float **a,int m,int n)
{
int i,j;
FILE *fp;
fp=fopen(filename,"wb" );
for(i=0; i
for(j=0; j
fwrite(&a[ i ][j],sizeof(float),1,fp);
fclose(fp);
}
//ÉêÇë¶þά¶¯Ì¬Êý×éµÄº¯Êý
float **MySpace(int m, int n)
{
int i;
float **p;
p=(float **)calloc(m,sizeof(float *));
if(p==NULL)
{ printf("ÉêÇë¿Õ¼äʧ°Ü\n" ;
exit(1);
}
for(i=0; i
p=(float *)calloc(n,sizeof(float));
return p;
}
//ÊÍ·ÅÉêÇëµÄ¶þά¶¯Ì¬Êý×é
void FreeMySpace(float ***p, int m)
{
int i;
for(i=0; i
free((*p)[ i ]);
free(*p);
}
//¾ØÕóתÖÃa[m][n]->b[n][m]
void Zhuan(float ***a,float ***b,int m,int n)
{
int i,j;
for(i=0; i
for(j=0; j
*(*(*b+i)+j)=*(*(*a+j)+i);
}
//2D-FFT tag=1,Õý±ä»»;tag=-1,·´±ä»»
void FFT2D(float **xr,float **xi,int m,int n,int tag)
{
int i,k1,k2;
float **xtr, **xti;
xtr=MySpace(n,m);
xti=MySpace(n,m);
k1=log(m)/log(2.0);
k2=log(n)/log(2.0);
if(n>pow(2,k1)) k1=k1+1;
if(m>pow(2,k2)) k2=k2+1;
for(i=0; i
fft(xr[ i ],xi[ i ],k2,tag);
Zhuan(&xr,&xtr,m,n);
Zhuan(&xi,&xti,m,n);
for(i=0; i
fft(xtr,xti,k1,tag);
Zhuan(&xtr,&xr,n,m);
Zhuan(&xti,&xi,n,m);
FreeMySpace(&xtr,n);
FreeMySpace(&xti,n);
}
//sinc²åÖµ
void SincIns(float **pur,float **pui,float ***midr,float ***midi,
float v,int m,int n,float dkx,float dkz,float df)
{
int i,j,l;
float pi=3.1415926;
float kx, kz;//Ô²²¨Êý
float dw;//ԲƵÂʲÉÑù¼ä¸ô
float lm,k,a,b;
dw=2.0*pi*df;
for(i=0; i<=m/2; i++)
for(j=0; j<=n/2; j++)
{
kx=i*2.0*pi*dkx;
kz=j*2.0*pi*dkz;
k=0.5*v*sqrt(kx*kx+kz*kz)/dw;//ËÙ¶ÈÒª¼õ°ë(±¬Õ¨·´Éä½çÃæÔÀí)
l=(int)k;
lm=k-l;
a=pi*lm;
b=1.0-lm;
if(fabs(a-0)<1e-6 || fabs(b-0)<1e-6) continue;
(*midr)[ i ][j]=pur[ i ][ l ]*cos(a)*sin(a)/a
+sin(a)*sin(a)/a*pui[ i ][ l ]
+pur[ i ][l+1]*cos(b*pi)*sin(b*pi)/(b*pi)
-pui[ i ][l+1]*sin(b*pi)*sin(b*pi)/(b*pi);
(*midi)[j]=pui[ i ][ l ]*cos(a)*sin(a)/a
-sin(a)*sin(a)/a*pur[ i ][ l ]+pui[ i ][l+1]*cos(b*pi)*sin(b*pi)/(b*pi)
+pur[ i ][l+1]*sin(b*pi)*sin(b*pi)/(b*pi);
}
for(i=m/2+1; i
for(j=0; j<=n/2; j++)
{
(*midr)[ i ][j]= (*midr)[m-i][j];
(*midi)[ i ][j]=(*midi)[m-i][j];
}
}
void main()
{
///³õʼ²ÎÊýÉèÖÃÇø///////////////////////////////////
const int DNUM=64;//ÁãÆ«ÒÆ¾àÆÊÃæ½ÓÊÕµÀÊý
const int TNUM=256;//ʱ¼ä²ÉÑùµãÊý
const int ZNUM=TNUM;//Éî¶È²ÉÑùµãÊý
const float V=2000.0;//Éϸ²½éÖÊËÙ¶È
const float DT=0.002;//ʱ¼ä²ÉÑù¼ä¸ô2ms
const float DX=10.0;//µÀ¼ä¾à
const float DZ=DT*V*0.5;//Éî¶È²½³¤(ËÙ¶ÈÒª¼õ°ë)
const float pi=3.1415926;
char fname1[]="before.dat";//ÔʼµØÕð¼Ç¼ÎļþÃû
char fname2[]="after.dat";//Æ«ÒÆºóµÄÆÊÃæÎļþÃû
char fname3[]="mid.dat";//ƵÆ×ͼ
////ÆäËû²ÎÊý¼ÆËãÇø//////////////////////////////////
float **recordr, **recordi;
float **midr, **midi;
float df;//ƵÂʲÉÑù¼ä¸ô
float dkx;//x·½Ïò²¨Êý²ÉÑù¼ä¸ô
float dkz;//z·½Ïò²¨Êý²ÉÑù¼ä¸ô
float dex;
int i,j;
df=1.0/(DT*TNUM); dkx=1.0/(DX*DNUM);
dkz=1.0/(DZ*ZNUM);
//ÉêÇë¿Õ¼ä
recordr=MySpace(DNUM,TNUM);
recordi=MySpace(DNUM,TNUM);
midr=MySpace(DNUM,TNUM);
midi=MySpace(DNUM,TNUM);
//¶ÁÈëÔʼÆÊÃæ
MyReadFile(fname1,recordr,DNUM,TNUM);
//¶ÔÔʼÆÊÃæ½øÐжþά¸µÀïÒ¶±ä»»
FFT2D(recordr,recordi,DNUM,TNUM,1);
MyWriteFile(fname3,recordr,DNUM,TNUM);
//¶Ô±ä»»½á¹û½øÐвåÖµ
SincIns(recordr,recordi,&midr,&midi,V,DNUM,TNUM,dkx,dkz,df);
//³ËÒò×Ó
for(i=0; i
for(j=0; j
{ dex=0.5*V*j*dkz/sqrt(pow(i*dkx,2)+pow(j*dkz,2));
if(fabs(dex-0)<1e-6) continue;
midr[j]=midr[ i ][j]*dex;
midi[ i ][j]=midi[ i ][j]*dex;
}
//¸µÀïÒ¶·´±ä»»
FFT2D(midr,midi,DNUM,TNUM,-1);
MyWriteFile(fname2,midr,DNUM,TNUM);
//Êͷſռä
FreeMySpace(&recordr,DNUM);
FreeMySpace(&recordi,DNUM);
FreeMySpace(&midr,DNUM);
FreeMySpace(&midi,DNUM);
}
ÎåµãÂö³åµÄÆ«ÒÆ½á¹û£º
![]()
[ Last edited by baobiao007 on 2011-2-18 at 03:48 ] |