限制 scipy.signal.spectrogram 仅计算特定频率
Posted
技术标签:
【中文标题】限制 scipy.signal.spectrogram 仅计算特定频率【英文标题】:Limiting scipy.signal.spectrogram to calculate only specific frequencies 【发布时间】:2018-06-14 07:05:44 【问题描述】:我正在关注scipy.signal.spectrogram 的教程示例。
是否可以限制我们要计算频谱图的频率,比如说在 1000-2000Hz 范围内。根据 FFT,我们将在一半的采样频率下得到它。如果没有,那么我可以对输出进行切片以获得t,f,Sxx
的 3D 矩阵,我将频率限制为 1000-2000 Hz?在我的情况下,我的信号只包含一定范围的频率,保留所有频率对我的分析来说代价高昂。
【问题讨论】:
【参考方案1】:除非您要分析一小部分频谱,否则使用 FFT 计算整个频谱(并丢弃不需要的部分)通常仍然是获得部分频谱的相当有效的方法。
然后,您可以使用numpy.where
(在this answer 之后是askewchan)在f
中找到感兴趣的频率。下一步将是简单地对输出进行切片,提取一维阵列f
中的所需频率值以及二维阵列Sxx
中的相关功率谱值。这可以按如下方式完成:
...
f, t, Sxx = signal.spectrogram(x, fs)
fmin = 1000 # Hz
fmax = 2000 # Hz
freq_slice = np.where((f >= fmin) & (f <= fmax))
# keep only frequencies of interest
f = f[freq_slice]
Sxx = Sxx[freq_slice,:][0]
【讨论】:
SleuthEye,谢谢,效果很好,从您的回答看来,我可以使用其他方法有效地计算特定频谱范围的 stft,而不是丢弃一些信息,即假设我想将我的频率范围限制在 2000 HZ,我可以用 spectrogram 功能以某种方式限制它们。仅供参考,我正在尝试对信号进行时频分析。 确实可以限制频率范围,但不能直接用spectrogram
来做。一种方法是对输入信号进行下采样(如果fmin>0
,可能还有基带移位),但这个过程的成本不可忽略(在复杂性和处理时间方面),因此通常只有在下采样因子足够的情况下才有用大。另一种方法是使用 Goertzel algorithm 而不是 FFT,但同样,只有查看频谱的一小部分,您才能有所收获。
感谢 SleuthEye 提供有关 Goertzel 算法的详细信息,它肯定会有所帮助。除了可以做的事情之外,您的答案提供了答案。我会尝试遵循这种做法。
不幸的是,当维度数量增加时,“仍然是一种相当有效的方法”越来越不真实。以上是关于限制 scipy.signal.spectrogram 仅计算特定频率的主要内容,如果未能解决你的问题,请参考以下文章