如何使用`matplotlib.pyplot.specgram`绘制频段

时间:2019-12-15 20:42:33

标签: python matplotlib spectrogram

我可以这样绘制频谱图(在Jupyter笔记本中):

fs = 48000
noverlap = (fftFrameSamps*3) // 4
spectrum2d, freqs, timePoints, image = \
    plt.specgram( wav, NFFT=fftFrameSamps, Fs=fs, noverlap=noverlap )

plt.show()

enter image description here

但是,我只对15-20 kHz的范围感兴趣。 我如何只绘制这个范围?

我可以看到函数返回了image,所以也许我可以将图像转换为矩阵并从矩阵中获取适当的切片...?

我可以看到该函数接受vminvmax,但是它们似乎没有记载,并且使用它们不会产生有效的结果。

1 个答案:

答案 0 :(得分:1)

您可以像通常使用set_ylim()set_xlim()那样修改轴的极限。在这种情况下

plt.ylim([15000, 20000])

应将绘图限制在15-20 kHz范围内。有关Spectrogram Demo的完整示例绘图:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)

dt = 0.0005
t = np.arange(0.0, 20.0, dt)
s1 = np.sin(2 * np.pi * 100 * t)
s2 = 2 * np.sin(2 * np.pi * 400 * t)

# create a transient "chirp"
s2[t <= 10] = s2[12 <= t] = 0

# add some noise into the mix
nse = 0.01 * np.random.random(size=len(t))

x = s1 + s2 + nse  # the signal
NFFT = 1024  # the length of the windowing segments
Fs = int(1.0 / dt)  # the sampling frequency

fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(14, 7))
ax1.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900)
ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900)
ax2.set_ylim([50, 500])
plt.show()

enter image description here