MATLAB - 绘制频谱图
在 MATLAB 中使用频谱图可视化信号
Section titled “在 MATLAB 中使用频谱图可视化信号”频谱图是一种强大的工具,用于可视化信号随时间变化的频率内容。它在音频处理、通信和振动分析等领域至关重要。MATLAB 的**信号处理工具箱(Signal Processing Toolbox™)**提供了 spectrogram 函数,可以轻松计算和显示这些富有洞察力的图。
什么是频谱图?
Section titled “什么是频谱图?”频谱图是一个显示为 2D 图像的 3D 图。它显示:
- 时间在 x 轴上。
- 频率在 y 轴上。
- 信号功率/幅度作为每个时频点的颜色强度。
它通过计算短时傅里叶变换(STFT)生成,这涉及到将信号分解成小的、重叠的时间窗口,并计算每个窗口的傅里叶变换。
spectrogram 函数
Section titled “spectrogram 函数”生成和绘制频谱图的主要语法是:
spectrogram(x, window, noverlap, nfft, fs, 'yaxis')让我们分解一下关键参数:
x:您的输入信号向量。window:定义窗函数(例如hamming(256))的向量。这用于整形信号段以减少频谱泄漏。窗长决定了时间分辨率和频率分辨率之间的权衡。noverlap:连续窗口之间重叠的样本数。典型值是窗长的 50%,这确保了平滑过渡。nfft:快速傅里叶变换(FFT)的点数。更大的nfft提供更精细的频率分辨率。fs:信号的采样频率。这对于正确标注赫兹(Hertz)单位的频率轴至关重要。'yaxis':一个可选参数,用于直接绘制频谱图,其中时间在 x 轴上,频率在 y 轴上。
关键概念:时频权衡
- 短窗口提供良好的时间分辨率(您可以精确指出频率事件发生的时间),但频率分辨率较差(难以区分两个接近的频率)。
- 长窗口提供良好的频率分辨率,但时间分辨率较差。
示例 1:一个啁啾信号
Section titled “示例 1:一个啁啾信号”啁啾信号非常适合演示频谱图,因为其频率随时间变化。让我们创建一个从 100 赫兹扫频到 400 赫兹的信号。
% --- 信号参数 ---samplingFreq = 1000; % Hzduration = 2; % secondstimeVector = 0:1/samplingFreq:duration-1/samplingFreq;
% --- 创建一个线性啁啾信号 ---initialFreq = 100; % HzfinalFreq = 400; % HzchirpSignal = chirp(timeVector, initialFreq, duration, finalFreq, 'linear');
% --- 频谱图参数 ---windowLength = 256; % samplesoverlap = 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 赫兹,从而直观地确认信号变化的频率内容。
示例 2:分析正弦波之和
Section titled “示例 2:分析正弦波之和”现在,让我们分析一个由两个不同正弦波组成的信号,其中一个只在短时间内出现。
samplingFreq = 1000; % HztimeVector = 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 秒标记之间,这表明频谱图能够在时间和频率上定位信号。
常见错误和实用技巧
Section titled “常见错误和实用技巧”- 错误:未定义函数 ‘spectrogram’:这表示**信号处理工具箱(Signal Processing Toolbox™)**未安装或未激活。您可以从“附加功能”菜单安装它。
- 图看起来‘模糊’或‘块状’:您的时频分辨率与信号不匹配。请尝试调整
windowLength。较短的窗口可以提高时间分辨率(减少模糊),较长的窗口可以提高频率分辨率(减少频率上的块状感)。 - 频率轴不正确:您可能忘记将正确的采样频率
fs作为参数提供给spectrogram函数。如果没有它,y 轴将显示为归一化频率。 - 交互式分析:对于交互式探索,请使用
pspectrum(signal, fs, 'spectrogram')。这会创建一个图,您可以在其中缩放、平移和测量峰值,而无需重新生成频谱图。