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)的实部
    }
    
}
复制代码

运行结果:

 

posted @   sgggr  阅读(2016)  评论(1编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示