Post Go back to editing

基于C的单片机FFT程序

****************************************************************************

*                (FFT.c          FFT.h)

*

*

*             1.define a array which would contain the number you get from ADC

*               like:   //  struct  compx sample[16];

*               and after that you will use this array for FFT.

*             2.you also must define a number used for times which you will

*               operate papilionaceous(蝶形) operation.

*               like:  //  unsigned char Mum = 16;//2exp(Num)

&

*attantion: * 基于时间抽取,同址计算

*           * 要知道进行蝶形运算的数组必须是 2exp(Num)个

*           * 数组的赋值是换算成的电压值,而不是采样后的寄存器结果

*

*made by: SuLi

*Version: 1.0

*Time: 07-8-29

*****************************************************************************/

#ifndef    _FFT_h_

#define    _FFT_h_

#include   "math.h"

struct compx

{

    float real;//实部

    float imag;//虚部

};

extern void FFT(struct compx *xin, unsigned int Num);

#endif

/*

*

*             1.define a array which would contain the number you get from ADC

*               like:   //  struct  compx sample[16];

*               and after that you will use this array for FFT.

*             2.you also must define a number used for times which you will

*               operate papilionaceous(蝶形) operation.

*               like:  //  unsigned char Mum = 16;//2exp(Num)

&

*attantion: * 基于时间抽取,同址计算

*           * 要知道进行蝶形运算的数组必须是 2exp(Num)个

*           * 数组的赋值是换算成的电压值,而不是采样后的寄存器结果

*

*made by: SuLi

*Version: 1.0

*Time: 07-8-29

*****************************************************************************/

#include    "FFT.h"

/*

struct compx

{

    float real;//实部

    float imag;//虚部

}compx;*/

 

struct compx EE(struct compx b1,struct compx b2)//蝶形运算单元

{

    struct compx b3;

    b3.real=b1.real*b2.real-b1.imag*b2.imag;

    b3.imag=b1.real*b2.imag+b1.imag*b2.real;

    return(b3);

}


void FFT(struct compx *xin, unsigned int Num)

{

  int f,m,LH,nm,i,k,j,L;

  float p , ps;

  int le,B,ip;

  float pi;

  struct compx  w,t;

 

  LH="Num/2";  //首先分为两组

  f="Num";     //输入的数据个数

  for(m=1;(f=f/2)!=1;m++){;} //m 表示将数据进行2分分组,f 不过是中间变量

                             //直到不能载分 也就是说 Num = 2exp(m)

  nm="Num-2"; //

  j="Num/2";  //

 

  /*变址运算*/

  for(i=1;i<=nm;i++)//i从 1--(Num-1) (去头去尾)//j=Num/2

  {

    if(i<j){t=xin[j];xin[j]=xin[i];xin[i]=t;}

    k="LH";

    while(j>=k){j=j-k;k=k/2;}

    j="j"+k;

  }

 

//**************蝶形运算的主程序************* 

  {

    for(L=1;L<=m;L++)

      { 

        le=(int)pow(2,L)+1;

        B="le/2";

        pi="3".14159;

        for(j=0;j<=B-1;j++)

          {

            p="pow"(2,m-L)*j;

            ps="2"*pi/Num*p;

            w.real=cos(ps);

            w.imag=-sin(ps);

            for(i=j;i<=Num-1;i=i+le)

            {

                 ip="i"+B;

                 t="EE"(xin[ip],w);

                 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;

          }

         }

      }

  }  

  return ;

}