【轉】https://blog.csdn.net/mingzhuo_126/article/details/88044390
二.編程實現
考濾到DFT和IDFT算法過程中有部分相似,可以把它們合成到一個算法。
/* x-存放要變換數據的實部 y-存放要變換數據的虛部 a-存放變換結果的實部 b-存放變換結果的虛部 n-數據長度 sign-為1時執行DFT,為-1時執行IDFT */ #include "math.h" void dft(x,y,a,b,n,sign) int n, sign; double x[],y[],a[],b[]; { int i,k; double c,d,q,w,s; q = 6.28318530718/n; for (k=0;k<n;k++) { w=k*q; a[k]=b[k]=0.0; for(i=0;i<n;i++) { d=i*w; c=cos(d); s=sin(d)*sign; a[k]+=c*x[i] + s*y[i]; b[k]+=c*y[i] - s*x[i]; } } if(sign == -1) { c=1.0/n; for (k=0;k<n;k++) { a[k]=c*a[k]; b[k]=c*b[k]; } } }
下面驗證此算法,對X(n)=(0,1,2,3,4,5,6,7),做DFT和IDFT算法
dft_d.c
#include "stdio.h" #include "math.h" #include "dft.c" #define N 4 static double x[N],y[N],a[N],b[N],c[N]; main(){ int k; int i=0; for(i=0; i<N; i++) { x[i]=i; y[i]=0; } dft(x,y,a,b,N,1); //DFT變換 for(i=0; i<N; i++) { c[i]=sqrt(a[i]*a[i]+b[i]*b[i]); //算出模 printf("%lf + j %lf \n",a[i],b[i]);//輸出變換后結果 printf("%lf \n",c[i]); //輸出模值 printf("\n"); } dft(a,b,x,y,N,-1); //IDFT變換 for(i=0; i<N; i++) { printf("%lf \n",x[i]); //輸出x(n)的實部 } }
運行結果: