比较从麦克风到已知频率的频率

时间:2013-05-23 00:24:32

标签: java android fft frequency

我已经构建了一个应用程序,它从手机的麦克风输入并计算频率。我正在使用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

现在这个数字变化很快,甚至不会保持不变(虽然保持在一个范围内)持续音符(我的吹口哨/吉他弦)

我有一系列已知的吉他弦频率(Open E string为82.407 hz)。 由于计算出的频率每秒波动很多次,所以当它进出界限时,我无法对它们进行比较。

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

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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