我想服用含有一个主频率,并说“这是一个比这个更高的”两个声音。 我可以做FFT,找到每个振幅最大的频率并进行比较。 我想知道如果,因为我有一个特定的任务,有可能是一个简单的算法。
声音与许多频率相当肮脏,但包含一个明确的主导间距。 他们不完全产生正弦波。
我想服用含有一个主频率,并说“这是一个比这个更高的”两个声音。 我可以做FFT,找到每个振幅最大的频率并进行比较。 我想知道如果,因为我有一个特定的任务,有可能是一个简单的算法。
声音与许多频率相当肮脏,但包含一个明确的主导间距。 他们不完全产生正弦波。
鉴于声音是相当脏,我建议在开始开发的算法与FFT的输出,因为它会更简单诊断任何问题。 然后,当你很高兴,它的工作,你可以考虑一下优化/简化。
作为一个经验法则开发这种数字算法的时候,我总是尝试先在最相关的领域工作(在这种情况下你感兴趣的频率,所以在频率空间分析)在启动,并完成所有行为本身考虑快捷方式/最佳化。 这样,你可以测试对表现最好的前后者的解决方案。
在一般情况下,体面的基音检测/估计通常需要更复杂的算法不是看FFT的峰值,而不是一个简单的算法。
有各种各样的音调检测方法由计算过零(这显然不会工作你的情况),以极其复杂的算法不等的复杂性。
虽然频域方法似乎是最合适的,它并不像“走的是FFT”一样简单。 如果您的数据是非常嘈杂,你可能有假峰是比你认为什么是主频更高。 一个解决方案是使用信号的窗口重叠的部分,做STFTs和平均的结果。 但是,这引起了更多的问题:有多大应该窗户呢? 在这种情况下,这取决于你所期望相距多远的主峰是,您的录音多长时间,等等。(注:FFT方法可以通过考虑相位信息,解决好于一元大小在这种情况下。 ,你就必须做更复杂的东西比你的所有FFT窗口平均起来)。
另一种方法将是一个时域的方法,例如殷:
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章获得MATLAB源代码佛印:
http://www2.hsu-hh.de/ant/dafx2002/DAFX_Book_Page_2nd_edition/matlab.html