我想取两个包含主导频率的声音,然后说“这个比这个高”。我可以做 FFT,找到每个振幅最大的频率并进行比较。我想知道,因为我有一个特定的任务,是否可能有一个更简单的算法。
声音很脏,有很多频率,但包含清晰的主导音高。它们不是完美产生的正弦波。
鉴于声音很脏,我建议开始使用 FFT 的输出开发算法,因为诊断任何问题会更简单。然后,当您对它的工作感到高兴时,您可以考虑优化/简化。
作为开发这种数值算法的经验法则,我总是首先尝试在最相关的领域(在这种情况下你对频率感兴趣,所以在频率空间中分析)一开始,一旦一切正常本身考虑快捷方式/优化。这样,您就可以针对表现最好的前者来测试后者的解决方案。
有多种音高检测方法,从计算过零(这显然不适用于您的情况)到极其复杂的算法,不一而足。
虽然频域方法似乎最合适,但它并不像“采用 FFT”那么简单。如果您的数据非常嘈杂,则可能会出现高于您认为的主频率的杂散峰值。一种解决方案是使用信号的窗口重叠段,并进行 STFT,并对结果进行平均。但这提出了更多问题:窗户应该有多大?在这种情况下,这取决于您期望这些主峰相距多远,您的记录有多长等(注意:FFT 方法可以通过考虑相位信息来解决比一个 bin 大小更好的问题。在这种情况下,您将不得不做一些比将所有 FFT 窗口平均在一起更复杂的事情)。
另一种方法是时域方法,例如 YIN:
http://recherche.ircam.fr/equipes/pcm/cheveign/pss/2002_JASA_YIN.pdf
维基百科讨论了更多方法:
http://en.wikipedia.org/wiki/Pitch_detection_algorithm
您还可以在本书的第 9 章中探索更多方法:
http://www.amazon.com/DAFX-Digital-Udo-ouml-lzer/dp/0471490784
你可以从这本书的第 9 章获得 yin 的 matlab 源代码:
http://www2.hsu-hh.de/ant/dafx2002/DAFX_Book_Page_2nd_edition/matlab.html
在一般情况下,体面的音高检测/估计通常需要比查看 FFT 峰值更复杂的算法,而不是更简单的算法。