快速傅里叶变换_快速傅里叶变换的计算机实现基于实数

本文提供了一个基于实数的快速傅里叶变换(FFT)算法代码,输入和输出均为实数。代码简洁高效,适用于8192个点的正变换和逆变换,计算时间小于1毫秒。作者分享了邮箱和微信号,鼓励读者转发分享,以支持其继续贡献技术力量。
摘要由CSDN通过智能技术生成

上回文章发布的快速傅里叶变换是基于查表法计算的,本次发布一个自带蝶形变换的算法代码。

本次发布的代码,函数的输入和输出均是实数。

由于增加了碟形变换单元准备,因此代码所需的单词量从85个增加到94个。

对的,总共94个单词

//基2的fft代码
//res为输出数组,data为输入数组,size为数据长度,sign=1为FFT,-1为IFFT

void fft(float *res,float *data,int size,int sign)
{
 int n=size;
 float *x,*y;
 int i,j,k,l,m,n1,n2;
 float c,c1,e,s,s1,t,tr,ti;

 m=log((float)n)/log(2.0f)+0.2;

 x=new float[n];
 y=new float[n];
 memset(x,0,n*4);
 memset(y,0,n*4);
 memcpy(x,data,size*4);

 n1=n-1;
 for(j=0,i=0;i {
  if(i  {
   tr=x[j];
   ti=y[j];
   x[j]=x[i];
   y[j]=y[i];
   x[i]=tr;
   y[i]=ti;
  }
  k=n/2;
  while(k  {
   j=j-k;
   k=k/2;
  }
  j=j+k;
 }

 n1=1;
 for(l=1;l<=m;l++)
 {
  n1=2*n1;
  n2=n1/2;
  e=3.14159265359/n2;
  c=1.0;
  s=0.0;
  c1=cos(e);
  s1=-sign*sin(e);

  for(j=0;j  {
   for(i=j;i   {
    k=i+n2;
    tr=c*x[k]-s*y[k];
    ti=c*y[k]+s*x[k];
    x[k]=x[i]-tr;
    y[k]=y[i]-ti;
    x[i]=x[i]+tr;
    y[i]=y[i]+ti;
   }
   t=c;
   c=c*c1-s*s1;
   s=t*s1+s*c1;
  }
 }
 if(sign==-1)
 {
  for(i=0;i  {
   res[i]=x[i]/2;
  }
 }
 else
 {
  int len=n;
  float adjust=2.0f/size;
  for(i=0;i   res[i]=sqrt(x[i]*x[i]+y[i]*y[i])*adjust;
 }
 delete x;
 delete y;
 x=NULL;
 y=NULL;
 return;
}

使用该代码计算8192个点的正变换和逆变换所需的时间均不足1ms,你没看错,就是不足1毫秒。

本人电脑为8GB内存,64位系统,酷睿I5处理器

833f433ca8a21189b69bf7908169eda1.png

本人电脑配置如下图,计算结果就是不足1ms。

b1f838d4f0c7af8e604f2c4bd90ca93b.png

邮箱:tyenlm@qq.com

微信号:minqingzl

学生党可称呼九叔,工程师们可加我老九。

2d958a0b0288c3c83fc5c46f289dfbc6.png

我有一个梦想,让xuke在工程上或者学习中给需要的人贡献一份力量。因此如果觉得文章不错,请花费10s钟时间,转载此文。

你们的转发和分享是我坚持的动力,更新的频次增多了后,那就意味xuke的源代码能尽早完成发布。

所以还等什么呢,转发他吧!

由于刚创建的微信公众号,暂时不能开通文章留言回复功能,不妨来做个小投票。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值