首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Auriotouch,从frequency中获得音符

Auriotouch,从frequency中获得音符
EN

Stack Overflow用户
提问于 2011-03-16 12:07:19
回答 1查看 1.3K关注 0票数 4

我在研制吉他调谐器。

我有一个函数给我快速傅立叶变换,以及每个频率的FFT值。

我怎么才能从那里得到音符?我必须选择最高的山峰吗?

代码语言:javascript
复制
 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));

}

如果你能帮忙的话,非常感谢。

朱利安。

EN

回答 1

Stack Overflow用户

发布于 2011-03-16 12:16:28

这是一个非平凡的问题,原因有几点:

  • 峰值可能与基波不相对应(甚至可能缺失)。基波
  • 很可能不会精确地落在FFT桶的中心,因此它的能量将分散在多个垃圾箱上。您需要做插值来估计实际的frequency.
  • Unless,您执行某种窗口,您将得到“光谱泄漏”效应,这将抹黑您的光谱遍布各地,使它很难辨别细节。

我很感激这并没有真正回答你的问题,但它应该突出一个事实,这实际上是一个相当棘手的事情来做好。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5324999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档