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£¬±È½Ï´Î¸ß룬ÒÀ´ÎÀàÍÆ£¬Öð¸ö±È½Ï£¬Ö±µ½Ä³¸öλΪ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=log£¨2£©N

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; //i£¬ip·Ö±ð±íʾ²Î¼ÓµûÐÎÔËËãµÄÁ½¸ö½Úµã 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); }

//½øÐпìËÙ¸£ÀûÒ¶±ä»» //Çó±ä»»ºó½á¹ûµÄÄ£Öµ£¬´æÈ븴ÊýµÄʵ