打印

分享FFT算法的应用程序及讨论

[复制链接]
767|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smilingangel|  楼主 | 2015-12-20 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    关于数据处理过程中用到的傅里叶变换的,大家一直都听说的,这里我是仅仅将我得到的数据用FFT变换处理成频率并输出的,,大家帮着看下还有啥需要改进的。。
沙发
smilingangel|  楼主 | 2015-12-20 11:08 | 只看该作者
我直接贴代码的了啊
        vp=CalcVibraFreqAmp();      //频率求解
VibraParam CalcVibraFreqAmp(void)
{               
                float tmp=0,maxAcc=0;                //
                u16   i=0;  //
    u8         max_i=0;
       
    for(i=0;i<N;i++)
                {
                        x.real=(float)accXYZ;  //*3.3/4096;;     //
                        x.img=0;
                }               
                fft();                               
       
                maxAcc =0;
         for(i=2;i<200;i++)//                 for(i=2;i<N/2;i++)                                                //Fb:3.125~187.5Hz @ FS==400Hz
         {
                tmp=x.real*x.real+x.img*x.img;
                if(tmp>maxAcc)
                {
                  maxAcc=tmp;                       
//                         if(i ==50)         //ÆÁ±Î50Hz
//                         {;}
//                         else
      max_i =i;                             
                }
         }
         i =(float)FS*max_i/N;   //
         vp.VibraFrequency=i*100;                  
                //ifft();         
         vp.VibraAmplitude=0;   //
         return vp;       
}

使用特权

评论回复
板凳
smilingangel|  楼主 | 2015-12-20 11:09 | 只看该作者
这个程序中关键点还是fft()函数的,我继续给分享的了
void fft(void)   
{   
        int   i=0,j=0,k=0,l=0;   
          complex   up,down,product;   
          change();   
          for(i=0;i<log(size_x)/log(2);i++)/*Ò»¼¶µûÐÎÔËËã*/   
          {      
                  l=1<<i;   
                  for(j=0;j<size_x;j+=2*l)/*Ò»×éµûÐÎÔËËã*/   
                  {                           
                          for(k=0;k<l;k++)/*Ò»¸öµûÐÎÔËËã*/   
                          {                 
                                        mul(x[j+k+l],W[size_x*k/2/l],&product);   
                                        add(x[j+k],product,&up);   
                                        sub(x[j+k],product,&down);   
                                        x[j+k]=up;   
                                        x[j+k+l]=down;   
                          }   
                 }   
         }   
}  

使用特权

评论回复
地板
smilingangel|  楼主 | 2015-12-20 11:10 | 只看该作者
这个是上边程序中的子函数的
void   add(complex   a,complex   b,complex   *c)   
{   
        c->real=a.real+b.real;   
        c->img=a.img+b.img;   
}   
   
void   mul(complex   a,complex   b,complex   *c)   
{   
        c->real=a.real*b.real   -   a.img*b.img;   
        c->img=a.real*b.img   +   a.img*b.real;   
}
     
void   sub(complex   a,complex   b,complex   *c)   
{   
        c->real=a.real-b.real;   
        c->img=a.img-b.img;   
}
   
void   divi(complex   a,complex   b,complex   *c)   
{   
        c->real=(   a.real*b.real+a.img*b.img   )/(   b.real*b.real+b.img*b.img);   
        c->img=(   a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img);   
}

使用特权

评论回复
5
smilingangel|  楼主 | 2015-12-20 11:11 | 只看该作者
基本上就这些了,,这个处理出来的所占用的单片机内部得空间是非常大的。。

使用特权

评论回复
6
zhangbo1985| | 2015-12-20 11:13 | 只看该作者
这个算法看着还挺复杂的啊,,楼上所说的占用的内存空间非常大是怎么回事的?这个跟所用的变量的数据类型相关的呀。

使用特权

评论回复
7
tongbu2015| | 2015-12-20 17:29 | 只看该作者
FFT的算法不就是基于蝶形计算的么?貌似挺复杂的。。

使用特权

评论回复
8
baimiaocun2015| | 2015-12-20 20:17 | 只看该作者
楼主,这里面的是不是还有一个  change();   函数的定义没分享出来的?

使用特权

评论回复
9
s1j2h3| | 2015-12-24 16:39 | 只看该作者
计算是浮点的,改时定点的是不是能加快速度.特别是对于单片机来说?

使用特权

评论回复
10
shdjdq| | 2015-12-25 08:34 | 只看该作者
定点的有相关的库,优化的非常好

使用特权

评论回复
11
baimiaocun2015| | 2015-12-30 22:53 | 只看该作者
smilingangel 发表于 2015-12-20 11:09
这个程序中关键点还是fft()函数的,我继续给分享的了
void fft(void)   
{   

这个好现实涉及到蝶形算法的,挺复杂的。

使用特权

评论回复
12
firstblood| | 2015-12-30 22:55 | 只看该作者
smilingangel 发表于 2015-12-20 11:10
这个是上边程序中的子函数的
void   add(complex   a,complex   b,complex   *c)   
{   

这个关于FFT算法的分享很详细的。

使用特权

评论回复
13
shanguizhige| | 2015-12-31 15:12 | 只看该作者
过来围观的~~:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

4066

帖子

7

粉丝