[C] 快速傅立叶变换 →→→→→进入此内容的聊天室

来自 , 2020-09-09, 写在 C, 查看 166 次.
URL http://www.code666.cn/view/f410588e
  1. /*快速傅立叶变换(FFT)
  2. 语法:kkfft(double pr[],double pi[],int n,int k,double fr[],double fi[],int l,int il);
  3. 参数:
  4. pr[n]:        输入的实部
  5. pi[n]:        数入的虚部
  6. n,k:        满足n=2^k
  7. fr[n]:        输出的实部
  8. fi[n]:        输出的虚部
  9. l:    逻辑开关,0 FFT,1 ifFT
  10. il:   逻辑开关,0 输出按实部/虚部;1 输出按模/幅角
  11. 返回值:    null
  12. 注意:
  13.         需要 math.h
  14. */
  15.  
  16. void kkfft ( pr,pi,n,k,fr,fi,l,il )
  17. int n,k,l,il;
  18. double pr[],pi[],fr[],fi[];
  19. {
  20.         int it,m,is,i,j,nv,l0;
  21.         double p,q,s,vr,vi,poddr,poddi;
  22.         for ( it=0; it<=n-1; it++ )
  23.         {
  24.                 m=it;
  25.                 is=0;
  26.                 for ( i=0; i<=k-1; i++ )
  27.                         {j=m/2; is=2*is+ ( m-2*j ); m=j;}
  28.                 fr[it]=pr[is];
  29.                 fi[it]=pi[is];
  30.         }
  31.         pr[0]=1.0;
  32.         pi[0]=0.0;
  33.         p=6.283185306/ ( 1.0*n );
  34.         pr[1]=cos ( p );
  35.         pi[1]=-sin ( p );
  36.         if ( l!=0 ) pi[1]=-pi[1];
  37.         for ( i=2; i<=n-1; i++ )
  38.         {
  39.                 p=pr[i-1]*pr[1];
  40.                 q=pi[i-1]*pi[1];
  41.                 s= ( pr[i-1]+pi[i-1] ) * ( pr[1]+pi[1] );
  42.                 pr[i]=p-q;
  43.                 pi[i]=s-p-q;
  44.         }
  45.         for ( it=0; it<=n-2; it=it+2 )
  46.         {
  47.                 vr=fr[it];
  48.                 vi=fi[it];
  49.                 fr[it]=vr+fr[it+1];
  50.                 fi[it]=vi+fi[it+1];
  51.                 fr[it+1]=vr-fr[it+1];
  52.                 fi[it+1]=vi-fi[it+1];
  53.         }
  54.         m=n/2;
  55.         nv=2;
  56.         for ( l0=k-2; l0>=0; l0-- )
  57.         {
  58.                 m=m/2;
  59.                 nv=2*nv;
  60.                 for ( it=0; it<= ( m-1 ) *nv; it=it+nv )
  61.                         for ( j=0; j<= ( nv/2 )-1; j++ )
  62.                         {
  63.                                 p=pr[m*j]*fr[it+j+nv/2];
  64.                                 q=pi[m*j]*fi[it+j+nv/2];
  65.                                 s=pr[m*j]+pi[m*j];
  66.                                 s=s* ( fr[it+j+nv/2]+fi[it+j+nv/2] );
  67.                                 poddr=p-q;
  68.                                 poddi=s-p-q;
  69.                                 fr[it+j+nv/2]=fr[it+j]-poddr;
  70.                                 fi[it+j+nv/2]=fi[it+j]-poddi;
  71.                                 fr[it+j]=fr[it+j]+poddr;
  72.                                 fi[it+j]=fi[it+j]+poddi;
  73.                         }
  74.         }
  75.         if ( l!=0 )
  76.                 for ( i=0; i<=n-1; i++ )
  77.                 {
  78.                         fr[i]=fr[i]/ ( 1.0*n );
  79.                         fi[i]=fi[i]/ ( 1.0*n );
  80.                 }
  81.         if ( il!=0 )
  82.                 for ( i=0; i<=n-1; i++ )
  83.                 {
  84.                         pr[i]=sqrt ( fr[i]*fr[i]+fi[i]*fi[i] );
  85.                         if ( fabs ( fr[i] ) <0.000001*fabs ( fi[i] ) )
  86.                         {
  87.                                 if ( ( fi[i]*fr[i] ) >0 ) pi[i]=90.0;
  88.                                 else pi[i]=-90.0;
  89.                         }
  90.                         else
  91.                                 pi[i]=atan ( fi[i]/fr[i] ) *360.0/6.283185306;
  92.                 }
  93.         return;
  94. }
  95.  

回复 "快速傅立叶变换"

这儿你可以回复上面这条便签

captcha