0

我已经构建了一个应用程序,它从手机的麦克风中获取输入并计算频率。我正在使用 Jtransform 库来计算 FFT,从而计算频率。

我已经关注了之前关于这个问题的问题,这是我选择的方法:

sampleSize = 1024
sampleRate = 8000

audioData is the array I have filled with mic input
fft.complexForward(audioData)

该方法计算fft,依次存储实数和虚数

re[] = real number array
im[] = imaginary number array
magnitude[i] = math.sqrt((re[i]*re[i])+(im[i]*im[i]))

然后我得到最大的幅度/峰值

Frequency = sampleRate * peak/sampleSize

现在这个数字变化很快,甚至在持续的音符(我的口哨/吉他弦)上都没有保持不变(尽管保持在一个范围内)

我有一组已知的吉他弦频率(开放 E 弦为 82.407 赫兹)。由于计算值每秒波动很多次,所以我根本无法比较这些,因为它进出界限。

有没有一种方法可以应用于这个问题以获得更稳定的频率?或者这是获得吉他弦频率的正确方法吗?

谢谢

4

2 回答 2

1

选项 1:使用更长的采样窗口(增加样本量)。

选项 2:存储包含多个结果的环形缓冲区并显示环形缓冲区中所有值的平均值。环形缓冲区是一个固定长度的缓冲区,用于存储结果,其中每个新结果都会写入下一个位置,直到缓冲区已满,此时您会覆盖缓冲区中的第一个值。

于 2013-05-23T00:50:05.813 回答
0

FFT 结果的峰值幅度不是确定吉他音高频率的正确方法。

音高是人类的一种心理声学现象,往往与谱峰频率有很大不同。为了获得可靠的结果,您将需要使用音高检测或估计方法,而不是峰值频率估计器。此类基音估计方法包括加权自相关和类似的滞后评估器、倒谱/倒谱方法、谐波乘积谱以及诸如 RAPT 和 YAAPT 之类的复合算法。等等有很多关于音高估计方法的研究论文。

于 2013-05-23T02:09:20.703 回答