web-dev-qa-db-ja.com

matplotlib.pyplot.specgramと比較したscipy.signal.spectrogram

次のコードは、scipy.signal.spectrogramまたはmatplotlib.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

どちらの関数も「ジェット」カラーマップを使用しているようです。

また、2つの機能の違いにも一般的に興味があります。それらは似たようなことをしますが、明らかに同一ではありません。

7
NicolasBourbaki

plt.specgramは、Pxx、f、tを返すだけでなく、プロットも自動的に行います。プロットするとき、plt.specgramはPxxの代わりに10 * np.log10(Pxx)をプロットします。

ただし、signal.spectrogramはPxx、f、tのみを返します。プロットは一切行いません。そのため、plt.pcolormesh(t、f [0:20]、Sxx [0:20])を使用しました。 10 * np.log10(Sxx)をプロットすることをお勧めします。

5
Sizhuang Liang