快速傅里叶变换之C语言实现

#include "math.h"
void kfft(double pr[], double pi[], int n, int k, double fr[], double fi[])
{  
 int it,m,is,i,j,nv,l0;
 double p,q,s,vr,vi,poddr,poddi;
 for (it=0; it<=n-1; it++)  
 { 
  m=it; 
  is=0;
  for(i=0; i<=k-1; i++)
     { 
   j=m/2; 
   is=2*is+(m-2*j); 
   m=j;
  }
     fr[it]=pr[is]; 
     fi[it]=pi[is];
 }
 pr[0]=1.0; 
 pi[0]=0.0;
 p=6.283185306/(1.0*n);
 pr[1]=cos(p); 
 pi[1]=-sin(p); for (i=2; i<=n-1; i++) 
 { 
  p=pr[i-1]*pr[1]; 
  q=pi[i-1]*pi[1];
  s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
  pr[i]=p-q; pi[i]=s-p-q;
 }
 for (it=0; it<=n-2; it=it+2)  
 { 
  vr=fr[it]; 
  vi=fi[it];
  fr[it]=vr+fr[it+1]; 
  fi[it]=vi+fi[it+1];
  fr[it+1]=vr-fr[it+1]; 
  fi[it+1]=vi-fi[it+1];
 }
 m=n/2; 
 nv=2;
 for (l0=k-2; l0>=0; l0--) 
 { 
  m=m/2; 
  nv=2*nv;
     for (it=0; it<=(m-1)*nv; it=it+nv)
       for (j=0; j<=(nv/2)-1; j++)
         { 
    p=pr[m*j]*fr[it+j+nv/2];
    q=pi[m*j]*fi[it+j+nv/2];
    s=pr[m*j]+pi[m*j];
    s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
    poddr=p-q; 
    poddi=s-p-q;
    fr[it+j+nv/2]=fr[it+j]-poddr;
    fi[it+j+nv/2]=fi[it+j]-poddi;
    fr[it+j]=fr[it+j]+poddr;
    fi[it+j]=fi[it+j]+poddi;
         }
 }
 for (i=0; i<=n-1; i++)
    { 
   pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]); 
    }
 return;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值