⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fftbook.c

📁 在ICCAVR 环境实现的fft,
💻 C
字号:
#include <math.h>
#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*8 + b1*4 + b2*2 + 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);
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -