2011-09-21 80 views
5

我在這裏看到了各種FFT問題,但我對部分實現感到困惑。我不想實時執行FFT,而是想離線執行。可以說我有float[] audio的原始數據。採樣率是44100,因此audio[0] to audio[44099]將包含1秒鐘的音頻。如果我的FFT函數處理窗口(例如Hanning),那麼我只需簡單地將整個audio緩衝區放入函數中即可?或者,我是否必須將音頻分成4096個塊(我的窗口大小),然後將其輸入FFT,然後在頂部執行窗口功能?FFT - 何時開窗?

+1

當然這個要看FFT庫的細節,你正在使用。 – Mankarse

+0

這個問題更適合dsp.stackexchange.com。它應該被移動嗎? –

+0

@Mankarse - 對,對不起,我應該更具體。我有三個不同的FFT庫,並不確定我要使用哪一個。我決定使用Apple的Accelerate框架。 – Skoder

回答

2

您可能需要您輸入的數據複製到一個單獨的緩衝區,並把它以正確的格式,例如如果你的FFT是就地的,或者它需要交織的複雜數據(真實/虛構)。但是,如果您的FFT例程可以採用純粹的實際輸入並且不在原地(即非破壞性),那麼您可能只需將指針傳遞給原始採樣數據以及適當的大小參數即可。

通常對於1s音頻,例如語音或音樂,你會選擇一個對應於合理靜止的音頻塊的FFT大小,例如, 10毫秒或20毫秒。因此,在44.1 kHz處,FFT的大小可能是512或1024.然後,您將通過前進緩衝區並在每個起始點執行新的FFT生成連續譜。請注意,通常將這些連續的緩衝區重疊,通常爲50%。所以,如果N = 1024的第一FFT將樣品0..1023,你的第二個將樣品512..1535,然後1024..2047等

+0

感謝您的幫助保羅。我將使用Apple的Accelerate框架,我認爲它執行了原地FFT,因此我認爲我需要在單獨的緩衝區中操作數據。因此,如果我有一首180秒長的歌曲,我只是按照所述的方法遍歷緩衝區,然後執行FFT,最高N = 7938000(44100 * 180)? – Skoder

+2

如果函數名稱以「ip」結尾,則它就地,例如, 'vDSP_fft_zrip'。所以是的,將每一塊輸入數據複製到合適的FFT緩衝區,應用一個窗函數(如Hann),應用FFT,計算功率譜或任何你想要做的,存儲和/或顯示這個塊的功率譜,繼續到下一個塊... –

+1

另請參閱:http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

你選擇控制塊大小或窗口長度頻率分辨率和FFT結果的時間分辨率。你必須確定你想要做什麼或做什麼折衷。

更長的窗戶給你更好的頻率分辨率,但糟糕的時間分辨率。較短的窗戶,反之亦然。根據窗口形狀(矩形,von Hann等),每個FFT結果倉將包含的採樣率除以FFT長度的頻率帶寬大約爲採樣率的1到2倍,而不僅僅是單個頻率。如果您的整個數據塊是固定的(頻率內容不會改變),那麼您可能不需要任何時間分辨率,並且可以在1秒鐘的數據中達到1至2 Hz的頻率「分辨率」。平均多個短FFT窗口也可能有助於減少譜估計的方差。

+0

不確定您是否熟悉它,但我正在嘗試創建類似於AudioSurf的內容(此視頻在http://www.youtube.com/watch?v=上顯示了一個速度識別大約20秒的好例子2EsVyEnhxWY)。 AudioSurf預處理音頻,而不是實時進行,我不太確定這是如何完成的。 – XSL

+0

@SSL - 你爲什麼只看1秒速度識別數據的FFT?或者,如果這是關於OP的原始問題之外的事情,那麼也許你應該在SO上提出自己的新問題。 – hotpaw2

+0

這是超出了原來的問題,但我對OP的同樣的事情感到好奇。我現在不需要這些信息,因此當我穿過那座橋時,我會創建一個新線程。 – XSL

2

選擇是否計算整個數據集上的一個FFT(在OP的情況下,代表1秒數據的44100個採樣),還是在整個數據集的較小子集上執行一系列FFT,取決於數據和FFT的預期用途。

如果數據是相對靜態頻譜在整個數據集,然後一個FFT在整個數據集可能是所有的需要。

然而,如果數據是通過數據集頻譜動態,那麼多個滑動FFT的對數據的小子集將創建的數據的更準確的時間 - 頻率表示。

下圖顯示了木吉他彈奏一個音符A4的功率譜。音頻信號以44.1KHz採樣,數據集包含131072個採樣,幾乎3秒的數據。該數據集預先乘以Hann窗口函數。

Guitar spectrum, Hann window, 131072 samples

下面的曲線圖示出的16384個樣本(0〜16383)從聲學吉他A4音符的完整的數據集所取的子集的功率譜。該子集還與Hann窗口函數預乘。

Guitar spectrum, Hann window, 16384 samples

通知該子集的光譜能量分佈是如何從完整的數據集的頻譜能量分佈顯著不同。如果我們要從完整的數據集中提取子集,使用滑動的16384樣本幀,並計算每個幀的功率譜,我們將創建一個完整數據集的精確時間 - 頻率圖片。

參考文獻:

真實音頻信號數據,Hann窗函數,圖表,FFT和頻譜分析,在這裏完成:

Fast Fourier Transform, spectral analysis, Hann window function, audio data