【发布时间】: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