ben*_*ene 10 matlab signal-processing fft spectrogram
我试图绘制我的时域信号的谱图:
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);
Run Code Online (Sandbox Code Playgroud)
问题是我不明白参数和应该给出的值.我正在使用这些值,我参考了MATLAB的在线文档spectrogram
.我是MATLAB的新手,我只是没有理解.任何帮助将不胜感激!
ray*_*ica 36
在我们实际进入MATLAB命令之前,您可能想知道谱图是什么.这样你就会对每个参数的工作方式有更多的了解.
谱图是短时傅立叶变换的视觉表示.可以将其视为输入信号的块并在每个块上应用局部傅里叶变换.每个块都有指定的宽度,您可以对此块应用傅里叶变换.您应该注意每个块具有相关的频率分布.对于以时间信号中特定时间点为中心的每个块,您将获得一堆频率成分.在每个块处收集所有这些频率分量并将它们全部绘制在一起基本上是谱图.
频谱图是2D视觉热图,其中水平轴表示信号的时间,垂直轴表示频率轴.可视化的是图像,其中较暗的颜色意味着对于特定时间点和特定频率,频率分量的幅度越小,颜色越暗.类似地,频率分量越大,颜色越浅.
这是一个完美的光谱图示例:
资料来源:维基百科
因此,对于每个时间点,我们看到频率分量的分布.将每列视为以此时间点为中心的块的频率分解.对于每列,我们看到不同的颜色范围.颜色越深,该频率的幅度分量越低,反之亦然.
所以!...现在你已经掌握了这一点,让我们来看看MATLAB在功能及其参数方面的工作原理.您调用的方式spectrogram
符合此版本的功能:
spectrogram(x,window,noverlap,nfft,fs)
Run Code Online (Sandbox Code Playgroud)
让我们逐个浏览每个参数,这样您就可以更好地理解每个参数的作用:
x
- 这是您希望找到频谱图的输入时域信号.它不能比那简单得多.在您的情况下,您要查找光谱图的信号在以下代码中定义:
N=5000;
phi = (rand(1,N)-0.5)*pi;
a = tan((0.5.*phi));
i = 2.*a./(1-a.^2);
Run Code Online (Sandbox Code Playgroud)
在这里,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,但您可以将其覆盖为信号的采样频率.
因此,您应该从中获取的是我无法真正告诉您如何设置参数.这一切都取决于你有什么信号,但希望上面的解释能让你更好地了解如何设置参数.
祝好运!