Matlab中短時傅立葉變換 spectrogram和stft的用法

2021-02-21 科學計算Tech

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


在這裡插入圖片描述

FPGA

FPGA時序約束教程

C++

信號處理

Julia

0 Julia教程目錄

1 Julia簡介及安裝

2.Julia REPL 變量

3 數學運算 矩陣操作

4 函數 方法 多重分派

5 Julia控制

6 Julia 類型

7 Julia繪圖工具

8 Julia IO操作

12 Julia科學計算

13 如何寫出高性能的Julia

(還未補充完整)

歡迎關注微信公眾號:

在這裡插入圖片描述

相關焦點

  • matlab中的spectrogram函數對信號做短時傅立葉分析
    可是如果現實生活中我們研究的大多數信號都是非平穩信號,他們都許多非常短暫變化的特性, 這些特點對於我們信號分析的特點, 傅立葉分析並不適合去做這種分析,而短時傅立葉變換則可以。如上圖所示,最上邊的是頻率始終不變的平穩信號。而下邊兩個則是頻率隨著時間改變的非平穩信號,它們同樣包含和最上信號相同頻率的四個成分。
  • 形象易懂的傅立葉變換、短時傅立葉變換和小波變換
    下面我就按照傅立葉-->短時傅立葉變換-->小波變換的順序,講一下為什麼會出現小波這個東西、小波究竟是怎樣的思路。(反正題主要求的是通俗形象,沒說簡短,希望不會太長不看。。)一、傅立葉變換關於傅立葉變換的基本概念在此我就不再贅述了,默認大家現在正處在理解了傅立葉但還沒理解小波的道路上。(在第三節小波變換的地方我會再形象地講一下傅立葉變換)下面我們主要講傅立葉變換的不足。
  • 快速傅立葉變換FFT在MATLAB中的實現
    首先,為什麼要進行傅立葉變換?將時域的信號變換到頻域的正弦信號,正弦比原信號更簡單,且正弦函數很早就被充分地研究,處理正弦信號比處理原信號更簡單。正弦信號的頻率保持性:輸入為正弦信號,輸出仍是正弦信號,幅度和相位可能發生變化,但頻率與原信號保持一致,只有正弦信號才擁有這樣的性質。
  • 在MATLAB中如何實現快速傅立葉變換
    對於傅立葉變換的類型:非周期連續信號採用傅立葉變化;周期連續信號採用傅立葉級數;非周期連續離散信號採用離散時間傅立葉變換;周期離散信號採用離散傅立葉級數。四種傅立葉變換總結如下表所示。表1從離散傅立葉級數 (DFS) 到離散傅立葉變換 (DFT),周期序列雖為無窮長序列,但是只要知道一個周期的內容,便可知其全貌。因此,周期序列實際上只有N個樣值有信息,通過推導可得到DFT、時域和頻域 (DFT) 上的有限長序列,可以用來「代表」周期序列,DFT在時域和頻域上均離散,且為有限長序列,可以用計算機進行處理。
  • 【Brain】腦信號處理必備技能:由淺入深掌握傅立葉變換、短時傅立葉變換和小波變換(最新)
    從傅立葉變換到小波變換,並不是一個完全抽象的東西,可以講得很形象。小波變換有著明確的物理意義,如果我們從它的提出時所面對的問題看起,可以整理出非常清晰的思路。下面,按照傅立葉-->短時傅立葉變換-->小波變換的順序,為大家講解為什麼出現小波以及小波究竟是怎樣?
  • 什麼是傅立葉變換,如何用MATLAB實現?
    第三場分享的主題是: 傅立葉變換的理解與MATLAB實現直播日期:2021年1月21日(周四)晚18點沒有傅立葉變換,就無法用數學的方法去處理現實世界中的各種各樣的信號。如今幾乎所有信息最終都會數位化,就會用到傅立葉變換及其變種,藉助傅立葉變換才能將信號識別為具體的成分,完成數位化。那麼現實世界中的各種信號如何通過通過數學模型來轉變成可以計算處理的數位訊號呢?
  • 使用 matlab 進行傅立葉分析和濾波
    matlab中的快速傅立葉有兩種調用形式:y=fft(x)。x是原始信號,y是變換之後的信號。y與x有相同的長度。y=fft(x,N)。x,y定義如上,N是正整數,表示進行N點快速傅立葉變換。如果x長度小於N,則對x補零,使之與N相等;反則,則對x進行截取。對應的逆變換有兩種,分別為x=ifft(y)和x=ifft(y.N)。
  • 傅立葉變換的本質及其公式解析
    對一個信號做傅立葉變換,然後直接做逆變換,這樣做是沒有意義的,在傅立葉變換和傅立葉逆變換之間有一個濾波的過程。將不要的頻率分量給濾除掉,然後再做逆變換,就得到了想要的信號。比如信號中摻雜著噪聲信號,可以通過濾波器將噪聲信號的頻率給去除,再做傅立葉逆變換,就得到了沒有噪聲的信號。
  • 使用FastAI 和即時頻率變換進行音頻分類
    經過FFT處理後,我們可以將結果轉換為極坐標,就得到不同頻率的幅度和相位。雖然相位信息在某些情況下適用,本文中主要適用幅度信息,我們將其轉換為分貝單位,因為耳朵是以對數尺度感知聲音的。我們把這些操作稱為短時傅立葉變化(STFT),它可以提供一段時間內頻率變化的信息。
  • 傅立葉變換和拉普拉斯變換的辨識!
    ,傅立葉變換的典型用途是將信號分解成幅值分量和頻率分量)。傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。
  • 傅立葉變換,拉普拉斯變換和Z變換的意義
    簡介:本文介紹了在實際工程中常用到的傅立葉變換和Z變換之間的關係、各自的意義等內容。  傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。  傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。
  • 完全搞懂傅立葉變換和小波(1)——總綱
    無論是學習信號處理,還是做圖像、音視頻處理方面的研究,你永遠避不開的一個內容,就是傅立葉變換和小波。但是這兩個東西其實並不容易弄懂,或者說其實是非常抽象和晦澀的!
  • 可視化傅立葉變換:矩形波的傅立葉變換過程原理
    連續傅立葉變換採用輸入函數f(x)中的時域和把它變成一個全新功能的頻域中的函數F(ω),而傅立葉變換是專門用來解決非周期函數的,非周期函數通過傅立葉變換實現從時域到頻域的轉換,如下對矩形波進行傅立葉變換矩形波是一個比較簡單的周期函數,如下只有一個矩形,所以看作非周期函數,可對其進行傅立葉變換,我們已經很熟悉,矩形波的傅立葉變換圖形是sinc函數,即數學中的Sinx/x函數模型該函數在x=0時,sinc函數值等於1,如下圖
  • 泰勒展開,傅立葉變換,拉普拉斯變換和Z變換的意義
    傅立葉變換傅立葉變換在物理學、數論、組合數學、信號處理、概率論、統計學、密碼學、聲學、光學、海洋學、結構動力學等領域都有著廣泛的應用(例如在信號處理中,傅立葉變換的典型用途是將信號分解成幅值分量和頻率分量)。傅立葉變換的物理意義是:將通常在時域表示的信號,分解為多個正弦信號的疊加。
  • 傅立葉和他的變換的故事
    其他貢獻有:最早使用定積分符號,改進了代數方程符號法則的證法和實根個數的判別法等。傅立葉變換的基本思想首先由傅立葉提出,所以以其名字來命名以示紀念。從現代數學的眼光來看,傅立葉變換是一種特殊的積分變換。傅立葉變換能將滿足一定條件的函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。
  • 簡述計算機三大變換的聯繫和區別 (傅立葉變換、拉普拉斯變換、z變換)
    拉普拉斯變換在許多工程技術和科學研究領域中有著廣泛的應用,特別是在力學系統、電學系統、自動控制系統、可靠性系統以及隨機服務系統等系統科學中,都起著重要作用。拉普拉斯變換,是對於t>=0 函數值不為零的連續時間函數x(t),通過關係式
  • 有趣的交互式傅立葉變換網站
    網站的BANNER傅立葉變換是一種在各個領域都經常使用的數學工具。這個網站將為你介紹傅立葉變換能幹什麼,為什麼傅立葉變換非常有用,以及你如何利用傅立葉變換幹漂亮的事。就像下面這樣:這次旅途結束後,你將會掌握下面這些知識:傅立葉變換的一些很酷的用法(雖然有些沒有實際意義)我們現在暫時不提那些複雜的數學公式。傅立葉背後的數學原理十分有趣,但最好還是先從它的實際應用開始,以及為什麼要使用它。如果你想了解更多,下面提供了一些進一步的閱讀建議!
  • 傅立葉為何變換?
    因為,傅立葉變換的定義非常唬人:傅立葉變換定義式唬人是啥意思呢?「唬」其實是多音字,不僅讀hu,還尼瑪能讀xia(也不知這是誰定的):傅立葉說,我有祖傳配方,可算係數。於是就有了「傅立葉級數」。具體公式和計算方法一般的課本都有,在此不予討論。傅立葉級數根據上面的原理,我們可以將一些函數展開成「傅立葉級數」,比如,可以在一個周期內,將x^2展開:
  • 深入淺出的學習傅立葉變換
    事實上,許多數學功底好的數位訊號處理專業的同學也不一定理解傅立葉變換的真實含義,不能做到學以致用!本文引用地址:http://www.eepw.com.cn/article/272577.htm  事實上,傅立葉變換的相關運算已經非常成熟,有現成函數可以調用。對於絕大部分只需用好傅立葉變換的同學,重要的不是去記那些枯燥的公式,而是解傅立葉變換的含義及意義。
  • 傅立葉變換與拉普拉斯變換的物理解釋及區別
    傅立葉變換能將滿足一定條件的某個函數表示成三角函數(正弦和/或餘弦函數)或者它們的積分的線性組合。在不同的研究領域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。 傅立葉變換是一種解決問題的方法,一種工具,一種看待問題的角度。