我在這裏看到了各種FFT問題,但我對部分實現感到困惑。我不想實時執行FFT,而是想離線執行。可以說我有float[] audio
的原始數據。採樣率是44100,因此audio[0] to audio[44099]
將包含1秒鐘的音頻。如果我的FFT函數處理窗口(例如Hanning),那麼我只需簡單地將整個audio
緩衝區放入函數中即可?或者,我是否必須將音頻分成4096個塊(我的窗口大小),然後將其輸入FFT,然後在頂部執行窗口功能?FFT - 何時開窗?
回答
您可能需要您輸入的數據複製到一個單獨的緩衝區,並把它以正確的格式,例如如果你的FFT是就地的,或者它需要交織的複雜數據(真實/虛構)。但是,如果您的FFT例程可以採用純粹的實際輸入並且不在原地(即非破壞性),那麼您可能只需將指針傳遞給原始採樣數據以及適當的大小參數即可。
通常對於1s音頻,例如語音或音樂,你會選擇一個對應於合理靜止的音頻塊的FFT大小,例如, 10毫秒或20毫秒。因此,在44.1 kHz處,FFT的大小可能是512或1024.然後,您將通過前進緩衝區並在每個起始點執行新的FFT生成連續譜。請注意,通常將這些連續的緩衝區重疊,通常爲50%。所以,如果N = 1024的第一FFT將樣品0..1023,你的第二個將樣品512..1535,然後1024..2047等
感謝您的幫助保羅。我將使用Apple的Accelerate框架,我認爲它執行了原地FFT,因此我認爲我需要在單獨的緩衝區中操作數據。因此,如果我有一首180秒長的歌曲,我只是按照所述的方法遍歷緩衝區,然後執行FFT,最高N = 7938000(44100 * 180)? – Skoder
如果函數名稱以「ip」結尾,則它就地,例如, 'vDSP_fft_zrip'。所以是的,將每一塊輸入數據複製到合適的FFT緩衝區,應用一個窗函數(如Hann),應用FFT,計算功率譜或任何你想要做的,存儲和/或顯示這個塊的功率譜,繼續到下一個塊... –
另請參閱:http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –
你選擇控制塊大小或窗口長度頻率分辨率和FFT結果的時間分辨率。你必須確定你想要做什麼或做什麼折衷。
更長的窗戶給你更好的頻率分辨率,但糟糕的時間分辨率。較短的窗戶,反之亦然。根據窗口形狀(矩形,von Hann等),每個FFT結果倉將包含的採樣率除以FFT長度的頻率帶寬大約爲採樣率的1到2倍,而不僅僅是單個頻率。如果您的整個數據塊是固定的(頻率內容不會改變),那麼您可能不需要任何時間分辨率,並且可以在1秒鐘的數據中達到1至2 Hz的頻率「分辨率」。平均多個短FFT窗口也可能有助於減少譜估計的方差。
選擇是否計算整個數據集上的一個FFT(在OP的情況下,代表1秒數據的44100個採樣),還是在整個數據集的較小子集上執行一系列FFT,取決於數據和FFT的預期用途。
如果數據是相對靜態頻譜在整個數據集,然後一個FFT在整個數據集可能是所有的需要。
然而,如果數據是通過數據集頻譜動態,那麼多個滑動FFT的對數據的小子集將創建的數據的更準確的時間 - 頻率表示。
下圖顯示了木吉他彈奏一個音符A4的功率譜。音頻信號以44.1KHz採樣,數據集包含131072個採樣,幾乎3秒的數據。該數據集預先乘以Hann窗口函數。
下面的曲線圖示出的16384個樣本(0〜16383)從聲學吉他A4音符的完整的數據集所取的子集的功率譜。該子集還與Hann窗口函數預乘。
通知該子集的光譜能量分佈是如何從完整的數據集的頻譜能量分佈顯著不同。如果我們要從完整的數據集中提取子集,使用滑動的16384樣本幀,並計算每個幀的功率譜,我們將創建一個完整數據集的精確時間 - 頻率圖片。
參考文獻:
真實音頻信號數據,Hann窗函數,圖表,FFT和頻譜分析,在這裏完成:
Fast Fourier Transform, spectral analysis, Hann window function, audio data
- 1. 使用滑動窗口FFT
- 2. Hanning窗口和在線FFT
- 3. FFT +短期窗口:(?)混亂
- 4. 實時做FFT
- 5. 實時FFT繪圖
- 6. 非常窄的FFT窗函數?
- 7. 錯誤的結果繪製窗口FFT
- 8. FFT的窗口大小的意義
- 9. 用於FFT的窗口化實時音頻數據
- 10. Matlab:conv() - > fft()* fft() - > ifft()
- 11. 如何打開新窗口時打開父窗口
- 12. iPhone AudioStreamer AudioQueue實時FFT
- 13. 恢復時期從FFT
- 14. 使用1D FFT的2D FFT
- 15. CUDA FFT異常
- 16. 開始使用FFT複雜的階級
- 17. 檢測窗口何時被打開
- 18. 窗口窗體打開時的延遲
- 19. 向我解釋FFT
- 20. 來自portAudio流的樣本FFT FFT
- 21. 小孩打開時離開父窗口
- 22. 2D FFT中的3D FFT分解
- 23. 對齊FFT幀
- 24. fft的fft未返回預期數據
- 25. 限制開口窗B時的窗口A是開放
- 26. 在MDI Parent窗體中打開時如何居中窗體?
- 27. 如何關閉當前窗口並同時打開新窗口?
- 28. 如何創建關閉主窗口時打開的窗口?
- 29. FFT - 對PCM數據
- 30. FFT實現
當然這個要看FFT庫的細節,你正在使用。 – Mankarse
這個問題更適合dsp.stackexchange.com。它應該被移動嗎? –
@Mankarse - 對,對不起,我應該更具體。我有三個不同的FFT庫,並不確定我要使用哪一個。我決定使用Apple的Accelerate框架。 – Skoder