DFT與IDFT


 

【轉】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)的實部
    }
    
}

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM