Ось частоты в непрерывном вейвлет-преобразовании (масштабограмма) в питоне
У меня есть сигнал ЭЭГ, и я заинтересован в его анализе во временной и частотной областях. Я уже использовал функцию scipy.signal.spectrogram, но я думаю, что использование вейвлетов может дать лучшие результаты для извлечения объектов. Я попытался запустить непрерывное вейвлет-преобразование для искусственного сигнала, который я создал следующим образом:
fs = 128.0
sampling_period = 1/fs
t = np.linspace(0, 2, 2*fs)
x = chirp(t,10,2,40,'quadratic')
coef, freqs = pywt.cwt(x, np.arange(1,50),'morl',
sampling_period=sampling_period)
и тогда я построил матрицу коэффи
plt.matshow(coef)
plt.show()
У меня вопрос, как я могу настроить шкалу и оси времени?
1 ответ
Функция plt.matshow(coef)
не использует массивы времени и частоты для создания осей (но создает оси на основе индекса выборки).
Я предлагаю использовать plt.pcolormesh(t, freqs, coef)
, поэтому время и частота используются для осей. Затем вы можете поиграть со шкалой, скажем, поместить ось частоты в логарифмическую шкалу и произвести что-то вроде этого:
Вот код, который произвел изображение, полученное из вашего примера:
import pywt
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import chirp
# Define signal
fs = 128.0
sampling_period = 1 / fs
t = np.linspace(0, 2, 2 * fs)
x = chirp(t, 10, 2, 40, 'quadratic')
# Calculate continuous wavelet transform
coef, freqs = pywt.cwt(x, np.arange(1, 50), 'morl',
sampling_period=sampling_period)
# Show w.r.t. time and frequency
plt.figure(figsize=(5, 2))
plt.pcolor(t, freqs, coef)
# Set yscale, ylim and labels
plt.yscale('log')
plt.ylim([1, 100])
plt.ylabel('Frequency (Hz)')
plt.xlabel('Time (sec)')
plt.savefig('egg.png', dpi=150)