• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-04
  • 语言: 其他
  • 标签: FFT  

资源简介

基于8051单片机的快速傅里叶变换,应用蝶形算法,降低成本,已试过无问题!!

资源截图

代码片段和文件信息

//#include
#include  “fft.h“

void Int_FFT(int X[]unsigned int FFT_Nchar windowtypechar RealFlagchar SignFlag)
{  int  DotDiv=2048/FFT_N;  //由于查的表是的角度步进为2*pi/2048;故如果FFT点数少于2048时应查的表的步进要加倍.
   int  FFT_HFNum;        //FFT点数 
   int  FFT_Level=0;    //FFT的级数 
   int  LCnt;         //级数的计数器 
   int  FFT_Seg;        //当前级FFT中的段数 
   int  SCnt;           //段数计数器 
   int  SeGBTF;         //每段包含的碟形算子的个数 
   int  ButterFlySCnt;  //每段中碟形算子序号 
   int  ButterFlyCnt; //碟形算子总的序号地址 
   int  ButterFlyCpl;   //碟形算子对的另外一个数据的地址 
   int  Ele_Inteval;    //每个碟形算子涉及的两个元素的间隔 
//   int  RealDirCrtImagDirCrt;
 #if MAC120
   int  Rx1buffRx2buffIx1buffIx2buff;
   int  RSxbuffISxbuff;
   char SFRPAGBUFF;
 #else
   long  Rx1buffRx2buffIx1buffIx2buff;
   long  RSxbuffISxbuff;
   long  MACBUFMACBUF1MACBUF2MACBUF3;
 #endif

   int  Wnk;
   int  WnkInterval;//
   int  EXP2[16]={0x00010x00020x00040x00080x00100x00200x00400x0080
                      0x01000x02000x04000x08000x10000x20000x40000x8000
                     };//2的N次幂表.
 /*120MCU时的页寄存器处理:
 */
 #if MAC120
 SFRPAGBUFF=SFRPAGE;
 SFRPAGE=MAC0_PAGE;
 #endif
 /*FFT前期数据准备工作.
 */
 if(SignFlag!=1)//如果为不是有符合数据需要转化为有符合数据.
  for(LCnt=0;LCnt    {FFT_Seg=X[LCnt];
    SCnt=FFT_Seg-0x8000;
    X[LCnt]=SCnt;
   }
 FFT_N=FFT_N/2;    //用N/2点求是标准FFT数据量的1/2
 FFT_HFNum=FFT_N;
 FFT_Level=0;
 for(;FFT_N!=0x0001;FFT_N=FFT_N>>1)FFT_Level++; //得到FFT级数 


 /*FFT加窗;
 */
#if MAC120
 MAC0CF=0x01; //工作为乘法方式;
#endif
 switch(windowtype)
     {
    case ‘h‘:if(RealFlag)
              {
    for(LCnt=0SCnt=0;SCnt        {RSxbuff=X[SCnt];
    #if MAC120
  MAC0A=hammingwindow[LCnt];
    MAC0B=RSxbuff;
X[SCnt]=MACW1;
#else
// MACBUF1=hammingwindow[LCnt];
MACBUF=MACBUF1*RSxbuff;
MACBUF=MACBUF>>16;
X[SCnt]=MACBUF;
#endif
  SCnt++;
   }
   }
 break;
    case ‘T‘:break;
   }
 //if(Int16FullFlag)for(LCnt=0;LCnt>1;//如果输入为16位满刻度数据需要转换为15位以防溢出.

 /*FFT碟形运算:
 */ /*
#if MAC120

#else
 Rx1buff=0;
 Rx2buff=0;
 RSxbuff=0;
 for(LCnt=0;LCnt  {Rx1buff=X[LCnt];
 RSxbuff= RSxbuff+Rx1buff;
}
 
#endif*/
 /*****遍历所有级***********/
 for(LCnt=0;LCnt  {FFT_Seg=EXP2[LCnt];     //得到本级FFT需要计算的段数 
 SeGBTF=EXP2[FFT_Level-LCnt-1];//得到本级FFT中每段的算子个数 

 Ele_Inteval=EXP2[FFT_Level-LCnt];//得到每个碟形算子涉及的两个元素的距离*2 
 ButterFlyCnt=0;   //碟形算子序号复位

    #if MAC120
 MAC0CF=0x01;      //工作于乘法方式不是乘加方式 
 MAC0A=FFT_Seg;
 MAC0B=2;
 MAC0A=DotDiv;
 MAC0B=MACW0;
 WnkInterval=MACW0;//得到旋转因子的旋转间隔.WnkInterval=2*FFT_Seg*DotDiv;2是由于实数FFT时将N个点的FFT减少为N/2个点的FFT
      //当FFT点数少于2048时步进为2048时的DotDiv(2048/FFT_N)倍.
 MAC0CF=0x00;                    //工作于乘加方式
#else
 WnkInterval=FFT_Seg*DotDiv;
 WnkInterval=WnkInterval<<1;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    I.A....      9606  2007-09-01 22:57  FFT.c

----------- ---------  ---------- -----  ----

                 9606                    1


评论

共有 条评论