我想拍两个含有主导频率的声音并说'这个比这个高一个'。我可以做FFT,找到每个幅度最大的频率并进行比较。我想知道,由于我有一个特定的任务,可能有一个更简单的算法。
声音非常脏,有许多频率,但包含明显的主导音高。它们不是完美的正弦波。
答案 0 :(得分:1)
鉴于声音非常脏,我建议开始用FFT输出开发算法,因为它可以更简单地诊断任何问题。然后,当您对它的工作感到满意时,您可以考虑优化/简化。
作为开发这种数值算法时的经验法则,我总是尝试在最相关的领域中首先运行(在这种情况下,您对频率感兴趣,因此在频率空间中进行分析)在开始时,一切都在表现自己考虑捷径/优化。通过这种方式,您可以针对性能最佳的前者测试后一种解决方案。
答案 1 :(得分:0)
在一般情况下,体面pitch detection/estimation通常需要比查看FFT峰更复杂的算法,而不是更简单的算法。
答案 2 :(得分:0)
有各种各样的音调检测方法,从计算零交叉(显然在你的情况下无法工作)到极其复杂的算法都很复杂。
虽然频域方法似乎最合适,但它并不像采用FFT"那样简单。如果您的数据非常嘈杂,则可能存在高于您认为的主要频率的虚假峰值。一种解决方案是使用窗口重叠信号段,并进行STFT,并对结果取平均值。但这引出了更多问题:窗户应该有多大?在这种情况下,它取决于您对这些主要峰值的距离,录制时间等等(注意:通过考虑相位信息,FFT方法可以解决为优于单位大小。在这种情况下,你必须做一些比平均所有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