gpt4 book ai didi

c - 离散傅里叶变换给出不正确的结果

转载 作者:太空狗 更新时间:2023-10-29 17:12:47 26 4
gpt4 key购买 nike

我正在尝试用 C 语言进行离散傅立叶变换。

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

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

这是我的代码,去掉了花里胡哨的东西:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define M_PI 3.14159265358979323846

//the test wavefunction
double 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;
}

程序编译、完成,但我得到的不是功率(频率)图上的几个尖峰,而是:I get this. .

单一频率或不同频率给出完全相同的倒浴缸曲线。

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

dftreal

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

最佳答案

好消息是您的 dftreal 实现没有任何问题。

问题,如果可以这样称呼的话,是您正在使用的测试波形包含相对于您的采样率 linecount 频率非常低的频率分量。相应地,DFT 显示能量集中在前几个 bin 中,一些频谱泄漏到更高的 bin 中,因为波形频率分量不是采样率的精确倍数。

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

//the test wavefunction
double 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;
}

您应该得到如下图: dftreal output with higher frequency test waveform

关于c - 离散傅里叶变换给出不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36239915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com