gpt4 book ai didi

c - Auriotouch,从频率FFT获取音符

转载 作者:太空狗 更新时间:2023-10-29 15:36:57 24 4
gpt4 key购买 nike

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

我有一个函数可以提供 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 bin 的中心,因此它的能量将分布在多个 bin 中。您需要进行插值来估算实际频率。
  • 除非您执行某种窗口化,否则您将获得“光谱泄漏”效应,这会在整个地方涂抹您的光谱,使您难以辨别细节。

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

关于c - Auriotouch,从频率FFT获取音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5324999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com