Что эквивалентно cwt() Matlab в Python? (непрерывное одномерное вейвлет-преобразование)

Я хочу вычислить вейвлет сигнала с разными масштабами и временными сдвигами.

В Matlab с помощью предоставленной функции cwt() (непрерывное одномерное вейвлет-преобразование) в Wavelet Toolbox я могу указать масштабы, которые я хочу, в качестве параметра в cwt(), и он вернет все возможные временные сдвиги:

x = [1, 2, 3, 4];
scales = [1, 2, 3];
wavelet_name = 'db1';
coefs = cwt(x,scales, wavelet_name);

>> coefs =   

   -0.0000   -0.0000   -0.0000    0.0000
   -0.7071   -0.7071   -0.7071   -0.7071
   -1.1553   -1.1553   -1.1553    1.7371

Как я могу добиться этого в Python?

Вот мои две попытки:

  1. В PyWavelets (дискретное вейвлет-преобразование в Python) я не вижу, как указать параметр масштаба вейвлета.
  2. В scipy.signal.cwt я могу не могу найти список встроенных вейвлет-функций, которые я могу передать в scipy.signal.cwt: я хочу иметь, по крайней мере, наиболее распространенные вейвлет-функции, такие как sym2 и db1. (например, см. список встроенных вейвлетов Matlab).

person Franck Dernoncourt    schedule 19.05.2014    source источник
comment
Поскольку на этот вопрос не было ответа, я разместил его на Quora: quora.com/   -  person Franck Dernoncourt    schedule 13.04.2016
comment
Я написал ответ, не могли бы вы взглянуть? Мне было бы любопытно узнать, нашли ли вы лучшие библиотеки, которые я мог бы использовать.   -  person Matteo    schedule 21.03.2019
comment
@Matteo Спасибо за ваш ответ, я не нашел лучшей библиотеки на своей стороне.   -  person Franck Dernoncourt    schedule 21.03.2019
comment
@Frank - Спасибо за быстрый ответ. Это действительно очень плохо, потому что нет ничего сравнимого с набором инструментов Matlab для Python. Pywavelets - мой выбор, но тот факт, что у них нет конуса влияния или проверки значимости, действительно ограничивает использование.   -  person Matteo    schedule 21.03.2019
comment
@Matteo Звучит хорошо, проголосовали (в прошлом месяце) и приняли (сейчас)!   -  person Franck Dernoncourt    schedule 02.04.2019


Ответы (2)


Похоже, что есть несколько библиотек Python для работы с вейвлетами за пределами scipy:

Пивейвлеты

Вот ссылка на документацию, github и базовый фрагмент для использования. Он довольно интуитивно понятен в использовании и имеет обширную библиотеку реализованных вейвлетов.

import pywt
import numpy as np
import matplotlib.pyplot as plt

num_steps = 512
x = np.arange(num_steps)
y = np.sin(2*np.pi*x/32)

delta_t = x[1] - x[0]
scales = np.arange(1,num_steps+1)
wavelet_type = 'morl'
coefs, freqs = pywt.cwt(y, scales, wavelet_type, delta_t)
plt.matshow(coefs) 
plt.show()

PyCWT

Вот ссылка на документацию, github и базовый фрагмент для использования. У этой библиотеки более крутая кривая обучения, а API не такой приятный, но поддерживает такие функции, как cone of influence или significance testing.

import pycwt as wavelet
import numpy as np
import matplotlib.pyplot as plt

num_steps = 512
x = np.arange(num_steps)
y = np.sin(2*np.pi*x/32)

delta_t = x[1] - x[0]
scales = np.arange(1,num_steps+1)
freqs = 1/(wavelet.Morlet().flambda() * scales)
wavelet_type = 'morlet'

coefs, scales, freqs, coi, fft, fftfreqs = wavelet.cwt(y, delta_t, wavelet=wavelet_type, freqs=freqs)
plt.matshow(coefs.real)
plt.show()

Вы можете легко установить их, используя pip или conda.

Наконец, вот другие ссылки, которые я не пробовал использовать:

  1. один
  2. два
  3. три
person Matteo    schedule 21.03.2019

Вероятно, вы захотите использовать scipy.signal.cwt. Некоторые вейвлет-функции предоставляются в пакете scipy.signal:

Симлеты как таковые не предоставляются, но вы можете получить их от daub.

person Mad Physicist    schedule 12.07.2016