Ось частоты в непрерывном вейвлет-преобразовании (масштабограмма) в питоне

У меня есть сигнал ЭЭГ, и я заинтересован в его анализе во временной и частотной областях. Я уже использовал функцию 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)
Другие вопросы по тегам