Skip to content

MATLAB - 绘制频谱图

在 MATLAB 中使用频谱图可视化信号

Section titled “在 MATLAB 中使用频谱图可视化信号”

频谱图是一种强大的工具,用于可视化信号随时间变化的频率内容。它在音频处理、通信和振动分析等领域至关重要。MATLAB 的**信号处理工具箱(Signal Processing Toolbox™)**提供了 spectrogram 函数,可以轻松计算和显示这些富有洞察力的图。

频谱图是一个显示为 2D 图像的 3D 图。它显示:

  • 时间在 x 轴上。
  • 频率在 y 轴上。
  • 信号功率/幅度作为每个时频点的颜色强度。

它通过计算短时傅里叶变换(STFT)生成,这涉及到将信号分解成小的、重叠的时间窗口,并计算每个窗口的傅里叶变换。

生成和绘制频谱图的主要语法是:

spectrogram(x, window, noverlap, nfft, fs, 'yaxis')

让我们分解一下关键参数:

  • x:您的输入信号向量。
  • window:定义窗函数(例如 hamming(256))的向量。这用于整形信号段以减少频谱泄漏。窗长决定了时间分辨率和频率分辨率之间的权衡。
  • noverlap:连续窗口之间重叠的样本数。典型值是窗长的 50%,这确保了平滑过渡。
  • nfft:快速傅里叶变换(FFT)的点数。更大的 nfft 提供更精细的频率分辨率。
  • fs:信号的采样频率。这对于正确标注赫兹(Hertz)单位的频率轴至关重要。
  • 'yaxis':一个可选参数,用于直接绘制频谱图,其中时间在 x 轴上,频率在 y 轴上。

关键概念:时频权衡

  • 短窗口提供良好的时间分辨率(您可以精确指出频率事件发生的时间),但频率分辨率较差(难以区分两个接近的频率)。
  • 长窗口提供良好的频率分辨率,但时间分辨率较差。

啁啾信号非常适合演示频谱图,因为其频率随时间变化。让我们创建一个从 100 赫兹扫频到 400 赫兹的信号。

% --- 信号参数 ---
samplingFreq = 1000; % Hz
duration = 2; % seconds
timeVector = 0:1/samplingFreq:duration-1/samplingFreq;
% --- 创建一个线性啁啾信号 ---
initialFreq = 100; % Hz
finalFreq = 400; % Hz
chirpSignal = chirp(timeVector, initialFreq, duration, finalFreq, 'linear');
% --- 频谱图参数 ---
windowLength = 256; % samples
overlap = round(0.5 * windowLength); % 50% 重叠
nfft = 512; % FFT 点数
% --- 生成并绘制频谱图 ---
figure;
spectrogram(chirpSignal, hamming(windowLength), overlap, nfft, samplingFreq, 'yaxis');
title('Spectrogram of a Linear Chirp Signal');
% 添加颜色条以显示功率级别
colorbar;

生成的图将清晰地显示一条对角线,从 t=0 时的 100 赫兹开始,上升到 t=2 时的 400 赫兹,从而直观地确认信号变化的频率内容。

现在,让我们分析一个由两个不同正弦波组成的信号,其中一个只在短时间内出现。

samplingFreq = 1000; % Hz
timeVector = 0:1/samplingFreq:2-1/samplingFreq;
% 一个持续整个持续时间的 50 Hz 正弦波
sine1 = sin(2 * pi * 50 * timeVector);
% 一个只在 t=0.5s 到 t=1.5s 之间出现的 200 Hz 正弦波
sine2 = sin(2 * pi * 200 * timeVector);
sine2(timeVector < 0.5 | timeVector > 1.5) = 0; % 对信号进行门控
combinedSignal = sine1 + sine2;
% --- 生成并绘制频谱图 ---
figure;
spectrogram(combinedSignal, 128, 120, 128, samplingFreq, 'yaxis');
title('Spectrogram of a Gated Sinusoid');
colorbar;

此示例的频谱图将显示两条水平线。一条线位于 50 赫兹,跨越整个 2 秒持续时间。第二条更亮的线将出现在 200 赫兹,但仅在 0.5 到 1.5 秒标记之间,这表明频谱图能够在时间和频率上定位信号。

  • 错误:未定义函数 ‘spectrogram’:这表示**信号处理工具箱(Signal Processing Toolbox™)**未安装或未激活。您可以从“附加功能”菜单安装它。
  • 图看起来‘模糊’或‘块状’:您的时频分辨率与信号不匹配。请尝试调整 windowLength。较短的窗口可以提高时间分辨率(减少模糊),较长的窗口可以提高频率分辨率(减少频率上的块状感)。
  • 频率轴不正确:您可能忘记将正确的采样频率 fs 作为参数提供给 spectrogram 函数。如果没有它,y 轴将显示为归一化频率。
  • 交互式分析:对于交互式探索,请使用 pspectrum(signal, fs, 'spectrogram')。这会创建一个图,您可以在其中缩放、平移和测量峰值,而无需重新生成频谱图。