MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法
在Matlab中,做短時(shí)傅里葉變換需要使用函數(shù)spectrogram,而在Matlab2019中,引入了一個(gè)新的函數(shù)stft,下面我們就來看下這兩個(gè)函數(shù)都如何使用。
短時(shí)傅里葉變換的基本原理就是將數(shù)據(jù)分段加窗,做fft,在分段時(shí)會(huì)有overlap,因此一個(gè)向量的短時(shí)傅里葉變換結(jié)果是一個(gè)矩陣。了解了這點(diǎn),下面的函數(shù)及參數(shù)就更加容易理解了。
spectrogram
參數(shù)列表
先來看spectrogram函數(shù),在更早期的版本中,這個(gè)函數(shù)的名字是specgram,幾種常用的用法如下:
spectrogram(x) s = spectrogram(x) s = spectrogram(x, window) s = spectrogram(x, window, noverlap) s = spectrogram(x, window, noverlap, nfft) s = spectrogram(x, window, noverlap, nfft, fs) [s, f, t] = spectrogram(x, window, noverlap, nfft, fs) [s, f, t] = spectrogram(x, window, noverlap, f, fs) [s, f, t, p] = spectrogram(x, window, noverlap, f, fs)其中,
- x表示輸入信號(hào);
- window表示窗函數(shù),如果window的值是一個(gè)整數(shù),那么被分段的x的每一段的長(zhǎng)度都等于window,并采用默認(rèn)的Hamming窗;如果window是一個(gè)向量,那么被分段后每一段的長(zhǎng)度都等于length(window),且輸入的向量即為所要加的窗函數(shù);
- overlap表示兩段之間的重合點(diǎn)數(shù),overlap的值必須要小于窗長(zhǎng),如果沒有指定overlap,默認(rèn)是窗長(zhǎng)的一半,即50%的overlap;
- nfft表示fft的點(diǎn)數(shù),fft的點(diǎn)數(shù)跟窗長(zhǎng)可以是不同的,當(dāng)沒有指定該參數(shù)時(shí),Matlab會(huì)取max(256, 2^(ceil(log2(length(window))))),即當(dāng)窗長(zhǎng)小于256時(shí),fft的點(diǎn)數(shù)是256;當(dāng)窗長(zhǎng)大于256時(shí),fft的點(diǎn)數(shù)取大于窗長(zhǎng)的最小的2的整數(shù)次冪;
- fs表示采樣率,用來歸一化顯示使用;
- f表示顯示的頻譜范圍,f是一個(gè)向量,長(zhǎng)度跟s的行數(shù)相同;
- 當(dāng)x是實(shí)信號(hào)且nfft為偶數(shù)時(shí),s的行數(shù)為(nfft/2+1)
- 當(dāng)x是實(shí)信號(hào)且nfft為奇數(shù)時(shí),s的行數(shù)為(nfft+1)/2
- 當(dāng)x是復(fù)信號(hào)時(shí),s的行數(shù)為nfft
- 當(dāng)在輸入的參數(shù)列表中指定f后,函數(shù)會(huì)在f指定的頻率處計(jì)算頻譜圖,返回的f跟輸入的f是相同的;
- t表示顯示的時(shí)間范圍,是一個(gè)向量,長(zhǎng)度跟s的列數(shù)相同;
- p表示功率譜密度,對(duì)于實(shí)信號(hào),p是各段PSD的單邊周期估計(jì);對(duì)于復(fù)信號(hào),當(dāng)指定F頻率向量時(shí),P為雙邊PSD;如何計(jì)算PSD
Examples
首先,生成信號(hào)如下,4個(gè)點(diǎn)頻信號(hào)拼接起來:
clc;clear all;close all; fs = 10e6; n = 10000; f1 = 10e3; f2 = 50e3; f3 = 80e3; f4 = 100e3; t = (0:n-1)'/fs; sig1 = cos(2*pi*f1*t); sig2 = cos(2*pi*f2*t); sig3 = cos(2*pi*f3*t); sig4 = cos(2*pi*f4*t);sig = [sig1; sig2; sig3; sig4];信號(hào)的時(shí)域波形如下:
直接調(diào)用spectrogram(sig),可得如下結(jié)果,圖中默認(rèn)橫軸是頻率,縱軸是時(shí)間
為了繪圖更靈活,我們不直接用spectrogram繪圖,而且求出s后,再對(duì)s單獨(dú)繪圖,這次我們指定window的大小為256
s = spectrogram(sig, 256); t = linspace(0, 4*n/fs, size(s,1)); f = linspace(0, fs/2, size(s,2)); figure; imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency'); colorbar;noverlap默認(rèn)是50%,現(xiàn)在我們把它設(shè)為window的長(zhǎng)度減1,即每次的步進(jìn)為1
s = spectrogram(sig, 256, 255); t = linspace(0, 4*n/fs, size(s,1)); f = linspace(0, fs/2, size(s,2)); figure; imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency'); colorbar;再加上nfft和fs參數(shù),我們指定fft點(diǎn)數(shù)就是窗長(zhǎng)
s = spectrogram(sig, 256, 128, 256, fs);這個(gè)的圖形跟之前一樣,不再畫了
如果在返回值中,增加f和t,這樣我們下面就不用再重新定義f和t了
[s, f, t] = spectrogram(sig, 256, 128, 256, fs); figure; imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency'); colorbar;從上面的圖中我們可以看出,我們的4個(gè)信號(hào)的頻率都比較小,而畫出來的圖顯示的頻譜范圍比較大,導(dǎo)致下面很大一部分信息我們其實(shí)都不需要。這時(shí),我們就可以通過指定f的區(qū)間來計(jì)算頻譜。為了顯示效果更好,我們把其他參數(shù)也調(diào)一下
window = 2048; noverlap = window/2; f_len = window/2 + 1; f = linspace(0, 150e3, f_len); [s, f, t] = spectrogram(sig, window, noverlap , f, fs); figure; imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency'); colorbar;最后再把功率譜密度的返回值加上
[s, f, t, p] = spectrogram(sig, window, nfft, f, fs); figure; imagesc(t, f, p);xlabel('Samples'); ylabel('Freqency'); colorbar;stft
這個(gè)函數(shù)在Matlab的解釋并不是很多,example也只寫了兩個(gè),但用法比較簡(jiǎn)單:
window = 2048; noverlap = window/2; nfft = window; [s, f, t, p] = spectrogram(sig, window, noverlap, nfft, fs); figure; imagesc(t, f, 20*log10((abs(s))));xlabel('Samples'); ylabel('Freqency'); title('使用spectrogram畫出的短時(shí)傅里葉變換圖形'); colorbar;ss = stft(sig,fs,'Window',hamming(window),'OverlapLength',window/2,'FFTLength',nfft); figure; imagesc(t, f, 20*log10((abs(ss(1024:end,:)))));xlabel('Samples'); ylabel('Freqency'); title('使用stft畫出的短時(shí)傅里葉變換圖形'); colorbar;歡迎關(guān)注微信公眾號(hào):Quant_Times
http://weixin.qq.com/r/Mi7t9T3EpWDarXmW93sg (二維碼自動(dòng)識(shí)別)
總結(jié)
以上是生活随笔為你收集整理的MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DIY一个VR小钢炮
- 下一篇: 【设计模式 00】设计模式的六大原则