我使用FFT算法来检测声音的频率(吉他音高),当我从电脑上播放sinosoidal声音时,它会很好地估计它,但是当我使用吉他时它并不是那么完美。如何更好地估计音高频率?
double[] spectrum = FourierTransform.Spectrum(ref sampleBuffer);//spectrum contains data from FFT
double frequency = indexOfMax(spectrum) * 16000 / 500; //sampling rate/FFT size
//indexOfMax just finds the index of the maximum element in the array
为了生成使用的正弦波:http://www.audiocheck.net/audiofrequencysignalgenerator_sinetone.php并且这种波只是从光谱阵列中找到最大值,但我正在寻找更好的方法。
答案 0 :(得分:2)
对于吉他声,音高检测/估计的一些可能性包括使用FFT结果作为计算倒频谱用于倒频谱分析,或用于谐波积频谱分析或通过IFFT进行快速自相关的第一步(FFT() *共轭(FFT()))。
答案 1 :(得分:0)
乐器的自动音高确定非常重要。
看一下关于问题的倒谱法的这篇文章:Musical instrument Cepstrum