博客中的文章均為 meelo 原創,請務必以鏈接形式注明本文地址
通過傅立葉變換可以得到信號的頻譜。信號的頻譜的應用非常廣泛,信號的壓縮、降噪都可以基於頻譜。
然而傅立葉變換有一個假設,那就是信號是平穩的,即信號的統計特性不隨時間變化。聲音信號就不是平穩信號,在很長的一段時間內,有很多信號會出現,然后立即消失。如果將這信號全部進行傅立葉變換,就不能反映聲音隨時間的變化。
短時傅立葉變換(short-time fourier transform)就能解決這個問題。聲音信號雖然不是平穩信號,但在較短的一段時間內,可以看作是平穩的。符合直覺的解決方案是取一小段進行傅立葉變換,這也正是短時傅立葉變換的核心思想。
窗函數
問題還沒有完全解決。從一段長的信號,截取一段信號,相當於將原始信號乘以一個方窗。方窗的傅立葉變換並不是理想的沖擊函數,而是sinc函數。sinc函數除了主瓣以外,還有較高的副瓣。較高的副瓣意味着在真實頻點以外,副瓣的位置上,頻譜也會不為零。如果在副瓣的位置上恰好有一個幅度很小的信號,就會被完全淹沒。
對於方窗較高的副瓣電平,解決方案是使用窗函數,代替簡單地截取一段信號。通常使用的窗函數有hanning窗、hamming窗、Blackman-Haris窗等。
hamming窗的副瓣電平是-43dB,遠小於方窗的副瓣電平-13dB。[1]
重疊區間
加窗帶來了新的問題。在窗的邊緣,信號會乘上一個很小的數。這意味着數據並沒有充分被利用,兩個相鄰窗之間的信號沒有完全反映到頻譜當中。解決辦法是兩個相鄰的窗有一定的重疊。通常重疊區間可以選擇為窗寬度的50%或者25%。
重疊還有另一個目。信號進行短時傅立葉變換得到譜圖(spectrogram),進行一些處理之后,有時還需要恢復成為時間序列。恢復的時候必須彌補窗函數帶來的影響。
hanning窗、hamming窗都是簡單的正弦函數的疊加。當重疊區間較大時,窗函數的影響幾乎可以忽略不計。
窗寬度的選擇
常數的傅立葉變換是沖擊函數,沒有寬度。窗函數的傅立葉變換都有一定寬度。方窗的主瓣寬度最小,其次是hanning窗、hamming窗。窗函數的寬度會影響頻譜的分辨率。
采樣頻率為$f_s$的離散時間信號,快速傅立葉變換的點數為M。那么頻譜,兩點之間的頻率之差,也就是頻譜的精度為$f_s/M$。
窗函數主瓣寬度對應的真實頻率為$B_s \frac{f_s}{M} Hz$
能分辨兩個頻率,意味着兩個頻率的主瓣沒有重疊,即$\Delta f \ge B_s \frac{f_s}{M}$
要求快速傅立葉變換的點數:$M \ge B_s f_s / \Delta f$
其中:$B_s$為主瓣寬度
$\Delta$為以Hz為單位的頻率分辨率
一般情況下,窗的寬度就取快速傅立葉變換的點數。
從公式中可以看出,窗函數的寬度取決於窗函數的類型,采樣頻率以及頻率分辨率。
總結一下。選擇特殊的窗函數是為了降低副瓣電平,相鄰的窗之間要重疊是為了不損失時間信號的信息,窗函數的寬度一般等於快速傅立葉變換的點數,有一個下界為了保證頻率分辨率。
[1] Characteristics of Different Smoothing Windows. http://zone.ni.com/reference/en-XX/help/371361H-01/lvanlsconcepts/char_smoothing_windows/