PyWavelets CWT: ricampionamento vs ricalcolo wavelet

Oct 01 2020

Correlati . L' implementazione pre-integra un wavelet una volta e lo ricampiona a ogni scale, infine, diffimplementando di seguito:

$$ C_{a, b} = \frac{1}{\sqrt{a}} \sum_k s(k)\left( \int_{-\infty}^{k+1} \overline{\psi \left(\frac{t-b}{a} \right) }dt - \int_{-\infty}^{k} \overline{\psi \left(\frac{t-b}{a} \right) }dt \right) $$

Ma lo fa anche * sqrt(scale), mentre sopra ci stiamo chiaramente dividendo ; qual è l'accordo? E com'è il confronto con il ricalcolo effettivo del wavelet su ogni scala?

Risposte

OverLordGoldDragon Oct 01 2020 at 14:19

La normalizzazione è effettivamente di 1 / sqrt(scale), ed è una norma L2; il trucco sta nella wavelet di scala.

Lo userò wavelet='morl'dappertutto. Prima dell'integrazione, possiamo ispezionare qui il wavelet ; viene restituito da wavelet.wavefun, che è compilato in formato binario, ma dopo alcune congetture, ho scoperto che corrispondeva esattamente a

scipy.signal.morlet2(1024, 1024 / 16) * sqrt(1024 / 16) * np.pi**(.25)

che è, dalla fonte , usando la notazione di Wiki ,$\psi(t) = \psi_{\sigma}(t/a)$, dove $a$ è la scala e

$$ \psi_{\sigma}(t) = e^{j\sigma t} e^{-t^2/2} \tag{1} \label{1} $$

(scala e $\pi^{-1/4}$Annulla). Questo è ciò che viene integrato tramite cumsum(psi) * stepe quindi ricampionato per tutti scales.


Ricampionato vs ricalcolato

Cosa sta facendo esattamente questo ricampionamento in termini di Eq 1 ? È solo una risoluzione più alta del wavelet alla stessa scala o è equivalente a ricalcolare l' Eq 1 su ciascuna scala? Convenientemente, quest'ultimo, ma solo approssimativamente, e l'approssimazione degrada sostanzialmente per piccoli scale(- codice1 ):

Notate da code1, tuttavia, il wavelet ricalcolato:

Ns = len(int_psi_scale)
w = real(morlet2(Ns, Ns / 16) * sqrt(Ns / 16) * np.pi**(.25))  # repeats first blob
w /= scale

Il ricalcolo include 1 / scale, che, insieme a * sqrt(scale), è uguale a 1 / sqrt(scale). Mistero risolto.


Il tuo codice è sbagliato, dov'è * step?

Sostituito da 1 / scale. Come?

Nel codice MAE, nota che per scale=64, abbiamo int_psi_scale == int_psi, quale == cumsum(psi) * step. Per w_int, lo facciamo cumsum(w) / scale. Ed 1 / scaleè ... == step. Quindi, il wavelet preintegrato,, psiè solo wa scale=64(nel morlet2codice sopra 1024 / 16 == 64,, controlla) e stepsembra essere ... convenientemente? == 1 / scaledurante l'integrazione.

Allora perché 1 / scalec'è? Non chiaro. Due possibilità in mente: (1) preservare la norma del wavelet durante l'integrazione; (2) scalare il wavelet , indipendentemente dall'integrazione.

  1. Se il wavelet era L1 o L2 normalizzato prima dell'integrazione, entrambi verranno preservati. Questo è dalla regola della catena; basta sostituire$f$ con $\psi$, e $k$ con $1/a$:

$$ \int f(k x) dx = \frac{1}{|k|} \int f(x) dx $$

  1. Ciò sembra più probabile, poiché il diffsecondo è molto simile all'annullamento dell'integrazione, vanificando lo scopo di (1). Perché riscalare la wavelet? Normalizzazione - vedi qui .

Hai tradito prima; Non c'èw /= scale

È vero, il codice mostra effettivamente w_int = cumsum(w) / scale, ma i due sono esattamente gli stessi. È quindi la domanda precedente di dove 1 / scale"appartiene" o "proviene". Questo è risolto qui e in altra parte di seguito.


Perché step == 1 / scaleall'integrazione? (- per riferimento, da qui (in code1,$n$è x)):

Solo una coincidenza, o è step, lungo$n_i$, realizzato con cura per ottenere le convenienti proprietà di ricampionamento, che a loro volta richiedono step = 1 / scale? Non so, potrebbe aggiornare la risposta più tardi.