/****************************************************************** ԭͣvoid create_sin_tab(float *sin_t)
ܣһҲ븣Ҷ任ͬ *sin_tұָ
******************************************************************/ void create_sin_tab(float *sin_t) {
int i;
for(i=0;i<=FFT_N/4;i++) sin_t[i]=sin(2*PI*i/FFT_N); }
/****************************************************************** ԭͣvoid sin_tab(float pi)
ܣòķһֵ
pi ҪֵֵΧ0--2*PIʱҪת ֵpiֵ
******************************************************************/ float sin_tab(float pi) {
int n; float a;
n=(int)(pi*FFT_N/2/PI);
if(n>=0&&n<=FFT_N/4) a=SIN_TAB[n];
else if(n>FFT_N/4&&n n-=FFT_N/4; a=SIN_TAB[FFT_N/4-n]; } else if(n>=FFT_N/2&&n<3*FFT_N/4) { n-=FFT_N/2; a=-SIN_TAB[n]; } else if(n>=3*FFT_N/4&&n<3*FFT_N) { n=FFT_N-n; a=-SIN_TAB[n]; } return a; } /****************************************************************** ԭͣvoid cos_tab(float pi) ܣòķһֵ pi ҪֵֵΧ0--2*PIʱҪת ֵpiֵ ******************************************************************/ float cos_tab(float pi) { float a,pi2; pi2=pi+PI/2; if(pi2>2*PI) pi2-=2*PI; a=sin_tab(pi2); return a; } /***************************************************************** ԭͣvoid FFT(struct compx *xin,int N) ܣĸпٸҶ任FFT *xinṹַָ룬struct *****************************************************************/ void FFT(struct compx *xin) { int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; //ַ㣬Ȼ˳ɵλ㷨 nm1=FFT_N-1; for(i=0;i if(i t=xin[j]; xin[j]=xin[i]; xin[i]=t; } k=nv2; //jһλ while(k<=j) //k<=j,ʾjλΪ1 { j=j-k; //λ0 k=k/2; //k/2ȽϴθλƣȽϣֱijλΪ0 } j=j+k; //0Ϊ1 } { int le,lei,ip; //FFTˣʹõFFT f=FFT_N; for(l=1;(f=f/2)!=1;l++) //lֵμ ; for(m=1;m<=l;m++) // Ƶνἶ { //mʾmΣlΪμl=log2N le=2<<(m-1); //leν룬mεĵνle lei=le/2; //ͬһνвμľ u.real=1.0; //uΪνϵʼֵΪ1 u.imag=0.0; //w.real=cos(PI/lei); //òsinֵcosֵ // w.imag=-sin(PI/lei); w.real=cos_tab(PI/lei); //wΪϵ̣ǰϵǰһϵ w.imag=-sin_tab(PI/lei); for(j=0;j<=lei-1;j++) //Ƽ㲻ֵͬνᣬϵͬĵν { for(i=j;i<=FFT_N-1;i=i+le) //ͬһν㣬ϵͬν { ip=i+lei; //iipֱʾμӵڵ t=EE(xin[ip],u); //㣬ʽ xin[ip].real=xin[i].real-t.real; xin[ip].imag=xin[i].imag-t.imag; xin[i].real=xin[i].real+t.real; xin[i].imag=xin[i].imag+t.imag; } u=EE(u,w); //ıϵһ } } } } /************************************************************ ԭͣvoid main() ܣFFT任ʾʹ÷ ************************************************************/ void main() { int i; create_sin_tab(SIN_TAB); for(i=0;i s[i].real=sin(2*3.141592653589793*i/FFT_N); //ʵΪҲFFT_NֵΪ1 s[i].imag=0; //鲿Ϊ0 } FFT(s); for(i=0;i s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag); while(1); } //пٸҶ任 //任ģֵ븴ʵ