找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4004|回復(fù): 0
收起左側(cè)

傅立葉算法的C語言實現(xiàn)

[復(fù)制鏈接]
ID:80436 發(fā)表于 2015-5-22 00:44 | 顯示全部樓層 |閱讀模式
/***** 作者  _yuming           *************/

好犀利的傅里葉C算法。!膜拜

  1. #include "math.h"
  2.   void kfft(pr,pi,n,k,fr,fi,l,il)
  3.   int n,k,l,il;
  4.   double pr[],pi[],fr[],fi[];
  5.   { int it,m,is,i,j,nv,l0;
  6.     double p,q,s,vr,vi,poddr,poddi;
  7.     for (it=0; it<=n-1; it++)
  8.       { m=it; is=0;
  9.         for (i=0; i<=k-1; i++)
  10.           { j=m/2; is=2*is+(m-2*j); m=j;}
  11.         fr[it]=pr[is]; fi[it]=pi[is];
  12.       }
  13.     pr[0]=1.0; pi[0]=0.0;
  14.     p=6.283185306/(1.0*n);
  15.     pr[1]=cos(p); pi[1]=-sin(p);
  16.     if (l!=0) pi[1]=-pi[1];
  17.     for (i=2; i<=n-1; i++)
  18.       { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
  19.         s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
  20.         pr[i]=p-q; pi[i]=s-p-q;
  21.       }
  22.     for (it=0; it<=n-2; it=it+2)
  23.       { vr=fr[it]; vi=fi[it];
  24.         fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
  25.         fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
  26.       }
  27.     m=n/2; nv=2;
  28.     for (l0=k-2; l0>=0; l0--)
  29.       { m=m/2; nv=2*nv;
  30.         for (it=0; it<=(m-1)*nv; it=it+nv)
  31.           for (j=0; j<=(nv/2)-1; j++)
  32.             { p=pr[m*j]*fr[it+j+nv/2];
  33.               q=pi[m*j]*fi[it+j+nv/2];
  34.               s=pr[m*j]+pi[m*j];
  35.               s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
  36.               poddr=p-q; poddi=s-p-q;
  37.               fr[it+j+nv/2]=fr[it+j]-poddr;
  38.               fi[it+j+nv/2]=fi[it+j]-poddi;
  39.               fr[it+j]=fr[it+j]+poddr;
  40.               fi[it+j]=fi[it+j]+poddi;
  41.             }
  42.       }
  43.     if (l!=0)
  44.       for (i=0; i<=n-1; i++)
  45.         { fr[i]=fr[i]/(1.0*n);
  46.           fi[i]=fi[i]/(1.0*n);
  47.         }
  48.     if (il!=0)
  49.       for (i=0; i<=n-1; i++)
  50.         { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
  51.           if (fabs(fr[i])<0.000001*fabs(fi[i]))
  52.             { if ((fi[i]*fr[i])>0) pi[i]=90.0;
  53.               else pi[i]=-90.0;
  54.             }
  55.           else
  56.             pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
  57.         }
  58.     return;
  59.   }
復(fù)制代碼


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表