离散傅立叶变换给出不正确的结果

离散傅立叶变换给出不正确的结果,第1张

概述我试图在C中进行离散傅立叶变换. 最初只是蛮力方法.首先,我让程序打开一个数据文件(幅度)并将数据放入一个数组(只有一个,因为我限制自己使用实值输入). 但是转换看起来不对,所以我尝试生成一个简单的波函数并检查它是否正确转换. 这是我的代码,剥夺了花里胡哨的声音: #include <math.h>#include <stdio.h>#include <stdlib.h>#include < 我试图在C中进行离散傅立叶变换.

最初只是蛮力方法.首先,我让程序打开一个数据文件(幅度)并将数据放入一个数组(只有一个,因为我限制自己使用实值输入).

但是转换看起来不对,所以我尝试生成一个简单的波函数并检查它是否正确转换.

这是我的代码,剥夺了花里胡哨的声音:

#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define M_PI 3.14159265358979323846//the test wavefunctiondouble theoretical(double t){    double a = sin(M_PI * t) + 2 * sin(2 * M_PI * t) + 4 * sin(4 * M_PI * t);     return a;}//-------------------------------------------------------------------------voID dftreal(double inreal[],double outreal[],double outimag[],int linecount) {    int n,k;    for (k = 0; k < linecount; k++)    {        double sumreal = 0;        double sumimag = 0;        for (n = 0; n < linecount; n++)         {            double angle = 2 * M_PI * n * ( k / (double) linecount);            sumreal +=  inreal[n] * cos(angle);            sumimag +=  inreal[n] * sin(angle);        }        outreal[k] = sumreal;        outimag[k] = sumimag;    }}//=========================================================================int main(voID){     int linecount = 44100;     //creates all necessary arrays     double inreal[linecount],outreal[linecount],outimag[linecount],p[linecount];      file *fout = fopen("Output.txt","w");     for (int i = 0 ; i < linecount ; ++i)     {         inreal[i] = theoretical( i / (double) linecount);     }     //actually computes the transform     dftreal(inreal,outreal,outimag,linecount);      for (int i = 0 ; i < linecount ; ++i)     {          p[i] = 2*(outreal[i] * outreal[i] + outimag[i] * outimag[i]);          fprintf(fout,"%f %f \n",(i / (double) linecount),p[i]);     }     fclose(fout);     printf("\nEnd of program");     getchar();     return 0;}

程序编译,完成,但是在功率(频率)图上没有几个尖峰,我得到了:.

单个频率或不同频率给出完全相同的倒置浴盆曲线.

我检查了几个关于DFT的消息来源,我仍然不知道出了什么问题,这个函数似乎没有任何明显的错误:

dftreal

本身.我想就可能导致问题的原因寻求帮助.我在windows 7上使用MinGW编译器.谢谢!

解决方法 好消息是你的dftreal实现没有任何问题.

如果可以称之为问题,那么您使用的测试波形包括频率分量,这些频率分量的频率相对于采样率线数非常低.相应地,DFT表明能量集中在前几个箱中,一些谱泄漏到更高的箱中,因为波形频率分量不是采样率的精确倍数.

如果通过使频率相对于采样频率增加测试波形频率,例如:

//the test wavefunctiondouble theoretical(double t){  double f = 0.1*44100;  double a = sin(2 * M_PI * f * t) + 2 * sin(4 * M_PI * f * t) + 4 * sin(8 * M_PI * f * t);   return a;}

你应该得到一个情节,如:

总结

以上是内存溢出为你收集整理的离散傅立叶变换给出不正确的结果全部内容,希望文章能够帮你解决离散傅立叶变换给出不正确的结果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存