PyWavelets CWT: Resampling vs. Recomputing Wavelet

Oct 01 2020

Verwandte . Die Implementierung integriert ein Wavelet einmal vorab und tastet es bei jedem erneut ab scale, um es schließlich diffzu implementieren:

$$ 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) $$

Aber es tut es auch * sqrt(scale), während wir uns oben klar trennen ; was ist das Problem? Und wie ist es im Vergleich zur tatsächlichen Neuberechnung des Wavelets auf jeder Skala?

Antworten

OverLordGoldDragon Oct 01 2020 at 14:19

Die Normalisierung ist in der Tat vorbei 1 / sqrt(scale)und es ist eine L2-Norm; Der Trick liegt im Wavelet.

Ich werde wavelet='morl'überall verwenden. Vor der Integration können wir hier das Wavelet untersuchen . Es wird von zurückgegeben wavelet.wavefun, das binär kompiliert ist, aber nach einigem Rätselraten habe ich festgestellt, dass es genau übereinstimmt

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

das ist, aus der Quelle , mit Wiki- Notation,$\psi(t) = \psi_{\sigma}(t/a)$, wo $a$ ist Skala, und

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

(Skala und $\pi^{-1/4}$stornieren). Das ist , was integriert über cumsum(psi) * step, und dann erneut abgetastet für alle scales.


Neu abgetastet vs. neu berechnet

Was genau macht dieses Resampling in Bezug auf Gleichung 1 ? Ist es nur eine höhere Auflösung des Wavelets auf derselben Skala oder entspricht es der Neuberechnung von Gleichung 1 auf jeder Skala? Praktischerweise, letztere, aber nur annähernd, und die Annäherung verschlechtert sich für kleine scale(- Code1 ) erheblich :

Beachten Sie aus Code1 jedoch das neu berechnete Wavelet:

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

Die Neuberechnung beinhaltet 1 / scale, was zusammen mit * sqrt(scale)gleich ist 1 / sqrt(scale). Geheimnis gelüftet.


Ihr Code ist falsch, wo ist * step?

Ersetzt durch 1 / scale. Wie?

Beachten Sie im MAE-Code, dass scale=64wir für int_psi_scale == int_psiwelche haben == cumsum(psi) * step. Denn w_intwir tun es cumsum(w) / scale. Und 1 / scaleist ... == step. Das vorintegrierte Wavelet psibefindet sich also gerade wbei scale=64(im morlet2obigen Code 1024 / 16 == 64wird ausgecheckt) und ist stepzufällig ... bequem? == 1 / scalebei der Integration.

Warum gibt 1 / scalees dann? Unklar. Zwei Möglichkeiten im Auge: (1) Beibehaltung der Wavelet-Norm bei der Integration; (2) Skalieren des Wavelets unabhängig von der Integration.

  1. Wenn der Wavelet war L1 oder L2 vor der Integration normalisiert, entweder bleiben erhalten. Dies ist aus der Kettenregel; einfach ersetzen$f$ mit $\psi$, und $k$ mit $1/a$::

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

  1. Dies scheint wahrscheinlicher zu sein, da letzteres diffdem Rückgängigmachen der Integration nahe kommt und den Zweck von (1) zunichte macht . Warum das Wavelet neu skalieren? Normalisierung - siehe hier .

Du hast früher betrogen; es gibt keinw /= scale

Der Code zeigt zwar tatsächlich w_int = cumsum(w) / scale, aber die beiden sind genau gleich. Es ist also die frühere Frage, woher 1 / scale"gehört" oder "kommt". Dies wird hier und in einem anderen Teil unten beantwortet .


Warum step == 1 / scalebei der Integration? (- als Referenz von hier (in Code1,$n$ist x)):

Nur ein Zufall oder ist stepzusammen$n_i$, sorgfältig ausgearbeitet, um die praktischen Resampling-Eigenschaften zu erzielen, die wiederum verlangen step = 1 / scale? Weiß nicht, könnte die Antwort später aktualisieren.