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
广告