簡體   English   中英

Auriotouch,從頻率FFT獲得音符

[英]Auriotouch, get musical note from frequency FFT

我正在開發一種吉他調音器。

我有一個函數可以給出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箱的中心,因此其能量將分散在多個箱中。 您需要進行插值來估算實際頻率。
  • 除非你進行某種窗口操作,否則會產生“光譜泄漏”效應,這會影響你的光譜,使得很難辨別細節。

我很欣賞這並沒有真正回答你的問題,但它應該強調這一事實,這實際上是一件非常棘手的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM