www.pudn.com > fft_iccavr.rar > fftbook._c


#include  
#define uint unsigned int 
#define uchar unsigned char 
#define PI 3.1415926 
 
uint x0,x1,x2,x3,x4,x5,x6; 
int L,i,j,k,b,p; 
uchar w[32]; 
uint TR,TI,temp; 
 
int dataR[]={5,5,5,5,0,0,0,0,5,5,5,5,0,0,0,0}; 
int dataI[16]; 
 
void CHANGE() 
 {                              //i为原始存放位置,最后得invert_pos为倒位序存放位置 
  int b0 , b1 , b2 , b3 , b4 , b5 , b6 , all; 
      b0 = b1 = b2 = b3 = b4 = b5 = b6 = all = 0; 
  b0  = i&0x01;  
  b1  = (i>>1)&0x01;  
  b2  = (i>>2)&0x01; 
  b3  = (i>>3)&0x01; 
  b4  = (i>>4)&0x01; 
  b5  = (i>>5)&0x01; 
  b6  = (i>>6)&0x01; 
  all = b0*64 + b1*32 + b2*16 + b3*8 + b4*4 + b5*2 + b6; 
  dataI[all] = dataR[i]; 
 } 
 
  
void FFTT() 
 {  TR=dataR[k];  
    TI=dataI[k]; 
    temp=dataR[k+b];  
    dataR[k]=dataR[k]+dataR[k+b]*cos(2*PI*p/16)+dataI[k+b]*sin(2*PI*p/16); 
    dataI[k]=dataI[k]-dataR[k+b]*sin(2*PI*p/16)+dataI[k+b]*cos(2*PI*p/16); 
    dataR[k+b]=TR-dataR[k+b]*cos(2*PI*p/16)-dataI[k+b]*sin(2*PI*p/16); 
    dataI[k+b]=TI+temp*sin(2*PI*p/16)-dataI[k+b]*cos(2*PI*p/16); 
	 
	/*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];*/ 
 
 } 
void FFT(int dataR[],int dataI[]) 
{ 
// 以下是数据掉头功能 
  for(i = 0 ; i < 16 ; i++) 
   {  
    CHANGE ( ) ; 
   } 
  for(i=0;i<16;i++) 
   { 
    dataR[i]=dataI[i]; dataI[i]=0;  
   } 
// FFT算法 
  for(L=1;L<=4;L++) 						// 第一层循环 
  { 
     b=1; i=L-1; 
     while(i>0)  
    { 
      b=b*2; i--; 
    }  
       for(j=0;j<=b-1;j++)						 // 第二层循环 
         {  
           p=1; i=4-L; 
           while(i>0)					 
               { 
			   p=p*2; i--; 
			   } 
           p=p*j; 
            for(k=j;k<16;k=k+2*b) 				// 第三层循环 
              {  
                FFTT(); 
              } 
          } 
  }  
  for(i=0;i<32;i++) 							// 32次以下的谐波分析 
   { 
    w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]); 
    w[i]=w[i]/64; 
   } 
  w[0]=w[0]/2; 
}   
 
void main () 
  { 
    FFT(dataR,dataI); 
	while(1); 
  }