日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Matlab中,做短時傅里葉變換需要使用函數spectrogram,而在Matlab2019中,引入了一個新的函數stft,下面我們就來看下這兩個函數都如何使用。

短時傅里葉變換的基本原理就是將數據分段加窗,做fft,在分段時會有overlap,因此一個向量的短時傅里葉變換結果是一個矩陣。了解了這點,下面的函數及參數就更加容易理解了。

spectrogram

參數列表

先來看spectrogram函數,在更早期的版本中,這個函數的名字是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表示輸入信號;
  • window表示窗函數,如果window的值是一個整數,那么被分段的x的每一段的長度都等于window,并采用默認的Hamming窗;如果window是一個向量,那么被分段后每一段的長度都等于length(window),且輸入的向量即為所要加的窗函數;
  • overlap表示兩段之間的重合點數,overlap的值必須要小于窗長,如果沒有指定overlap,默認是窗長的一半,即50%的overlap;
  • nfft表示fft的點數,fft的點數跟窗長可以是不同的,當沒有指定該參數時,Matlab會取max(256, 2^(ceil(log2(length(window))))),即當窗長小于256時,fft的點數是256;當窗長大于256時,fft的點數取大于窗長的最小的2的整數次冪;
  • fs表示采樣率,用來歸一化顯示使用;
  • f表示顯示的頻譜范圍,f是一個向量,長度跟s的行數相同;
    • 當x是實信號且nfft為偶數時,s的行數為(nfft/2+1)
    • 當x是實信號且nfft為奇數時,s的行數為(nfft+1)/2
    • 當x是復信號時,s的行數為nfft
    • 當在輸入的參數列表中指定f后,函數會在f指定的頻率處計算頻譜圖,返回的f跟輸入的f是相同的;
  • t表示顯示的時間范圍,是一個向量,長度跟s的列數相同;
  • p表示功率譜密度,對于實信號,p是各段PSD的單邊周期估計;對于復信號,當指定F頻率向量時,P為雙邊PSD;如何計算PSD

Examples

首先,生成信號如下,4個點頻信號拼接起來:

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];

信號的時域波形如下:

直接調用spectrogram(sig),可得如下結果,圖中默認橫軸是頻率,縱軸是時間

為了繪圖更靈活,我們不直接用spectrogram繪圖,而且求出s后,再對s單獨繪圖,這次我們指定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默認是50%,現在我們把它設為window的長度減1,即每次的步進為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參數,我們指定fft點數就是窗長

s = spectrogram(sig, 256, 128, 256, fs);

這個的圖形跟之前一樣,不再畫了

如果在返回值中,增加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個信號的頻率都比較小,而畫出來的圖顯示的頻譜范圍比較大,導致下面很大一部分信息我們其實都不需要。這時,我們就可以通過指定f的區間來計算頻譜。為了顯示效果更好,我們把其他參數也調一下

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

這個函數在Matlab的解釋并不是很多,example也只寫了兩個,但用法比較簡單:

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畫出的短時傅里葉變換圖形'); 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畫出的短時傅里葉變換圖形'); colorbar;

歡迎關注微信公眾號:Quant_Times

http://weixin.qq.com/r/Mi7t9T3EpWDarXmW93sg (二維碼自動識別)

總結

以上是生活随笔為你收集整理的MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。