2013-05-21 110 views
0

閱讀沒有找到後音頻信號的頻率和幅度。這裏的帖子本身我已經在錄製的音頻(.wav)文件上應用了一種FFT算法,將其從時域轉換到頻域。爪哇 - 利用FFT

因此,我已經得到含有一些值數組作爲

magnitude[i] = sqrt(re*re+im*im); 

現在,作爲標題說我有使用這種大小陣列找到信號(複雜的聲音即語音)的頻率和幅度,但是我不知道如何使用這個陣列做進一步的處理。FFT的大小是1024,採樣率是48000Hz。 請幫我進一步處理。

回答

0

如果你只是希望對單一最大(正弦)分量然後通過大小陣列掃描,直到找到最大值,那麼這個值的指數轉換成其對應的頻率,即

mag_max = magnitude[0]; 
i_max = 0; 
for (i = 1; i < N; ++i) 
{ 
    if (magnitude[i] > mag_max) 
    { 
     mag_max = magnitude[i]; 
     i_max = i; 
    } 
} 

您現在擁有mag_max峯值和i_max索引值。你可以得到的頻率是這樣的:

f_max = i_max * Fs/N; 

其中Fs是採樣率(和N當然是FFT的大小)。

當然,如果你正在尋找的東西像一個複雜的聲音(例如語音或樂器)的間距那麼事情就會變得很多更加複雜。您可能需要查看一般的諧波產品頻譜算法和pitch detection algorithms

+0

感謝您的快速幫助保羅,是因爲你說,我想找到頻率。和一個複雜的聲音幅度。那麼我應該如何處理它與這個幅度數組呢? – Panky90

+0

如果你想做* pitch *檢測,那麼你真的需要回到繪圖板。使用基於FFT的方法是可能的,但它不是微不足道的(參見「諧波產品譜」),並且有更好的方法。以[維基百科頁面上的音高檢測](https://en.wikipedia.org/wiki/Pitch_detection_algorithm)爲出發點。 –

+0

好的保羅,我會通過該wiki頁面。但是,你有一些Java實現的任何這樣的算法或Java庫,可以爲我的目的嗎? – Panky90