gpt4 book ai didi

java - 假人的频率/音调检测

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:53 24 4
gpt4 key购买 nike

虽然我在这个网站上有很多关于音调检测概念的问题……它们都涉及我不熟悉的神奇的FFT。我正在尝试构建一个需要实现音高检测的 Android 应用程序。我完全不了解用于执行此操作的算法。

不会那么难吧?毕竟,Android 市场上大约有 80 亿个吉他调音器应用程序。

有人可以帮忙吗?

最佳答案

FFT 并不是实现音高检测或音高跟踪的最佳方式。一个问题是最响亮的频率并不总是基频。另一个是 FFT 本身需要大量的数据和处理才能获得调谐仪器所需的分辨率,因此它可能看起来响应缓慢(即延迟)。另一个问题是,FFT 的结果必须直观易用:您得到一组复数,您必须知道如何解释它们。

如果你真的想使用 FFT,这里有一种方法:

  1. 低通你的信号。这将有助于防止噪声和高次谐波产生虚假结果。可以想象,您可以跳过这一步,而是将您的结果加权为 FFT 的较低值。对于一些基频很强的仪器,这可能没有必要。
  2. 窗口你的信号。 Windows 的大小至少应为 4096。越大越好,因为它可以为您提供更好的频率分辨率。如果你变得太大,它最终会增加你的计算时间和延迟。 hann 函数是您窗口的不错选择。 http://en.wikipedia.org/wiki/Hann_function
  3. 尽可能频繁地对窗口信号进行 FFT。即使重叠的窗口也很好。
  4. FFT 的结果是复数。使用 sqrt( real^2 + imag^2 ) 求出每个复数的大小。 FFT 数组中幅度最大的索引是您的峰值频率的索引。
  5. 您可能希望对多个 FFT 进行平均以获得更一致的结果。

如何根据索引计算频率?好吧,假设您有一个大小为 N 的窗口。在 FFT 之后,您将有 N 个复数。如果您的峰值是第 n 个,并且您的采样率为 44100,那么您的峰值频率将接近 (44100/2)*n/N。为什么靠近?好吧,你有 (44100/2)*1/N 的错误。对于 4096 的 bin 大小,这大约是 5.3 Hz——在 A440 上很容易听到。您可以通过以下方式改进它:1. 考虑相位(我只描述了如何考虑幅度),2. 使用更大的窗口(这将增加延迟和处理要求,因为 FFT 是 N Log N 算法),或 3. 使用更好的算法,如 YIN http://www.ircam.fr/pcm/cheveign/pss/2002_JASA_YIN.pdf

您可以跳过窗口化步骤,只需将音频分成离散的 block ,无论您要分析多少样本。这等同于使用方形窗口,它可以工作,但您的结果中可能会出现更多噪音。

顺便说一句:许多调谐器应用程序的许可代码来自第三方,例如 z-plane 和 iZotope。

更新:如果您想要 C 源代码和 FFT 方法的完整教程,我有 written one .代码在 Mac OS X 上编译和运行,应该可以很容易地转换到其他平台。它并非旨在成为最好的,但旨在易于理解。

关于java - 假人的频率/音调检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com