上回文章发布的快速傅里叶变换是基于查表法计算的,本次发布一个自带蝶形变换的算法代码。
本次发布的代码,函数的输入和输出均是实数。
由于增加了碟形变换单元准备,因此代码所需的单词量从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处理器
本人电脑配置如下图,计算结果就是不足1ms。邮箱:tyenlm@qq.com
微信号:minqingzl
学生党可称呼九叔,工程师们可加我老九。
我有一个梦想,让xuke在工程上或者学习中给需要的人贡献一份力量。因此如果觉得文章不错,请花费10s钟时间,转载此文。
你们的转发和分享是我坚持的动力,更新的频次增多了后,那就意味xuke的源代码能尽早完成发布。
所以还等什么呢,转发他吧!
由于刚创建的微信公众号,暂时不能开通文章留言回复功能,不妨来做个小投票。