www.pudn.com > fft_iccavr.rar > fft2.c


#include 
 
/*pr:输入实部 
pi:输入虚部 
n为2^k,n不小于数据个数 
l:为0表示正变换,1表示反变换 
il:1表示fr为取模结果。0表示fr输出实部fi输出虚部 
*/ 
void FFT(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; 
} 
}  
 
main() 
{ 
 while(1); 
}