
void fft()
{
int nn,n1,n2,i,j,k,l,m,s,l1;
float ar[1024],ai[1024]; // 实部 虚部
float a[2050];
float t1,t2,x,y;
float w1,w2,u1,u2,z;
float fsin[10]={0000000,1000000,0707107,03826834,01950903,009801713,004906767,002454123,001227154,000613588,};// 优化
float fcos[10]={-1000000,0000000,07071068,09238796,09807853,099518472,099879545,09996988,09999247,09999812,};
nn=1024;
s=10;
n1=nn/2; n2=nn-1;
j=1;
for(i=1;i<=nn;i++)
{
a[2i]=ar[i-1];
a[2i+1]=ai[i-1];
}
for(l=1;l<n2;l++)
{
if(l<j)
{
t1=a[2j];
t2=a[2j+1];
a[2j]=a[2l];
a[2j+1]=a[2l+1];
a[2l]=t1;
a[2l+1]=t2;
}
k=n1;
while (k<j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=1;i<=s;i++)
{
u1=1;
u2=0;
m=(1<<i);
k=m>>1;
w1=fcos[i-1];
w2=-fsin[i-1];
for(j=1;j<=k;j++)
{
for(l=j;l<nn;l=l+m)
{
l1=l+k;
t1=a[2l1]u1-a[2l1+1]u2;
t2=a[2l1]u2+a[2l1+1]u1;
a[2l1]=a[2l]-t1;
a[2l1+1]=a[2l+1]-t2;
a[2l]=a[2l]+t1;
a[2l+1]=a[2l+1]+t2;
}
z=u1w1-u2w2;
u2=u1w2+u2w1;
u1=z;
}
}
for(i=1;i<=nn/2;i++)
{
ar[i]=a[2i+2]/nn;
ai[i]=-a[2i+3]/nn;
a[i]=4sqrt(ar[i]ar[i]+ai[i]ai[i]); // 幅值
}
}
I0=zeros(256,256);
I0(120:130,100:156)=1;
subplot(2,3,1),imshow(I0),title('原始图像')
subplot(2,2,2),imshow(log(1+abs(fft2(I0)))),title('直接进行fft2')
I1=I0;
F1=fft(I1,[],1);%按列进行傅里叶变换
subplot(2,2,3),imshow(log(1+abs(F1))),title('先按列进行')
F2=fft(F1,[],2);%按行进行傅里叶变换
subplot(2,2,4),imshow(log(1+abs(F2))),title('后按行进行')
以上就是关于C语言 1024点快速傅里叶变换(FFT)程序,最好经过优化,执行速度快全部的内容,包括:C语言 1024点快速傅里叶变换(FFT)程序,最好经过优化,执行速度快、matlab对图像分别进行一维傅里叶变换(先进行行变换,再进行列变换),请问程序如何编写、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)