所以我一直在使用Web Audio API制作一个简单的HTML5调谐器。我把它全部设置为响应正确的频率,问题似乎是获得实际频率。使用输入,我创建了一个频谱阵列,在那里我寻找最高值并使用该频率作为馈入调谐器的频率。问题是,当在Web Audio中创建一个分析器时,它不能比DSC值2048更具体。当使用它时,如果我播放440hz音符,阵列中最接近的音符就像是430hz,下一个值似乎是因此调谐器会认为我正在播放这些音符,而实际上最响亮的频率应该是440hz而不是430hz。由于分析仪阵列中不存在这个频率,我试图想办法解决这个问题,或者我是否遗漏了一些非常明显的事情。
我是新手,所以任何帮助都会非常感激。
由于
答案 0 :(得分:4)
实施音调检测有多种方法。这个paper提供了对它们的评论。他们的结论是使用FFT可能不是最好的方法 - 然而,目前还不清楚他们基于FFT的算法实际上做了什么。
如果你只是将吉他弦调到固定频率,就会有更简单的方法。构建一个完全无色的调谐器,不知道 a-priori 预期的频率很难。
你正在使用的FFT方法是完全可能的(我已经使用这种方法构建了一个强大的乐器调谐器,被许多第三方使用白色标签)。但是,您需要对FFT数据进行大量的后处理。
首先,使用短定时器FFT(STFT)解决分辨率问题 - 或者更准确地说 - 解决它们的连续性问题。这个过程很好地描述了in this article。
如果你打算为吉他和低音吉他制作一个调音器(让我们面对它,每个问这里问题的人都是),你至少需要一个4092点的DFT和重叠的窗口才能不违反你的nyquist底部E1串的速率为~41Hz。
您需要克服许多其他算法和可用性障碍。尤其是,感知音高和频谱峰值并不总是相同的。从STFT中获取光谱峰值不能可靠地工作(这也是基本自相关方法也被打破的原因)。