
- Matlab 教程
- MATLAB - 首頁
- MATLAB - 概述
- MATLAB - 功能
- MATLAB - 環境設定
- MATLAB - 編輯器
- MATLAB - 線上版
- MATLAB - 工作區
- MATLAB - 語法
- MATLAB - 變數
- MATLAB - 命令
- MATLAB - 資料型別
- MATLAB - 運算子
- MATLAB - 日期和時間
- MATLAB - 數字
- MATLAB - 隨機數
- MATLAB - 字串和字元
- MATLAB - 文字格式化
- MATLAB - 時間表
- MATLAB - M 檔案
- MATLAB - 冒號表示法
- MATLAB - 資料匯入
- MATLAB - 資料匯出
- MATLAB - 資料歸一化
- MATLAB - 預定義變數
- MATLAB - 決策
- MATLAB - 決策語句
- MATLAB - if 語句
- MATLAB - if-else 語句
- MATLAB - if-elseif-else 語句
- MATLAB - 巢狀 if 語句
- MATLAB - switch 語句
- MATLAB - 巢狀 switch 語句
- MATLAB - 迴圈
- MATLAB - 迴圈
- MATLAB - for 迴圈
- MATLAB - while 迴圈
- MATLAB - 巢狀迴圈
- MATLAB - break 語句
- MATLAB - continue 語句
- MATLAB - end 語句
- MATLAB - 陣列
- MATLAB - 陣列
- MATLAB - 向量
- MATLAB - 轉置運算子
- MATLAB - 陣列索引
- MATLAB - 多維陣列
- MATLAB - 相容陣列
- MATLAB - 分類陣列
- MATLAB - 元胞陣列
- MATLAB - 矩陣
- MATLAB - 稀疏矩陣
- MATLAB - 表格
- MATLAB - 結構體
- MATLAB - 陣列乘法
- MATLAB - 陣列除法
- MATLAB - 陣列函式
- MATLAB - 函式
- MATLAB - 函式
- MATLAB - 函式引數
- MATLAB - 匿名函式
- MATLAB - 巢狀函式
- MATLAB - return 語句
- MATLAB - 無返回值函式
- MATLAB - 區域性函式
- MATLAB - 全域性變數
- MATLAB - 函式控制代碼
- MATLAB - 濾波器函式
- MATLAB - 階乘
- MATLAB - 私有函式
- MATLAB - 子函式
- MATLAB - 遞迴函式
- MATLAB - 函式優先順序順序
- MATLAB - map 函式
- MATLAB - mean 函式
- MATLAB - end 函式
- MATLAB - 錯誤處理
- MATLAB - 錯誤處理
- MATLAB - try...catch 語句
- MATLAB - 除錯
- MATLAB - 繪圖
- MATLAB - 繪圖
- MATLAB - 繪製陣列
- MATLAB - 繪製向量
- MATLAB - 條形圖
- MATLAB - 直方圖
- MATLAB - 圖形
- MATLAB - 二維線圖
- MATLAB - 三維圖
- MATLAB - 格式化繪圖
- MATLAB - 對數座標軸繪圖
- MATLAB - 繪製誤差條
- MATLAB - 繪製三維等高線
- MATLAB - 極座標圖
- MATLAB - 散點圖
- MATLAB - 繪製表示式或函式
- MATLAB - 繪製矩形
- MATLAB - 繪製頻譜圖
- MATLAB - 繪製網格曲面
- MATLAB - 繪製正弦波
- MATLAB - 插值
- MATLAB - 插值
- MATLAB - 線性插值
- MATLAB - 二維陣列插值
- MATLAB - 三維陣列插值
- MATLAB - 多項式
- MATLAB - 多項式
- MATLAB - 多項式加法
- MATLAB - 多項式乘法
- MATLAB - 多項式除法
- MATLAB - 多項式的導數
- MATLAB - 變換
- MATLAB - 變換函式
- MATLAB - 拉普拉斯變換
- MATLAB - 拉普拉斯濾波器
- MATLAB - 高斯-拉普拉斯濾波器
- MATLAB - 逆傅立葉變換
- MATLAB - 傅立葉變換
- MATLAB - 快速傅立葉變換
- MATLAB - 二維逆餘弦變換
- MATLAB - 向座標軸新增圖例
- MATLAB - 面向物件
- MATLAB - 面向物件程式設計
- MATLAB - 類和物件
- MATLAB - 函式過載
- MATLAB - 運算子過載
- MATLAB - 使用者定義類
- MATLAB - 複製物件
- MATLAB - 代數
- MATLAB - 線性代數
- MATLAB - 高斯消元法
- MATLAB - 高斯-約旦消元法
- MATLAB - 簡化行階梯形
- MATLAB - 特徵值和特徵向量
- MATLAB - 積分
- MATLAB - 積分
- MATLAB - 二重積分
- MATLAB - 梯形法則
- MATLAB - 辛普森法則
- MATLAB - 其他
- MATLAB - 微積分
- MATLAB - 微分
- MATLAB - 矩陣的逆
- MATLAB - GNU Octave
- MATLAB - Simulink
- MATLAB - 有用資源
- MATLAB - 快速指南
- MATLAB - 有用資源
- MATLAB - 討論
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 命令視窗中執行時,輸出為:

示例 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 的正弦波相加而建立的。頻譜圖將顯示此組合訊號隨時間的頻率內容。
執行後的輸出如下:

示例 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 命令視窗中執行後的輸出為:

示例 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 命令視窗中執行程式碼時,輸出為:

示例 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 命令視窗中執行程式碼時,輸出為:

示例 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 比例,以便更好地視覺化。
當您執行程式碼時,輸出如下:
