/****************************************************************** º¯ÊýÔÐÍ£º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); } //½øÐпìËÙ¸£ÀûÒ¶±ä»» //Çó±ä»»ºó½á¹ûµÄÄ£Öµ£¬´æÈ븴ÊýµÄʵ