gpt4 book ai didi

c - 保存在文件中的双样本的 FFTW

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:12 24 4
gpt4 key购买 nike

我正在尝试使用 FFTW 库计算 53k 双样本的 FFT,并在此基础上猜测信号的基频是多少。样本由sndfile库在wav输入文件的基础上生成(程序加载wav文件,生成double数据的样本并保存到文本文件)。每个样本的数量级范围从 -0.0009 到 +0.0009。使用下面介绍的函数计算 FFT 后,我收到 in[0][0] = -2.142。这是一种不正确的数据检索方法,或者输入文件不正确。我究竟做错了什么?传递给 FFTW 函数的数据是错误的,文件中存储的数据不正确还是我编写的函数不正确?缓冲区是一个包含样本的 float 组。

static fftw_complex* calculateFourier(float* buffer, const unsigned int bufferLen)
{

unsigned int i;
//const unsigned short windowSize = 1024;
fftw_plan result;
fftw_complex *out, *in;

in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * bufferLen);
out = (fftw_complex*) fftw_malloc( sizeof(fftw_complex) * bufferLen);

double* doubleBuffer = castToDouble(buffer, bufferLen);

for(i = 0; i < bufferLen; i++)
{
in[i][0] = doubleBuffer[i];
in[i][1] = 0.000000000000;
}

result = fftw_plan_dft_1d(bufferLen, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
//result = fftw_plan_dft_r2c_1d(fileSize, castToDouble(buffer, bufferLen), out, FFTW_MEASURE);

fftw_execute(result);

fftw_destroy_plan(result);

return out;
}
static double* castToDouble(float* buffer, const unsigned int bufferLen)
{
unsigned int i;
double* doubleBuffer = (double*)malloc( sizeof(double) * bufferLen);

for(i = 0; i < bufferLen; i++)
doubleBuffer[i] = (double)buffer[i];

return doubleBuffer;

}

最佳答案

我认为问题在于您没有应用 window function到你的原始数据。因此,傅里叶变换具有与样本缓冲区长度相对应的强频率分量。

尝试通过替换此行来应用汉宁窗:

in[i][0] = doubleBuffer[i];

用这个:

in[i][0] = doubleBuffer[i] * 0.5 * (1.0 - cos(2.0 * M_PI * i / (bufferLen - 1)));

(当然这个window function如果需要重复使用是可以缓存的)

关于c - 保存在文件中的双样本的 FFTW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36450196/

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