c语言编写傅里叶变换函数 c语言傅立叶变换函数( 六 )


for(i=0;iN;i++)
{
xr[i]=i;
xi[i]=0;
}
printf("------FFT------\n");
l=0;
kkfft(xr,xi,n,k,Yr,Yi,l,il);
for(i=0;iN;i++)
{
printf("%-11lf + j* %-11lf\n",Yr[i],Yi[i]);
}
printf("-----DFFT-------\n");
l=1;
kkfft(Yr,Yi,n,k,xr,xi,l,il);
for(i=0;iN;i++)
{
printf("%-11lf + j* %-11lf\n",xr[i],xi[i]);
}
getch();
}
void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)
{
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);
if (l!=0)
pi[1]=-pi[1];
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;
}
}
/*逆傅立叶变换*/
if(l!=0)
{
for(i=0; i=n-1; i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}
}
/*是否计算模和相角*/
if(il!=0)
{
for(i=0; i=n-1; i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
if(fabs(fr[i])0.000001*fabs(fi[i]))
{
if ((fi[i]*fr[i])0)
pi[i] = 90.0;
else
pi[i] = -90.0;
}
else
pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;
}
}
return;
}
怎样用C语言实现FFT算法?。?/h2>1、二维FFT相当于对行和列分别进行一维FFT运算 。具体c语言编写傅里叶变换函数的实现办法如下:
先对各行逐一进行一维FFTc语言编写傅里叶变换函数,然后再对变换后c语言编写傅里叶变换函数的新矩阵的各列逐一进行一维FFT 。相应的伪代码如下所示:
for (int i=0; iM; i++)
FFT_1D(ROW[i]c语言编写傅里叶变换函数,N);
for (int j=0; jN; j++)
FFT_1D(COL[j]c语言编写傅里叶变换函数,M);
其中 , ROW[i]表示矩阵的第i行 。注意这只是一个简单的记法,并不能完全照抄 。还需要通过一些语句来生成各行的数据 。同理,COL[i]是对矩阵的第i列的一种简单表示方法 。
所以 , 关键是一维FFT算法的实现 。
2、例程:
#include stdio.h
#include math.h
#include stdlib.h
#define N 1000
/*定义复数类型*/
typedef struct{
double real;
double img;
}complex;
complex x[N], *W; /*输入序列,变换核*/
int size_x=0;/*输入序列的大小,在本程序中仅限2的次幂*/
double PI;/*圆周率*/
void fft();/*快速傅里叶变换*/
void initW();/*初始化变换核*/
void change(); /*变址*/
void add(complex ,complex ,complex *); /*复数加法*/
void mul(complex ,complex ,complex *); /*复数乘法*/
void sub(complex ,complex ,complex *); /*复数减法*/
void output();

推荐阅读