Auriotouch,从频率FFT获得音符

时间:2011-03-16 12:07:20

标签: c fft frequency pitch frequency-analysis

我正在开发一种吉他调音器。

我有一个函数可以给出FFT,以及每个频率的FFt值。

如何从那里获得音符?我必须选择最高峰吗?

 for(y=0; y<maxY; y++){


    CGFloat yFract = (CGFloat)y / (CGFloat)(maxY - 1);          

    CGFloat fftIdx = yFract * ((CGFloat)fftLength);
    double fftIdx_i,fftIdx_f;
    fftIdx_f = modf(fftIdx, &fftIdx_i);

    SInt8 fft_l, fft_r;
    CGFloat fft_l_fl, fft_r_fl;
    CGFloat interpVal;

    fft_l = (fftData[(int)fftIdx_i] & 0xFF000000) >> 24;
    fft_r = (fftData[(int)fftIdx_i + 1] & 0xFF000000) >> 24;


    fft_l_fl = (CGFloat)(fft_l + 80) / 64.;
    fft_r_fl = (CGFloat)(fft_r + 80) / 64.;
    interpVal = fft_l_fl * (1. - fftIdx_f) + fft_r_fl * fftIdx_f;
    interpVal = CLAMP(0., interpVal, 1.);


    drawBuffers[0][y] = (interpVal * 120);
    //NSLog(@"The magnitude for %f Hz is %f.", (yFract * hwSampleRate * .5), (interpVal * 120));

}

如果你能提供帮助,非常感谢。

于连。

1 个答案:

答案 0 :(得分:3)

这是一个非常重要的问题,原因如下:

  • 峰值可能与基波不对应(甚至可能缺失)。
  • 基波谐波可能不会准确地落在FFT箱的中心,因此它的能量将分散在多个箱中。您需要进行插值来估算实际频率。
  • 除非你进行某种窗口操作,否则会产生“光谱泄漏”效应,这会影响你的光谱,使得很难辨别细节。

我很欣赏这并没有真正回答你的问题,但它应该突出这样一个事实,即做这件事实际上是一件非常棘手的事情。