什么是频谱图以及如何设置其参数?

What is a spectrogram and how do I set its parameters?

我正在尝试绘制给定时域信号的频谱图:

N=5000;
phi = (rand(1,N)-0.5)*pi;
a = tan((0.5.*phi));
i = 2.*a./(1-a.^2);
plot(i);
spectrogram(i,100,1,100,1e3);

问题是我不明白参数以及应该给出什么值。我使用的这些值,我参考了spectrogram的MATLAB在线文档。我是 MATLAB 的新手,我只是不明白。任何帮助将不胜感激!

在我们真正了解 MATLAB 命令的作用之前,您可能想知道什么是频谱图。这样您就可以更深入地了解每个参数的工作原理。

频谱图是 Short-Time Fourier Transform 的直观表示。将其视为获取输入信号的块并对每个块应用局部傅里叶变换。每个块都有指定的宽度,您可以对这个块应用傅里叶变换。您应该注意每个块都有相关的频率分布。对于以时间信号中特定时间点为中心的每个块,您会得到一堆频率分量。在每个块处收集所有这些频率分量并绘制在一起,本质上就是一个频谱图。

频谱图是一个二维视觉热图,其中横轴代表信号的时间,纵轴代表频率轴。可视化的是一幅图像,颜色越深意味着对于特定时间点和特定频率,频率分量的幅度越低,颜色越深。同样,频率分量的幅度越大,颜色越浅。

这是一个完美的频谱图示例:

来源:Wikipedia

因此,对于每个时间点,我们都看到了频率分量的分布。将每一列视为以该时间点为中心的块的频率分解。对于每一列,我们看到不同的光谱。颜色越深,该频率的幅度分量越低,反之亦然。


所以!...现在您已经掌握了它,让我们从函数及其参数的角度来看 MATLAB 是如何工作的。您调用 spectrogram 的方式符合此版本的函数:

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

让我们逐一了解每个参数,以便您更好地了解每个参数的作用:

  • x - 这是您希望找到其频谱图的输入时域信号。没有比这更简单的了。在您的情况下,您想要查找其频谱图的信号在以下代码中定义:

    N=5000;
    phi = (rand(1,N)-0.5)*pi;
    a = tan((0.5.*phi));
    i = 2.*a./(1-a.^2);
    

    这里,i是你要查找频谱图的信号。

  • window - 如果你还记得,我们将图像分解成块,每个块都有指定的宽度。 window 根据 样本 定义每个块的宽度。由于这是一个离散时间信号,您知道这个信号是用特定的采样频率和采样周期采样的。您可以通过以下方式确定 window 在样本方面的大小:

    window_samples = window_time/Ts

    Ts 是信号的采样时间。设置 window 大小实际上是非常靠经验的,需要大量试验。基本上,window 尺寸越大,您获得的频率分辨率就越高,因为您捕获的频率越多,但时间定位较差。类似地,window 尺寸越小,您在时间上的定位就越好,但您不会得到那么好的频率分解。我在这里没有关于最佳尺寸的任何建议......这就是为什么 wavelets 在时频分解方面是首选的原因。对于每个 "chunk",块被分解成具有动态宽度的较小块,因此您可以获得良好的时间和频率本地化的混合。

  • noverlap - 确保良好频率定位的另一种方法是块 重叠 。适当的频谱图确保每个块都有一定数量的样本重叠,并且 noverlap 定义每个 window 中重叠的样本数量。默认为每个块宽度的 50%。

  • nfft - 您实际上是在对每个块进行 FFT。 nfft 告诉您每个块需​​要计算多少个 FFT 点。默认点数是 256 或 floor(log2(N)) 中最大的,其中 N 是信号的长度。 nfft 还可以衡量频率分辨率的精细程度。更多数量的 FFT 点将提供更高的频率分辨率,因此如果可视化,则沿着频谱图的频率轴显示细粒度的细节。

  • fs - 信号的采样频率。默认值为 1 Hz,但您可以将其覆盖为信号所处的任何采样频率。


因此,您可能应该明白的是,我无法真正告诉您如何设置参数。这一切都取决于你有什么信号,但希望上面的解释能让你更好地了解如何设置参数。


祝你好运!