限制 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&gt;0,可能还有基带移位),但这个过程的成本不可忽略(在复杂性和处理时间方面),因此通常只有在下采样因子足够的情况下才有用大。另一种方法是使用 Goertzel algorithm 而不是 FFT,但同样,只有查看频谱的一小部分,您才能有所收获。 感谢 SleuthEye 提供有关 Goertzel 算法的详细信息,它肯定会有所帮助。除了可以做的事情之外,您的答案提供了答案。我会尝试遵循这种做法。 不幸的是,当维度数量增加时,“仍然是一种相当有效的方法”越来越不真实。

以上是关于限制 scipy.signal.spectrogram 仅计算特定频率的主要内容,如果未能解决你的问题,请参考以下文章

EditText字符限制-字节数限制-一次截取超过限制部分

Post 提交,参数长度有限制吗

SQLServer限制IP,限制用户,限制SSMS登录

Get请求有大小限制?别再执迷不悟了!

ecshop 文章网页描述字数限制增加

cgroup限制内存