www.pudn.com > fft_iccavr.rar > ff._c
#include#include #define PI 3.1415926 unsigned char i,w[32]; int dataR[]={5,5,5,5,0,0,0,0}; int dataI[]={0,0,0,0,0,0,0,0}; void FFT(int dataR[],int dataI[]) { int x0,x1,x2,xx; int L,j,k,b,p; float TR,TI,temp; /********** following code invert sequence ************/ for(i=0;i<8;i++) { x0=x1=x2=0; x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; xx=x0*4+x1*2+x2; dataI[xx]=dataR[i]; //实部的数放在虚部数组中 } for(i=0;i<8;i++) { dataR[i]=dataI[i]; //将虚部保存的数传回实部 dataI[i]=0; } /************** following code FFT *******************/ for(L = 1 ; L <= 3 ; L ++ ) // for (1) L 代表第几级 { b = 1 ; i = L - 1 ; while ( i > 0 ) //计算第L层旋转因子的个数,即输入口间距 b= 2^(L-1) { b=b*2; i--; } for ( j = 0 ; j <= b - 1 ; j ++ ) // for (2) j 用来控制计算第几个旋转因子 { p = 1 ; i = 3 - L ; while ( i > 0 ) /* p=pow(2,3-L)*j; */ { p = p * 2 ; i -- ; } p=p*j; for ( k = j ; k < 8 ; k = k + 2 * b ) /* for (3) */ { p=2*PI*p/8; TR = dataR [ k ] ; TI = dataI [ k ] ; temp = dataR [ k + b ] ; dataR[k]=dataR[k]+dataR[k+b]*cos(p)+dataI[k+b]*sin(p); dataI[k]=dataI[k]-dataR[k+b]*sin(p)+dataI[k+b]*cos(p); dataR[k+b]=TR-dataR[k+b]*cos(p)-dataI[k+b]*sin(p); dataI[k+b]=TI+temp*sin(p)-dataI[k+b]*cos(p); /*dataR [ k ] = dataR [ k ] + dataR [ k + b ] * cos_tab [ p ] + dataI [ k + b ] * sin_tab [ p ] ; dataI [ k ] = dataI [ k ] - dataR [ k + b ] * sin_tab [ p ] + dataI [ k + b ] * cos_tab [ p ] ; dataR [ k + b ] = TR - dataR [ k + b ] * cos_tab [ p ] - dataI [ k + b ] * sin_tab [ p ] ; dataI [ k + b ] = TI + temp * sin_tab [ p ] - dataI [ k + b ] * cos_tab [ p ] ;*/ } /* END for (3) */ } /* END for (2) */ } /* END for (1) */ for ( i = 0 ; i < 32 ; i ++ ) { /* 只需要32次以下的谐波进行分析 */ w [ i ] = sqrt ( dataR [ i ] * dataR [ i ] + dataI [ i ] * dataI [ i ] ) ; if ( i ) { w [ i ] = w [ i ] / 64 ; } } w [ 0 ] = w [ 0 ] / 2 ; } void main() { FFT(dataR,dataI); while(1); }