我有这段代码,但它不断返回从 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/