2013-06-30 60 views
3

我想開發音符探測器作爲我的學位項目,我想從頭開始。我已經編寫了用於「.wav」文件的代碼,該文件從該音頻音樂文件中提取所有信息,併爲此給出幅度。如何獲得以赫茲爲單位的DFT/FFT輸出頻率?

然後我寫了一個DFT的代碼 - 它給我輸出一個複數,其中一個軸(實數/虛數)是振幅/幅度,另一個是相位。

現在我想要的答案在頻率(赫茲不在向量)的問題,所以我可以檢查我的DFT是否給我正確的輸出。我如何將我的DFT輸出轉換爲頻率?

我有C語言編寫這一點,我不希望使用任何內置庫

+0

當你說實軸是振幅而虛軸是相位時,你是在自己計算一下嗎?或者直接從DFT中拉出來?當你從DFT得到複雜的結果時,振幅就是結果的絕對值,相位就是結果的角度(又稱參數)。 –

+0

是的,我自己計算DFT,意味着我得到的公式是「Sigma從k = 0 - > N-1,對於所有f(x)* W * N,這裏W * N = e ^( - i 2 PI/N)「就像這樣......我只是把這個公式轉換成我的C程序。 – mossad

+2

峯值FFT大小處的頻率段頻率通常不是音樂音頻中的音符音高。 – hotpaw2

回答

10

你需要找到的峯值幅度然後制定出相應的頻率:

  • 計算每個DFT輸出bin的大小:magnitude = sqrt(re*re+im*im)
  • 找到最大大小的bin,將其索引稱爲i_max
  • 計算該bin的等效頻率:freq = i_max * Fs/N,這裏Fs =採樣率(Hz)和N = FFT中沒有點。

請參閱this answer瞭解bin索引和頻率如何相關的更詳細說明。

+0

對不起保羅R,但我沒有得到它。我也計算了我的DFT結果的幅度。現在的問題是我必須找到每個窗口(1024個樣本)的i_max?而根據我所讀到的關於DFT,我只是在512個樣本上找到這個數值,這個數值是我得到最大值的N/2。 m我right.means我想asj dat ..並且也非常感謝你.. :) – mossad

相關問題