我试图绘制我的时域信号的频谱图:
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的新手,我只是没有理解。任何帮助将不胜感激!
答案 0 :(得分:33)
在我们实际进入MATLAB命令之前,你可能想知道谱图是什么。通过这种方式,您可以更好地了解每个参数的工作方式。
频谱图是Short-Time Fourier Transform的直观表示。可以将其视为输入信号的块并在每个块上应用局部傅里叶变换。每个块都有指定的宽度,您可以对此块应用傅里叶变换。您应该注意每个块具有相关的频率分布。对于以时间信号中特定时间点为中心的每个块,您将获得一堆频率成分。在每个块处收集所有这些频率分量并将它们全部绘制在一起基本上是谱图。
频谱图是2D视觉热图,其中横轴表示信号的时间,纵轴表示频率轴。可视化的是图像,其中较暗的颜色意味着对于特定时间点和特定频率,频率分量的幅度越小,颜色越暗。同样,频率成分的幅度越大,颜色越浅。
这是谱图的一个完美例子:
来源: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_samples = window_time/Ts
Ts
是信号的采样时间。设置窗口大小实际上是非常经验的,需要大量的实验。基本上,窗口尺寸越大,获得更多频率时获得的频率分辨率就越高,但时间定位很差。同样地,窗口尺寸越小,您在时间上的定位就越好,但是您没有那么好的频率分解。我在这里没有任何关于最佳尺寸的建议......这就是为什么wavelets在时频分解方面是首选的原因。对于每个" chunk",块被分解为动态宽度的较小块,因此您可以获得良好的时间和频率定位的混合。
noverlap
- 确保良好频率定位的另一种方法是块重叠。适当的频谱图确保每个块具有针对每个块重叠的特定数量的样本,并且noverlap
定义在每个窗口中重叠的样本数量。默认值是每个块的宽度的50%。
nfft
- 您实际上是在对每个块进行FFT。 nfft
告诉您每个块需要计算多少个FFT点。默认点数是256或floor(log2(N))
中的最大值,其中N
是信号的长度。 nfft
还可以衡量频率分辨率的细微程度。较高数量的FFT点可以提供更高的频率分辨率,从而在可视化时显示沿频谱图频率轴的细粒度细节。
fs
- 信号的采样频率。默认值为1 Hz,但您可以将其覆盖为信号的采样频率。
因此,您应该从中获取的是我无法真正告诉您如何设置参数。这一切都取决于你有什么信号,但希望上面的解释能让你更好地了解如何来设置参数。