scipy.signal.spectrogram与matplotlib.pyplot.specgram

时间:2018-02-03 15:31:04

标签: matplotlib scipy signal-processing spectrum spectrogram

以下代码使用scipy.signal.spectrogrammatplotlib.pyplot.specgram生成频谱图。

specgram函数的颜色对比度相当低。 有没有办法增加它?

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# Generate data
fs = 10e3
N = 5e4
amp = 4 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 800*np.cos(2*np.pi*0.2*time)
carrier = amp * np.sin(2*np.pi*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise

使用matplotlib.pyplot.specgram会得到以下结果:

Pxx, freqs, bins, im = plt.specgram(x, NFFT=1028, Fs=fs)
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, 0, 200))
plt.show()

Image obtained with matplotlib.pyplot.specgram

使用scipy.signal.spectrogram给出以下图

f, t, Sxx = signal.spectrogram(x, fs, nfft=1028)
plt.pcolormesh(t, f[0:20], Sxx[0:20])
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

Image obtained with scipy.signal.spectrogram

这两个函数似乎都使用'jet'色彩映射。

我也普遍对这两个功能的区别感兴趣。虽然他们做了类似的事情,但他们显然不完全相同。

1 个答案:

答案 0 :(得分:2)

plt.specgram不仅返回Pxx,f,t,而且还会自动为您进行绘图。绘制时,plt.specgram绘制10 * np.log10(Pxx)而不是Pxx。

但是,signal.spectrogram仅返回Pxx,f,t。它根本不作图。这就是您使用plt.pcolormesh(t,f [0:20],Sxx [0:20])的原因。您可能需要绘制10 * np.log10(Sxx)。