我正在尝试绘制给定时域信号的频谱图:
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 新手,我只是不明白。任何帮助将不胜感激!
我正在尝试绘制给定时域信号的频谱图:
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 新手,我只是不明白。任何帮助将不胜感激!
在我们真正了解 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,但您可以将其覆盖为信号所处的任何采样频率。
因此,您可能应该从中得到的是,我无法真正告诉您如何设置参数。这完全取决于你有什么信号,但希望上面的解释能让你更好地了解如何设置参数。
祝你好运!