12

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

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);

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

4

1 回答 1

49

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

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

频谱图是一个 2D 视觉热图,其中水平轴代表信号的时间,垂直轴代表频率轴。可视化的是图像,其中较深的颜色意味着对于特定时间点和特定频率,频率分量的幅度越低,颜色越深。类似地,频率分量的幅度越高,颜色越浅。

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

资料来源:维基百科

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


所以!...现在你已经掌握了这些,让我们来看看 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_samples = window_time/Ts

    Ts是信号的采样时间。设置窗口大小实际上是非常经验性的,需要大量的实验。基本上,窗口越大,在捕获更多频率时获得的频率分辨率就越高,但时间定位很差。同样,窗口尺寸越小,您在时间上的定位就越好,但您并没有得到那么好的频率分解。我在这里没有任何关于最佳尺寸的建议......这就是为什么在时频分解方面小波是首选的原因。对于每个“块”,块被分解成动态宽度的更小块,因此您可以获得良好的时间和频率定位的混合。

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

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

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


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


祝你好运!

于 2015-03-28T21:08:26.807 回答