對於大多數信號而言, 傅立葉分析絕對是非常有用的,因為頻率分析在大多數情況下都非常重要。 那麼為什麼我們還需要研究短時傅立葉變換呢(STFT)?
原因是因為傅立葉分析有一個非常嚴重的缺點, 在將信號從時間域變換到頻率域去的時候,把時間信息丟失了。 當我們在用傅立葉變化去分析一個具體信號的時候, 我們不知道哪個頻率是對應在哪個時間點出現的,在哪個時間點消失的。
如果一個信號的頻率並不隨著時間變化, 那麼我們稱它為平穩信號。 那麼知道哪一個頻率的信號在哪一個時間點出現的就不那麼重要了。 可是如果現實生活中我們研究的大多數信號都是非平穩信號,他們都許多非常短暫變化的特性, 這些特點對於我們信號分析的特點, 傅立葉分析並不適合去做這種分析,而短時傅立葉變換則可以。
如上圖所示,最上邊的是頻率始終不變的平穩信號。而下邊兩個則是頻率隨著時間改變的非平穩信號,它們同樣包含和最上信號相同頻率的四個成分。做FFT後,我們發現這三個時域上有巨大差異的信號,頻譜(幅值譜)卻非常一致。尤其是下邊兩個非平穩信號,我們從頻譜上無法區分它們,因為它們包含的四個頻率的信號的成分確實是一樣的,只是出現的先後順序不同。
可見,傅立葉變換處理非平穩信號有天生缺陷。它只能獲取一段信號總體上包含哪些頻率的成分,但是對各成分出現的時刻並無所知。因此時域相差很大的兩個信號,可能頻譜圖一樣。
然而平穩信號大多是人為製造出來的,自然界的大量信號幾乎都是非平穩的,所以在比如生物醫學信號分析等領域的論文中,基本看不到單純傅立葉變換這樣naive的方法。
短時傅立葉變換(Short-time Fourier Transform,STFT)
一個簡單可行的方法就是——加窗。 「把整個時域過程分解成無數個等長的小過程,每個小過程近似平穩,再傅立葉變換,就知道在哪個時間點上出現了什麼頻率了。」這就是短時傅立葉變換。
matlab中的spectrogram函數來做短時傅立葉變換,下面是其參數的解釋。
語法:
[S,F,T,P]=spectrogram(x,window,noverlap,nfft,fs)
[S,F,T,P]=spectrogram(x,window,noverlap,F,fs)
說明:當使用時無輸出參數,會自動繪製頻譜圖;有輸出參數,則會返回輸入信號的短時傅立葉變換。當然也可以從函數的返回值S,F,T,P繪製頻譜圖,具體參見例子。
參數:
x---輸入信號的向量。默認情況下,即沒有後續輸入參數,x將被分成8段分別做變換處理,
如果x不能被平分成8段,則會做截斷處理。默認情況下,其他參數的默認值為
window---窗函數,默認為nfft長度的海明窗Hamming
noverlap---每一段的重疊樣本數,默認值是在各段之間產生50%的重疊
nfft---做FFT變換的長度,默認為256和大於每段長度的最小2次冪之間的最大值。
fs---採樣頻率,默認值歸一化頻率 .
Window---窗函數,如果window為一個整數,x將被分成window段,每段使用Hamming窗函數加窗。
如果window是一個向量,x將被分成length(window)段,每一段使用window向量指定的
窗函數加窗。所以如果想獲取specgram函數的功能,只需指定一個256長度的Hann窗.