scipy.signal.spectrogram по сравнению с matplotlib.pyplot.specgram

Следующий код создает спектрограмму, используя либо 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()

Изображение получено с помощью 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()

Изображение получено с помощью scipy.signal.spectrogram

Обе функции, кажется, используют цветовую карту "jet".

Меня также вообще интересовала бы разница между двумя функциями. Хотя они делают что-то похожее, они явно не идентичны.


person NicolasBourbaki    schedule 03.02.2018    source источник
comment
Очень помогло бы, если бы здесь была картинка, которую бы описали и прокомментировали в вопросе, чтобы люди понимали, что желательно, а что нежелательно.   -  person ImportanceOfBeingErnest    schedule 03.02.2018
comment
Поможет ли вам это?   -  person Thomas Kühn    schedule 03.02.2018
comment
Спасибо за ваши комментарии, которые помогли мне лучше проиллюстрировать и конкретизировать проблему. Как вы можете видеть на изображениях, matplotlib.pyplot.specgram содержит в основном теплые цвета (желтый) на заднем плане, тогда как график scipy.signal.spectrogram contains rather cold colors (blue) in the background. I would like to achieve scipy's choice of colors for matplotlib's specgram`.   -  person NicolasBourbaki    schedule 04.02.2018
comment
Я собирался ответить, но потом увидел ответ на этот вопрос (который является дубликатом, кстати), и этот человек должен просто бросить микрофон: stackoverflow.com/questions/34156050/   -  person eric    schedule 17.07.2020


Ответы (1)


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).

person Sizhuang Liang    schedule 12.10.2018