MATLAB - 繪製頻譜圖



頻譜圖是訊號處理和音訊分析中用於視覺化訊號隨時間變化的頻率內容的強大工具。MATLAB 使用頻譜圖函式提供了一種簡單而有效的方法來繪製頻譜圖,該函式是訊號處理工具箱的一部分。

什麼是頻譜圖?

頻譜圖是訊號隨時間變化的頻譜的視覺表示。它是一個二維圖,其中 x 軸表示時間,y 軸表示頻率,顏色或強度表示每個時間點的頻率大小。

頻譜圖通常用於訊號處理、音樂分析和語音處理中,以分析訊號隨時間的頻率內容。它們可以揭示有關訊號底層結構的重要資訊,例如某些頻率的存在或它們如何隨時間變化。

在音訊處理中,頻譜圖經常用於視覺化聲音訊號的頻率成分,允許使用者識別訊號中的模式、趨勢和異常。它們還用於其他各種領域,例如聲納、雷達和醫學成像,其中頻域訊號分析非常重要。

理解頻譜圖函式

MATLAB 中的頻譜圖函式計算訊號的頻譜圖並將其繪製為曲面或影像。語法如下:

語法

s = spectrogram(x)
s = spectrogram(x,window)
s = spectrogram(x,window,noverlap)
s = spectrogram(x,window,noverlap,nfft)

語法的詳細解釋如下:

s = spectrogram(x) − MATLAB 中的頻譜圖函式計算給定輸入訊號 x 的短時傅立葉變換 (STFT)。這意味著它將訊號分解成短段並分析每個段的頻率內容。結果 s 是一個矩陣,其中每一列代表訊號特定段的頻率內容。s 的平方大小給我們一個稱為頻譜圖的視覺化表示,它顯示了訊號的頻率內容如何隨時間變化。

s = spectrogram(x,window) − window 引數用於將輸入訊號 x 分割成段,並對每個段應用窗函式。這有助於更準確地分析訊號隨時間的頻率內容。

s = spectrogram(x,window,noverlap) − noverlap 表示使用指定的 window 將輸入訊號 x 分割成段時,相鄰段之間重疊的樣本數。這種重疊有助於捕獲有關訊號隨時間變化的頻率內容的更詳細資訊。

s = spectrogram(x,window,noverlap,nfft) − nfft 表示計算輸入訊號 x 的每個段的離散傅立葉變換 (DFT) 的取樣點數。這有助於更詳細、更準確地分析訊號的頻率內容。

MATLAB 頻譜圖示例

以下是一些如何在 MATLAB 中使用頻譜圖的示例:

示例 1:使用 s = spectrogram(x)

程式碼如下:

fs = 1000;
t = 0:1/fs:1;
f1 = 50;
x = sin(2*pi*f1*t);

% Calculate the spectrogram
s = spectrogram(x);
imagesc(t, f, 10*log10(abs(s)))

在上面的示例中

  • fs = 1000; − 這將訊號的取樣頻率設定為 1000 Hz。
  • t = 0:1/fs:2; − 這建立了一個從 0 到 2 秒的時間向量 t,取樣間隔為 1/fs 秒。
  • f1 = 50; − 這是訊號中正弦波的頻率。
  • x = sin(2*pi*f1*t); − 這生成測試訊號,它是一個頻率為 f1 的正弦波。
  • spectrogram(x) − 這計算訊號 x 的頻譜圖。該函式返回三個輸出:s(頻譜圖值)、f(頻率向量)和 t(時間向量)。
  • imagesc(t, f, 10*log10(abs(s))) − 這使用 imagesc 函式繪製頻譜圖。10*log10(abs(s)) 部分將頻譜圖值轉換為 dB 比例,以便更好地視覺化。

當代碼在 matlab 命令視窗中執行時,輸出為:

spectrogram

示例 2:繪製兩個正弦波之和的頻譜圖

我們擁有的程式碼如下:

t = 0:0.001:2;
z = sin(2*pi*50*t) + sin(2*pi*150*t);
spectrogram(z);
title('Spectrogram of Sum of Two Sine Waves');

在這個例子中,訊號 z 是透過將兩個頻率分別為 50 Hz 和 150 Hz 的正弦波相加而建立的。頻譜圖將顯示此組合訊號隨時間的頻率內容。

執行後的輸出如下:

sum of two sine waves

示例 3:繪製二次訊號的頻譜圖

我們擁有的程式碼如下:

t = 0:0.0001:2;
% Generate a quadratic signal
f0 = 100; % Initial frequency
f1 = 200; % Final frequency
x = sin(2*pi*(f0 + (f1 - f0)*t.^2/(2*max(t))) .* t);
% Plot the spectrogram
spectrogram(x);
title('Spectrogram of Quadratic Signal');

在這個例子中,訊號 x 是使用二次函式生成的,以隨時間調製正弦波的頻率。頻譜圖將顯示此二次訊號隨時間的頻率內容。

在 matlab 命令視窗中執行後的輸出為:

