簡體   English   中英

假人的頻率/音高檢測

[英]frequency / pitch detection for dummies

雖然我在這個網站上有很多關於音高檢測概念的問題......但它們都處理了我不熟悉的神奇FFT 我正在嘗試構建一個需要實現音調檢測的Android應用程序。 我完全不了解用於執行此操作的算法。

這可不是那么難嗎? 畢竟,Android市場上有大約80億個吉他調諧器應用程序。

有人可以幫忙嗎?

FFT實際上不是實現音調檢測或音高跟蹤的最佳方式。 一個問題是最響亮的頻率並不總是基頻。 另一個原因是FFT本身需要相當大量的數據和處理才能獲得調諧儀器所需的分辨率,因此響應速度似乎很慢(即延遲)。 另一個問題是FFT的結果必然是直觀的:你得到一個復數的數組,你必須知道如何解釋它們。

如果你真的想使用FFT,這里有一種方法:

  1. 低通信號。 這有助於防止噪聲和高次諧波產生虛假結果。 可以想象,您可以跳過此步驟,而是將結果加權到FFT的較低值。 對於一些具有強基頻的儀器,這可能不是必需的。
  2. 窗口你的信號。 Windows應該至少4096。 更大是更好的一點,因為它為您提供更好的頻率分辨率。 如果你太大,最終會增加你的計算時間和延遲。 hann功能是您窗口的不錯選擇。 http://en.wikipedia.org/wiki/Hann_function
  3. 盡可能頻繁地對窗口信號進行FFT。 即使重疊的窗口也很好。
  4. FFT的結果是復數。 使用sqrt(real ^ 2 + imag ^ 2)查找每個復數的大小。 具有最大幅度的FFT陣列中的索引是具有峰值頻率的索引。
  5. 您可能希望平均多個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(θ) ,其中gf的FFT, θ是頻率。 一旦你有g(θ) ,你只需要找到幅度最高的θ ,即“最響”的頻率。 這將是您正在拾取的聲音的主要音高。

至於實際實現FFT,如果你谷歌“快速傅里葉變換示例代碼”,你會得到一堆例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM