2011-04-06 1995 views
2

我正在嘗試對流式音頻數據進行快速頻譜分析以捕獲元音(類似於JLip-sync)。使用PyAudio短時間(0.0625秒)以小塊(1024)捕獲語音數據。使用numpy.fft進行分析,並使用numpy.hanning窗口消除泄漏。我使用4096 * 4作爲採樣率(不是44100或22050,也可以討論; 4096 * 4最接近22050)。FFT的窗口大小與數據長度

考慮到我感興趣的頻率(範圍從300赫茲到3000赫茲)如何使用數據長度和最小/最大頻率來計算理想窗口尺寸?

謝謝。

卡迪爾

回答

3

的關鍵因素是你在頻域上多少分辨率需要不同的元音區分。分辨率爲1/T,其中T是FFT窗口的持續時間。因此,如果您的FFT採樣時間爲62.5 ms,那麼如果您的FFT與您的採樣間隔(1024採樣)大小相同,則最大分辨率爲16 Hz(即每個FFT bin爲16 Hz寬)。如果你去一個更小的FFT,那麼顯然你的分辨率會成比例地惡化,例如,一個512點FFT只能有32 Hz的分辨率。

+0

感謝您的回覆。他們所稱的「Formants」通常具有大約100赫茲的分離度。儘管有時會重疊,但它們的第二個格式在1000Hz時是完全不同的。所以我可能會下降到128.如果我使用等於數據長度(1024:1024)的窗口大小,我會放任何東西嗎? – 2011-04-06 19:07:19

+0

@Kadir:我認爲16Hz就足夠了 - 只要你能識別出單個諧波,然後用這些信息來確定共振頻率,那麼你應該沒問題。 – 2011-04-06 20:31:23

+0

再次感謝,保羅。那就是問題所在。所有的「能源」似乎都處於高端。從理論上講,我應該看到個別的諧波,然後我可以確定這些共振子,但我不知道。我是否應該使用256p移動平均值這樣的東西,因爲我對300-3000Hz頻段感興趣,大概是頻譜的一半? – 2011-04-06 21:18:29

4

@Kadir:

與離散傅立葉變換(DFT或FFT)處理之前加窗數據的目的,是儘量減少頻譜泄漏,這恰好在嘗試傅里葉變換非週期性數據。

窗口化通過在序列的開始和結束時將數據平滑強制爲零而不是在此之前進行。縮短窗口會不必要地破壞信息。

所以你的窗口長度應該與你的樣本序列的長度相匹配。例如,對於1024個採樣,窗口長度應該爲1024.

如果要分辨的最高頻率爲3 KHz,請以各種採樣率使用8192個採樣或更多采樣,例如16384或32768個採樣。

此外,嘗試使用不同的FFT算法,不同的樣本長度和不同的窗口,包括Hann(Hanning),還有其他更好的旁瓣衰減窗口,例如Blackman-Harris系列和Kaiser-Bessel系列等

如果您的應用程序有噪聲,您可能必須選擇更好的噪聲抑制窗口和更高的光譜分辨率窗口。因此,嘗試不同的窗口是一個好主意,所以你可以找到最適合你的應用程序。

現在,記下每個設置(即每個窗口,樣本長度,採樣率等)的結果,並查找跨多個設置達成一致的結果。你將會學到很多關於你的數據的信息,並且很可能找到你的問題的答案。

您可以用Matlab做到這一點:http://www.mathworks.com/help/techdoc/ref/fft.html

或此在線FFT頻譜分析儀:http://www.sooeet.com/math/fft.php

而且不要忘記在這裏發表您的結果。