【问题标题】:Auriotouch, get musical note from frequency FFTAuriotouch,从频率 FFT 中获取音符
【发布时间】:2011-07-16 13:11:43
【问题描述】:

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

我有一个函数可以给我 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));

}

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

朱利安。

【问题讨论】:

  • 已经有很多关于使用 FFT 等进行乐器音高检测的问题和答案 - 你可能想回去阅读其中的一些,因为它们涵盖了很多“常见问题解答”对于这种任务。似乎很多人都在尝试为 iPhone 和其他移动设备编写吉他调音器......

标签: c fft frequency pitch frequency-analysis


【解决方案1】:

这是一个重要的问题,有几个原因:

  • 峰值可能与基波不对应(甚至可能丢失)。
  • 基本谐波可能不会精确地落在 FFT bin 的中心,因此其能量将分散到多个 bin 中。您需要进行插值来估计实际频率。
  • 除非您执行某种窗口化,否则您会得到“光谱泄漏”效应,这会将您的光谱涂抹在各处,从而难以辨别细节。

我很欣赏这并不能真正回答您的问题,但它应该强调一个事实,即这实际上是一件很难做好的事情。

【讨论】:

  • 感谢您的快速回答。我已经在应用一个加权窗口。如何找到基本谐波?
  • "你需要做插值" + "你会得到 "光谱泄漏" " = 难题。查看“slepian windowing”以进行稳健的光谱估计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2011-12-02
  • 2019-09-05
  • 2019-03-14
相关资源
最近更新 更多