我有这个代码,但它会随机返回0到1050左右的随机频率.请你帮我理解为什么会这样.
我的数据长度为1024,采样率为8192,数据是一个填充了麦克风输入数据的短阵列.
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);
Run Code Online (Sandbox Code Playgroud)
谢谢,
尼尔.
编辑:更改了代码,但它仍然返回随机频率.
假设oSignal以这种方式填充复数,实部和虚部交替,可能有助于改变
for(int y=0;y< 8191;y++)
Run Code Online (Sandbox Code Playgroud)
至
for(int y=0;y< 8191;y+=2)
Run Code Online (Sandbox Code Playgroud)
编辑:我甚至没有注意到你只传递了1024个样本.您必须传递与频域样本一样多的时域样本,在您的情况下为4096.
编辑:还有一件事:你显然是想找到某事的基频.除非某些东西是计算机生成的音调或人的哨声(两者都是非常纯净的音调),否则您可能会对结果感到失望.你发布的简单方法几乎不适用于长笛.
编辑:对于声音和吉他,你运气不好.我前段时间写了一个显示频域的程序,尝试一下,你会看到问题所在.如果您有兴趣,也有可用的来源.
最终编辑:你可能想阅读关于音高检测的维基百科文章.专注于时域方法.