2009-08-13 50 views
15

我想獲取音頻PCM數據並在其中找到峯值。具體而言,我想返回出現峯值的頻率和時間。向我解釋FFT

我的理解是,我必須將PCM數據轉儲到一個數組中,並將其設置爲真實值,並將複雜部分設置爲0.然後,我接受FFT,然後得到一個數組。如果數組中的每個數字都是一個數值,我如何得到與每個數字相關的頻率?另外,我是否會考慮實際的複雜部分的大小或者放棄複雜的值?

最後,如果我想在單首歌曲中找到峯值,只需設置一個小窗口進行FFT並將其滑過所有音頻?有關這個窗口應該多大的任何建議?

+1

在音頻PCM數據中找到峯值與查找FFT中的峯值不同。你究竟想要做什麼? – endolith 2009-08-16 05:54:54

回答

3

你實際上可能會尋找一個spectrogram,這基本上就沿着時間軸滑動的小窗口中的數據的FFT。如果你有軟件來實現它,它可能會爲你節省一些工作。這是常用於分析時變聲學信號的方法,是查看聲音的一種非常有用的方法。此外,還有一些技巧,例如,用於FFT的窗口化數據,頻譜圖可能會正確,但會更難(儘管不是很難)讓您正確執行。

15

如果PCM數據的採樣率是F,那麼FFT中的最高頻率分量是F/2。假設你的PCM數據是以44100Hz採樣的,那麼你的FFT值將從0Hz(DC)運行到22050Hz。如果從N個採樣開始(N是2的冪),則FFT可以返回表示從0到F/2的所有正頻率的N/2值,或者可以返回也包括負頻率的N個值 - F/2爲0.您應該檢查FFT算法的規格,以確定每個陣列項目映射到的頻率。

要查找峯值,您需要查看FFT值的大小。所以你需要添加每個複數值的平方實部和虛部。

假設您的N個PCM樣本的FFT返回表示正頻率的N/2個複數值。那麼2個複雜樣本之間的距離是F/2N Hz。當F = 44100Hz和N = 1024個樣本時,這將是21.5Hz。這是你的頻率分辨率。如果您需要查找頻率較低的節拍,則需要擴展FFT窗口。

4

well, 一個大小爲512的複數表示輸入波的原始數組,當用FFT處理時,我們將用零(根據預期用途)替換虛部,留下實部,然後將數組傳遞給採樣率爲8192 Hz的FFT。

現在我們有一個512位的FFT實數值陣列,每個值是一個無理數,每個無理數都表示幾個有用的值。

要得到我們必須除以緩衝區大小的採樣速率的基本頻率:

五百一十二分之八千一百九十二= 32;

32是FFT值的分辨率意味着我們正在瞭解32倍數的附近的高幅度頻率。

一樣,如果我們有一個波的

頻率:3 48 23 128 振幅:10 5 12 8分貝(REF = 1)

FFT我們得到:

頻率:0 32 64 128 振幅:9 8 2 8

FFT是頻域意味着它根據頻率排列在另一側上 時域是指通過時間安排我們聽音樂從開環第二零到第二N.

FFT只能聽時,它設置成通過從頻率頻率0到頻率N.

所以排列以升序的頻率,因爲它沒有考慮從全部的實際樣品音頻(接近無限),比FFT少了每納秒&,幸運的是這不會發生FFT從音頻中採樣,每採樣一次(採樣率爲1)採樣一次。這個採樣被緩衝(在我們的例子中是512),每512個採樣被緩存到FFT中,輸出是512個FFT值。

由於FFT安排頻率,它與時間樣本攪亂,樣本現在根據它們的頻率排列。

定期基礎中示出的頻率是基本頻率是由緩衝大小除以採樣率,這是在我們的例子五百十二分之八千一百九十二= 32。

所以,頻率功率示出每32個頻率,功率根據電力頻率接近指數顯示最接近頻率。

高分辨率可以通過使用更高的採樣率來實現。

要顯示頻率,我們按照幅度升序打印索引。

振幅= 20log10(輸出/ REF)

振幅旁邊的每個索引打印顯示頻率的功率&獲得更準確的根據分辨率的精度。

結論中,FFT產生一個幅度指標,每個幅度表示其相應指標(頻率)的功率。