所以我一直在使用 Web Audio API 制作一个简单的 HTML5 调谐器。我已将其全部设置为响应正确的频率,问题似乎在于获取实际频率。使用输入,我创建一个频谱数组,在其中查找最高值并将该频率用作输入调谐器的频率。问题是,在 Web Audio 中创建分析器时,它不能变得比 FFT 值 2048 更具体。使用此功能时,如果我播放 440hz 音符,数组中最接近的音符类似于 430hz,下一个值似乎是高于 440。因此调音器会认为我正在演奏这些音符,而事实上最大的频率应该是 440hz 而不是 430hz。由于分析仪阵列中不存在该频率,因此我正在尝试找出解决此问题的方法,或者我是否遗漏了一些非常明显的东西。
我对此很陌生,因此非常感谢任何帮助。
谢谢
最佳答案
有多种方法可以实现基音检测。这个paper提供对它们的评论。他们的结论是,使用 FFT 可能不是最好的方法 - 然而,目前还不清楚他们基于 FFT 的算法实际上做了什么。
如果您只是将吉他弦调至固定频率,则存在更简单的方法。构建一个不知道预期频率的全半音调音器是很困难的。
您使用的 FFT 方法是完全可能的(我已经使用这种方法构建了一个强大的乐器调音器,许多第三方正在使用白标)。但是,您需要对 FFT 数据进行大量的后处理。
首先,您使用短定时器 FFT (STFT) 解决分辨率问题 - 或者更准确地说 - 一系列解决方案。该过程描述得很好in this article 。
如果您打算为吉他和贝斯吉他构建一个调音器(让我们面对现实,这里提出问题的每个人都是),您至少需要一个带有重叠窗口的 4092 点 DFT,以免违反奈奎斯特定律底部 E1 字符串的速率约为 41Hz。
您还有许多其他算法和可用性障碍需要克服。尤其重要的是,感知的音高和频谱峰值并不总是相同。从 STFT 获取频谱峰值并不可靠(这也是基本自相关方法也被破坏的原因)。
关于html - 调谐器的网络音频音调检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460607/