[STM32F1] FFT算法的C语言实现

[复制链接]
1126|2
 楼主| qiufengsd 发表于 2024-7-25 09:55 | 显示全部楼层 |阅读模式


  1.   #include "math.h"
  2.   void kfft(pr,pi,n,k,fr,fi)
  3.   int n,k;
  4.   double pr[],pi[],fr[],fi[];
  5.   {
  6.         int it,m,is,i,j,nv,l0;
  7.     double p,q,s,vr,vi,poddr,poddi;
  8.     for (it=0; it<=n-1; it++)  //将pr[0]和pi[0]循环赋值给fr[]和fi[]
  9.     {
  10.                 m=it;
  11.                 is=0;
  12.                 for(i=0; i<=k-1; i++)
  13.         {
  14.                         j=m/2;
  15.                         is=2*is+(m-2*j);
  16.                         m=j;
  17.                 }
  18.         fr[it]=pr[is];
  19.         fi[it]=pi[is];
  20.     }
  21.     pr[0]=1.0;
  22.     pi[0]=0.0;
  23.     p=6.283185306/(1.0*n);
  24.     pr[1]=cos(p); //将w=e^-j2pi/n用欧拉公式表示
  25.     pi[1]=-sin(p);

  26.     for (i=2; i<=n-1; i++)  //计算pr[]
  27.     {
  28.                 p=pr[i-1]*pr[1];
  29.                 q=pi[i-1]*pi[1];
  30.                 s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
  31.                 pr[i]=p-q; pi[i]=s-p-q;
  32.     }
  33.     for (it=0; it<=n-2; it=it+2)  
  34.     {
  35.                 vr=fr[it];
  36.                 vi=fi[it];
  37.                 fr[it]=vr+fr[it+1];
  38.                 fi[it]=vi+fi[it+1];
  39.                 fr[it+1]=vr-fr[it+1];
  40.                 fi[it+1]=vi-fi[it+1];
  41.     }
  42.         m=n/2;
  43.         nv=2;
  44.     for (l0=k-2; l0>=0; l0--) //蝴蝶操作
  45.     {
  46.                 m=m/2;
  47.                 nv=2*nv;
  48.         for (it=0; it<=(m-1)*nv; it=it+nv)
  49.           for (j=0; j<=(nv/2)-1; j++)
  50.             {
  51.                                 p=pr[m*j]*fr[it+j+nv/2];
  52.                                 q=pi[m*j]*fi[it+j+nv/2];
  53.                                 s=pr[m*j]+pi[m*j];
  54.                                 s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
  55.                                 poddr=p-q;
  56.                                 poddi=s-p-q;
  57.                                 fr[it+j+nv/2]=fr[it+j]-poddr;
  58.                                 fi[it+j+nv/2]=fi[it+j]-poddi;
  59.                                 fr[it+j]=fr[it+j]+poddr;
  60.                                 fi[it+j]=fi[it+j]+poddi;
  61.             }
  62.     }
  63.     for (i=0; i<=n-1; i++)
  64.        {
  65.                   pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);  //幅值计算
  66.        }
  67.     return;
  68.   }


LEDyyds 发表于 2024-7-25 10:37 | 显示全部楼层
很不错的代码,可以试试
Bowclad 发表于 2024-7-26 12:10 | 显示全部楼层
一直没学明白fft
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

3445

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部