FFT最详细的源代码和解?- 百度文库 ر

/****************************************************************** ԭͣ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); }

//пٸҶ任 //任ģֵ븴ʵ