MATLAB 長度和像素_Matlab中短時傅里葉變換 spectrogram和stft的用法

574ce288095540a66ce39d157245cfb9.png

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

信號的時域波形如下:

ddc3bc56403b4129db80092ed76553b8.png

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

8842df4fb07d8383bfcd4f51b7056b78.png

為了繪圖更靈活,我們不直接用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;

e4eba2c792952d31bc112f8ff496fe2e.png

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;

6f3e21ff1fa056319109b562e1b93a67.png

再加上nfftfs參數,我們指定fft點數就是窗長

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

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

如果在返回值中,增加ft,這樣我們下面就不用再重新定義ft

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

5cb2098022503237d9246b7e132b5a18.png

最后再把功率譜密度的返回值加上

[s, f, t, p] = spectrogram(sig, window, nfft, f, fs);
figure;
imagesc(t, f, p);xlabel('Samples'); ylabel('Freqency');
colorbar;

caaf91f96f4c2376b58b4b8545c94a44.png

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;

2101a149dff7e25cd0b666caead6f0a6.png

歡迎關注微信公眾號:Quant_Times

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458070.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt 【關于控件樣式,鼠標進入、離開、點擊】

比如舉以下這個例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}"); //這個是最常規的樣式 okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}" //…

圖像處理基礎——灰度共生矩陣

標準定義如下:對于取定的方向θ 和距離 d, 在方向為θ的直線上, 一個像元灰度為 i, 另一個與其相距為 d 像元的灰度為 j 的點對出現的頻數即為灰度共生矩陣第(i, j)陣元的值。 怎樣理解呢?看起來好復雜呀 嗚嗚嗚 小白理解:灰度共生矩陣就…

iphone查看刪除的短信_iPhone12發布!剛買的蘋果手機短信全部消失了怎么辦?

原標題:iPhone12發布!剛買的蘋果手機短信全部消失了怎么辦?目前,人們的社交除了面對面交談,用的最多的就是通過手機進行聊天,比如用QQ、微信和短信、郵件等方式,雖然短信不會用來一般的聊天&…

[唐詩]182宮中行樂詞(其一)-李白

宮中行樂詞(其一)-李白 小小生金屋, 盈盈在紫微。 山花插寶髻, 石竹繡羅衣。 每出深宮里, 常隨步輦歸。 只愁歌舞散, 化作彩云飛。

python基礎之01數據類型-變量-運算淺解

python的數據類型 1 數字 數字分為整型(int),長整型(long),浮點型(float),復數(complex) 整型較為常用的功能: >>> a-4 >…

使用Caffe進行手寫數字識別執行流程解析

之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples實現對手寫數字進行識別,這里詳細介紹下其執行流程并精簡了實現代碼,使用Caffe對MNIST數據集進行train的文章可以參考 http://blog.csdn.net/fengbingchun/…

obs可以裝手機嗎?_原神PC和手機數據互通嗎 PC和手機可以一起玩嗎

在原神中,很多玩家都在PC端創建了角色,那么疑問來了,PC端與手機端的賬號會是互通的嗎?下面小編就為大家帶來原神PC和手機數據互通嗎的相關內容,一起來看看吧!更多攻略:原神攻略大全PC和手機數據…

學習linux第二周作業

第二周作業:本周作業內容:1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。touch,rm,mv,cp,file,ls,chmod,chown,ln,rename,touch 修改文件atime,如果文件不存在,那么創建該文件。rm&#xff1…

三維點云目標提取總結(續)

三維點云目標提取(續) 3.三維點云目標提取 3.1一般流程 先根據個人認識總結一下目標提取的一般性步驟: 如上所示,三維點云的目標提取關鍵性的兩步即為:特征提取與選擇、分類,是不是整個方法流程與圖像中的目…

安卓高手之路之java層Binder

很多人一提到Binder就說代理模式,人云亦云的多,能理解精髓的少。 本篇文章就從設計角度分析一下java層BInder的設計目標,以及設計思路,設計缺陷,從而駕馭它。 對于【邦德兒】的理解, 從通信的角度來看,就是…

ftp改為sftp_淺談 FTP、FTPS 與 SFTP

二狗子最近搭建了一個圖片分享網站,每天都有好多人在他的網站上傳許多照片,這些照片還會通過內部的邏輯同步到又拍云存儲中,非常方便。但不久后問題就來了,由于剛開始的用戶照片管理規劃沒有做好,隨著用戶上傳的圖片越…

如何解決秒殺的性能問題和超賣的討論

2019獨角獸企業重金招聘Python工程師標準>>> 最近業務試水電商,接了一個秒殺的活。之前經常看到淘寶的同行們討論秒殺,討論電商,這次終于輪到我們自己理論結合實際一次了。 ps:進入正文前先說一點個人感受,…

C# 從Excel中讀取時間數據

之前寫到從Excel中讀取時間數據 //讀取Excel數據Excel.Application xapp new Excel.Application();string filepath txt_Excel.Text;Excel.Workbook xbook xapp.Workbooks._Open(filepath, Missing.Value, Missing.Value,Missing.Value, Missing.Value, Missing.Value, Miss…

grid autosport額外內容下載慢_清理大王app下載-清理大王v1.0安卓下載

清理大王,下面由小編給大家介紹一下這款軟件,該軟件是一款非常不錯的手機清理服務應用軟件,清理大王app為用戶提供了手機垃圾清理,內存加速,優化手機,解決手機卡頓的情況。感興趣的朋友歡迎使用微俠下載&am…

(轉)瀏覽器兼容的JS寫法總結

-、元素查找問題1. document.all[name] (1)現有問題:Firefox不支持document.all[name] (2)解決方法:使用getElementsByName(name),getElementById(id)等來替代。 2. 集合類對象問題 (1)現有問題:IE中對許多集合類對…

java面試總結(第一天)

臨近大學畢業,出來試試找工作,學c#出身,半路出家java,做過幾個ssh、stringMVC的項目。基礎知識不太扎實,勿噴 以下是我面試過程中遇到的問題 ----------------------------------------------------------------------…

怎么看cudnn的版本好_祖墳風水怎么看,好祖墳有什么征兆?

人們之所以看重祖墳的風水,是因為祖墳的風水與后代子孫的運勢密切相關,可以說祖墳的風水好不好關系著子孫后代的運勢順不順,因此對于祖墳的風水好壞人們是非常在意的,那么祖墳風水怎么看,好祖墳有什么征兆呢?下面是小編…

iOS - Swift SQLite 數據庫存儲

前言 采用 SQLite 數據庫來存儲數據。SQLite 作為一中小型數據庫,應用 iOS 中,跟前三種保存方式相比,相對比較復雜一些。注意:寫入數據庫,字符串可以采用 char 方式,而從數據庫中取出 char 類型&#xff0c…

Hibernate 多對多關聯查詢條件使用

from Brand as b inner join fetch b.styles as s where s.styleId? 轉載于:https://www.cnblogs.com/cocoat/p/5427467.html

Spark 寬依賴和窄依賴

2019獨角獸企業重金招聘Python工程師標準>>> 我們知道RDD就是一個不可變的帶分區的記錄集合,Spark提供了RDD上的兩類操作,轉換和動作。轉換是用來定義一個新的RDD,包括map, flatMap, filter, union, sample, join, groupByKey, co…