【问题标题】:Comparing frequency taken from mic to known frequency比较从麦克风获取的频率与已知频率
【发布时间】:2013-05-23 00:24:31
【问题描述】:

我已经构建了一个应用程序,该应用程序从手机的麦克风中获取输入并计算频率。我正在使用 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 赫兹)。 由于计算值每秒波动很多次,因此我根本无法比较这些值,因为它进出界限。

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

谢谢

【问题讨论】:

    标签: java android fft frequency


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我会试一试的。我假设您的意思是使用环形缓冲区来存储计算出的频率。
    • 似乎已经让它稳定下来了。非常感谢
    • 没问题。很高兴听到我的帮助
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2018-02-05
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2019-04-01
      • 2018-06-20
      相关资源
      最近更新 更多