spectrogram quadratic

示例 4:使用 s = spectrogram(x,window)

程式碼如下:

fs = 1000; 
t = 0:1/fs:1;
f1 = 50;
x = sin(2*pi*f1*t);
window = hamming(256);
% Calculate the spectrogram using the specified window
[s, f, t] = spectrogram(x, window);
imagesc(t, f, 10*log10(abs(s)));

在上面的示例中,我們有:

fs = 1000; − 這將訊號的取樣頻率設定為 1000 Hz。

t = 0:1/fs:1; − 這建立了一個從 0 到 1 秒的時間向量 t,取樣間隔為 1/fs 秒。

f1 = 50; − 這是訊號中正弦波的頻率。

x = sin(2*pi*f1*t); − 這生成測試訊號,它是一個頻率為 f1 的正弦波。

window = hamming(256); − 這將窗函式定義為長度為 256 的漢明窗。在計算頻譜圖之前,窗函式將應用於訊號的每個段。

spectrogram(x, window) − 這使用指定的視窗計算訊號 x 的頻譜圖。該函式返回三個輸出:s(頻譜圖值)、f(頻率向量)和 t(時間向量)。

imagesc(t, f, 10*log10(abs(s))) − 這使用 imagesc 函式繪製頻譜圖。10*log10(abs(s)) 部分將頻譜圖值轉換為 dB 比例,以便更好地視覺化。

當您在 matlab 命令視窗中執行程式碼時,輸出為:

spectrogram window

示例 5:使用 s = spectrogram(x,window,noverlap)

我們擁有的程式碼如下:

fs = 1000;
t = 0:1/fs:1;
f1 = 50;
x = sin(2*pi*f1*t);
window = hamming(256);
noverlap = 200;
[s, f, t] = spectrogram(x, window, noverlap);
imagesc(t, f, 10*log10(abs(s)));

在上面的程式碼中,我們有:

  • fs = 1000; − 這將訊號的取樣頻率設定為 1000 Hz。
  • t = 0:1/fs:1; − 這建立了一個從 0 到 1 秒的時間向量 t,取樣間隔為 1/fs 秒。
  • f1 = 50; − 這是訊號中正弦波的頻率。
  • x = sin(2*pi*f1*t); − 這生成測試訊號,它是一個頻率為 f1 的正弦波。
  • window = hamming(256); − 這將窗函式定義為長度為 256 的漢明窗。在計算頻譜圖之前,窗函式將應用於訊號的每個段。
  • noverlap = 200; − 這設定了相鄰段之間重疊的樣本數。
  • spectrogram(x, window, noverlap) − 這使用指定的視窗和 noverlap 計算訊號 x 的頻譜圖。該函式返回三個輸出:s(頻譜圖值)、f(頻率向量)和 t(時間向量)。
  • imagesc(t, f, 10*log10(abs(s))) − 這使用 imagesc 函式繪製頻譜圖。10*log10(abs(s)) 部分將頻譜圖值轉換為 dB 比例,以便更好地視覺化。

當您在 matlab 命令視窗中執行程式碼時,輸出為:

spectrogram noverlap

示例 6:使用 s = spectrogram(x,window,noverlap,nfft)

我們擁有的程式碼如下:

fs = 1000;
t = 0:1/fs:1;
f1 = 50;
x = sin(2*pi*f1*t);
window = hamming(256);
noverlap = 200;
nfft = 512;
[s, f, t] = spectrogram(x, window, noverlap, nfft, fs, 'yaxis');
imagesc(t, f, 10*log10(abs(s)));

在上面,我們有:

  • fs = 1000; − 這將訊號的取樣頻率設定為 1000 Hz。
  • t = 0:1/fs:1; − 這建立了一個從 0 到 1 秒的時間向量 t,取樣間隔為 1/fs 秒。
  • f1 = 50; − 這是訊號中正弦波的頻率。
  • x = sin(2*pi*f1*t); − 這生成測試訊號,它是一個頻率為 f1 的正弦波。
  • window = hamming(256); − 這將窗函式定義為長度為 256 的漢明窗。在計算頻譜圖之前,窗函式將應用於訊號的每個段。
  • noverlap = 200; − 這設定了相鄰段之間重疊的樣本數。
  • nfft = 512; − 這設定了用於計算每個段的離散傅立葉變換 (DFT) 的 FFT 點數。更多的 FFT 點可以提供頻譜圖中更高的頻率解析度。
  • spectrogram(x, window, noverlap, nfft, fs, 'yaxis') − 這使用指定的視窗、noverlap 和 nfft 計算訊號 x 的頻譜圖。'yaxis' 引數指定 y 軸縮放為 Hz 頻率。
  • imagesc(t, f, 10*log10(abs(s))) − 這使用 imagesc 函式繪製頻譜圖。10*log10(abs(s)) 部分將頻譜圖值轉換為 dB 比例,以便更好地視覺化。

當您執行程式碼時,輸出如下:

spectrogram window overlap
廣告