Как определить свой собственный непрерывный вейвлет с помощью Python?

Как видно из названия, я хочу определить свой собственный непрерывный вейвлет с помощью Python. Однако я не знаю, как именно этого добиться.

Формула моей материнской функции вейвлета приведена ниже.

введите здесь описание изображения

Это похоже на вейвлет мексиканской шляпы, но они разные.

Итак, как я могу определить такой пользовательский вейвлет с помощью Python, тогда CWT может быть выполнен с использованием этого вейвлета?


person Stephen Wong    schedule 28.11.2020    source источник


Ответы (1)


Для этого вам нужна функция, которая принимает количество баллов и шкала для предоставления в качестве аргумента wavelet

Итак, мы определяем это как таковое:

import math
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

mother_wavelet = lambda z : np.exp(-z*z/4)*(2-z*z)/(4*math.sqrt(math.pi))

def mexican_hat_like(n,scale):
    x = np.linspace(-n/2,n/2,n)
    return mother_wavelet(x/scale)

Давайте проверим это. Мы отмечаем, что на самом деле то, что очень похоже на ваше, это доступно. Разница в масштабировании a, а также константа спереди выглядит немного иначе. Обратите внимание на масштабирование math.sqrt(2) для вейвлета Рикера.

points = 100
a = 4.0
vec_ours = mexican_hat_like(points, a)
vec_theirs = signal.ricker(points, a*math.sqrt(2))
plt.plot(vec_ours, label = 'ours')
plt.plot(vec_theirs, label = 'ricker')
plt.legend(loc = 'best')
plt.show()

Вот график:

вейвлеты

person piterbarg    schedule 28.11.2020
comment
Спасибо за хороший ответ! Почему бы не определить mother_wavelet внутри функции mexican_hat_like? - person Stephen Wong; 28.11.2020
comment
нет причин - можете пойти туда, если вам это не нужно в другом месте - person piterbarg; 28.11.2020
comment
Я заметил, что координата x вашего графика не является истинным значением координаты вейвлета. Есть ли способ показать истинные значения x на графике вейвлета? - person Stephen Wong; 28.11.2020
comment
вы можете увидеть их в определении вейвлета x = np.linspace(-n/2,n/2,n) return mother_wavelet(x/scale), поэтому не знаете, что вы имеете в виду? Я не уверен, каковы «истинные» значения вейвлетов, но вы можете изменить там свои x-s - person piterbarg; 28.11.2020