強大的MATLAB2019——短時傅里葉變換stft函數(shù)

MATLAB最新版本2019b,推出了一個超好用的函數(shù)——stft。它能非常方便地為你實現(xiàn)加窗傅里葉變換。
什么是加窗傅里葉變換呢,簡單來說就是把一段時間信號切成一段一段的,再給每一段分別進行傅里葉變換,可以想見,只要你切得足夠細,就能得到頻率隨時間的變化規(guī)律。
加窗傅里葉變換的動畫演示可以查看本人視頻


當然這里有些講究。首先切信號不能直接像切面條似的把信號截出來,而是應該用兩端為0的時窗去截,否則會產(chǎn)生吉布斯現(xiàn)象,即在截斷附近出現(xiàn)大的信號跳變,造成原始信號畸變。


其次呢,我們不能像切面條一樣把信號切成一段一段不重疊的段,而是應該互相有所重疊,否則的話,萬一你切段的位置正好切在信號上怎么辦呢。
明確這兩點,我們就來看一下MATLAB的stft函數(shù)吧!
例子1:
產(chǎn)生兩秒鐘的壓控振蕩器輸出,該輸出由以10 kHz采樣的正弦波控制。
fs = 10e3;?
t = 0:1/fs:2;?
x = vco(sin(2*pi*t),[0.1 0.4]*fs,fs);
計算并繪制信號的STFT。使用長度為256且形狀參數(shù)β?=?5的Kaiser窗口。指定重疊的長度為220個樣本,DFT的長度為512點。用默認的顏色圖和視圖繪制STFT。
stft(x,fs,'Window',kaiser(256,5),'OverlapLength',220,'FFTLength',512);
看一下各個參數(shù),
Window后面可以選擇時窗,這個時窗的定義呢就和濾波器里時窗的定義方式一樣~
OverlapLength就是重疊寬度,也就是相鄰兩個的重疊寬度。
FFTLength就是每個小段的長度。
也可選用另一種Hamming時窗。
stft(x,fs,'Window',hamming(128,'periodic'),'OverlapLength',50);

如果我們想看震撼的立體效果怎么辦呢,我們只要將視角調(diào)成俯視就好啦!
view(-45,65)
colormap jet

接下來用我自己生成的do re mi fa so la xi(40號音?到?51號音)七個音去算短時距傅里葉,得到很清晰的結(jié)果~


注意到我的音色函數(shù)是寫了泛音列(基音的整數(shù)倍)呢。泛音列的原理可以看我的視頻呦?


那么如何根據(jù)stft函數(shù)得到每一段的頻率數(shù)值呢,也很簡單。
令s=stft(參數(shù)),得到一個時窗長度×n的矩陣,每一列就是每個時窗里的fft變換結(jié)果。
和由FFT結(jié)果畫幅值頻譜圖一樣,取出某一列畫圖就行了。
abs(s[:,m]);
就能生成這個時間段的幅值頻譜圖啦!
參考資料:
https://ww2.mathworks.cn/help/signal/ref/stft.html