[英]frequency / pitch detection for dummies
雖然我在這個網站上有很多關於音高檢測概念的問題......但它們都處理了我不熟悉的神奇FFT 。 我正在嘗試構建一個需要實現音調檢測的Android應用程序。 我完全不了解用於執行此操作的算法。
這可不是那么難嗎? 畢竟,Android市場上有大約80億個吉他調諧器應用程序。
有人可以幫忙嗎?
FFT實際上不是實現音調檢測或音高跟蹤的最佳方式。 一個問題是最響亮的頻率並不總是基頻。 另一個原因是FFT本身需要相當大量的數據和處理才能獲得調諧儀器所需的分辨率,因此響應速度似乎很慢(即延遲)。 另一個問題是FFT的結果必然是直觀的:你得到一個復數的數組,你必須知道如何解釋它們。
如果你真的想使用FFT,這里有一種方法:
你如何計算指數的頻率? 好吧,假設你有一個大小為N的窗口。在FFT之后,你將有N個復數。 如果您的峰值是第n個,並且您的采樣率是44100,那么您的峰值頻率將接近(44100/2)* n / N. 為什么附近? 你有錯誤(44100/2)* 1 / N. 對於4096的箱子,這大約是5.3Hz - 在A440處容易聽到。 您可以通過以下方面進行改進:考慮到相位(我只描述了如何考慮幅度),2。使用更大的窗口(這將增加延遲和處理要求,因為FFT是N Log N算法),或3.使用更好的算法,如YIN http://www.ircam.fr/pcm/cheveign/pss/2002_JASA_YIN.pdf
您可以跳過窗口步驟,只需將音頻分解為您要分析的許多樣本的離散塊。 這相當於使用方形窗口,但可能會在結果中產生更多噪音。
順便說一句:許多調諧器應用許可代碼形成第三方,如z-plane和iZotope。
更新 :如果你想要C源代碼和FFT方法的完整教程,我寫了一個 。 該代碼在Mac OS X上編譯和運行,並且應該可以很容易地轉換為其他平台。 它的設計並不是最好的,但它的設計易於理解。
快速傅里葉變換將功能從時域更改為頻域。 因此,代替f(t)
,其中f
是從麥克風獲得的信號, t
是該信號的時間索引,得到g(θ)
,其中g
是f
的FFT, θ
是頻率。 一旦你有g(θ)
,你只需要找到幅度最高的θ
,即“最響”的頻率。 這將是您正在拾取的聲音的主要音高。
至於實際實現FFT,如果你谷歌“快速傅里葉變換示例代碼”,你會得到一堆例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.