1. 序列x(n)的离散傅立叶变换为:

2. 将序列x(n)按序号n的奇偶分成两组,即:

3. 周期性

4. 计算公式

5. 序列X(k)的离散傅立叶反变换为:

6. 运算量对比

7. 算法程序FFT.h

#include <math.h>
void fft(double x[], double y[], int n, int sign);

void fft(double x[], double y[], int n, int sign)
{
    int i,j,k,l,m,n1,n2;
    double c,c1,e,s,s1,t,tr,ti;
    for(j=1,i=1; i<16; i++)
    {
        m=i;
        j=2*j;
        if(j==n)break;
    }
    n1=n-1;
    for(j=0,i=0; i<n1; i++)
    {
        if(i<j)
        {
            tr=x[j];
            ti=y[j];
            x[j]=x[i];
            y[j]=y[i];
            x[i]=tr;
            y[i]=ti;
        }
        k=n/2;
        while(k<(j+1))
        {
            j=j-k;
            k=k/2;
        }
        j=j+k;
    }
    n1=1;
    for(l=1; l<=m; l++)
    {
        n1=2*n1;
        n2=n1/2;
        e=3.14159265359/n2;
        c=1.0;
        s=0.0;
        c1=cos(e);
        s1=-sign*sin(e);
        for(j=0; j<n2; j++)
        {
            for(i=j; i<n; i+=n1)
            {
                k=i+n2;
                tr=c*x[k]-s*y[k];
                ti=c*y[k]+s*x[k];
                x[k]=x[i]-tr;
                y[k]=y[i]-ti;
                x[i]=x[i]+tr;
                y[i]=y[i]+ti;
            }
            t=c;
            c=c*c1-s*s1;
            s=t*s1+s*c1;
        }
    }
    if(sign==-1)
    {
        for(i=0; i<n; i++)
        {
            x[i]/=n;
            y[i]/=n;
        }
    }
}

8. 部分运算结果

注:例程 (点击下载附件) 和《离散傅立叶变换》类似,只是头文件有所不同。

下一篇:《数字信号处理算法(3)-实序列快速傅立叶变换》

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:处理算法,FFT