c++ - FFT 问题(返回随机结果)

标签 c++ c fft

我有这段代码,但它不断返回从 0 到大约 1050 的随机频率。请你帮我理解为什么会这样。

我的数据长度是 1024,采样率是 8192,data 是一个短数组,里面填满了来自麦克风的输入数据。


float *iSignal = new float[2048];
float *oSignal = new float[2048];
int pitch = 0;

for(x=0;x<=1024;x++) {
    iSignal[x] = data[x];
}

fft(iSignal,oSignal,1024); //Input data, output data, length of input and output data

for(int y=0;y< 2048;y+=2) {
if((pow(oSignal[y],2)+pow(oSignal[y+1],2))>(pow(oSignal[pitch],2)+pow(oSignal[(pitch)+1],2))) {
        pitch = y;
    }
}

double pitchF = pitch / (8192.0/1024);
printf("Pitch: %f\n",pitchF);

谢谢,

尼尔。

编辑:更改了代码,但它仍然返回随机频率。

最佳答案

假设 oSignal 以这样一种方式填充复数,即实部和虚部交替出现,这可能有助于改变

for(int y=0;y< 8191;y++)

for(int y=0;y< 8191;y+=2)

编辑:我什至没有注意到您只传递了 1024 个样本。您必须传递与频域样本一样多的时域样本,在您的情况下为 4096。

编辑:还有一件事:您显然是在尝试找到某物的基频。除非那是计算机生成的音调或人声哨子(两者都是非常纯净的音调),否则您可能会对结果感到失望。您发布的简单方法几乎不适用于长笛。

编辑:对于声音和吉他,你运气不好。我写了a program前段时间那个显示频域的,试试看,就知道问题所在了。还有sources可用,如果您有兴趣。

最终编辑:您可能想阅读维基百科 article on pitch detection .专注于时域方法。

关于c++ - FFT 问题(返回随机结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1351381/

相关文章:

c++ - 由于错误的 Makefile 语法而未定义对库的引用?

c++ - 如何将字符串转换成char *数组

c - Arduino 无法读取按钮

audio - 将音频样本从时域转换为频域

c++ - 稀疏的BLAS不包括在BLAS中吗?

c++ - 库作为另一个库的依赖项

c - 进程死亡后的内存泄漏和其他资源

c++ - dlopen 找不到分解的符号

python - 对时间序列数据应用傅里叶变换并避免混叠

c# - 快速傅立叶变换(FFT)在C#中的实现