FFT问题(返回随机结果)

Nia*_*all 1 c c++ fft

我有这个代码,但它会随机返回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)

谢谢,

尼尔.

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

ava*_*kar 7

假设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.

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

编辑:对于声音和吉他,你运气不好.我前段时间写了一个显示频域的程序,尝试一下,你会看到问题所在.如果您有兴趣,也有可用的来源.

最终编辑:你可能想阅读关于音高检测的维基百科文章.专注于时域方法.