我正在嘗試在 Linux 上構建圖形音頻頻譜分析儀。我在輸入音頻硬體的 PCM 樣本/幀的每個緩沖區上運行 FFT 函式,這樣我就可以看到哪些頻率在音頻輸出中最為普遍。一切正常,除了 FFT 函式的結果僅將幾個陣列元素(bin)分配給低頻和中頻。我知道音頻是對數的,FFT 適用于線性資料。但是由于對低/中頻率的分配如此之少,我不確定如何將事物清晰地分開以以圖形方式顯示頻率分布。我嘗試過使用 256 到 1024 位元組的視窗大小,雖然較大的視窗在低/中范圍內提供了更高的解析度,但仍然沒有那么多。我還將 Hann 函式應用于每個資料塊以平滑視窗邊界。
例如,我使用以 120、440、1000、5000、15000 和 20000 Hz 播放音調的單聲道音頻檔案進行測驗。當以對數方式解釋它們時,它們應該在整個頻譜中稍微均勻分布。然而,由于 FFTW 是線性作業的,對于 256 個元素或 1024 個元素的陣列,只有大約 10% 的回傳陣列實際上保存了高達大約 5 kHz 的值。FFTW 陣列的其余部分包含 10-15 kHz 以上的頻率。
這是我所追求的大致結果:

但這是我實際得到的:

同樣,我知道這可能按設計作業,但我仍然需要一種方法來在底部和中部獲得更高的解析度,以便更好地分離頻率。
我能做些什么來完成這項作業?
uj5u.com熱心網友回復:
您所看到的確實是 FFT(傅立葉變換)的預期結果。您期望的對數 f 軸是通過Constant-Q 變換實作的。
現在,Constant-Q 變換的實作非常重要。傅里葉變換之所以流行,正是因為它的實作速度很快(FFT)。在實踐中,常使用 FFT 并結合多個高頻 bin 來實作恒定 Q 變換。這會丟棄較高 bin 中的解析度;它不會在較低的垃圾箱中為您提供更高的解析度。
要在 FFT 的較低 bin 中獲得更高的頻率解析度,只需使用更長的視窗即可。但是,如果您還想保持時間解析度,則必須使用小于視窗大小的躍點大小。換句話說,您的 FFT 視窗將重疊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427016.html
