CWT su scale basse: PyWavelets vs Scipy

Oct 07 2020

Le scale basse sono probabilmente le più difficili da implementare a causa delle limitazioni nelle rappresentazioni discretizzate. Confronto dettagliato qui ; la differenza principale è nel modo in cui le due wavelet gestiscono a ciascuna scala :

  • pywt : diffdi int_psi ricampionato a ciascuna scala, auto-normalizzato ( avvertimento2 );int_psi == cumsum(psi)
  • scipy : wavelet ricalcolato ed esplicitamente normalizzato ad ogni scala

(Per pywt non è esattamente diff(int_psi), ma il comportamento chiave è equivalente) I grafici sottostanti confrontano i CWT di morlet reali e complessi per un segnale di transizione acuto; tutti i coefficienti sono stati normalizzati L1.

Non ho ottenuto molto dall'ispezione delle forme delle rispettive wavelet (blu = ricalcolato, arancione = ricampionato, entrambi ridimensionati da -1 a 1):

Allora qual è il problema? Mi manca qualcosa nelle differenze di discretizzazione o l'approccio wavelet integrato di pywt è superiore per le scale inferiori (se sì, perché)?

Risposte

OverLordGoldDragon Oct 09 2020 at 04:17

Verdetto : concludo che il picco più alto a sinistra di Scipy è dovuto sia all'ampiezza più bassa delle wavelet di pywt alle scale inferiori sia alla correlazione più forte delle wavelet di Scipy con le frequenze inferiori alle scale inferiori. Nel complesso, entrambi si correlano approssimativamente in modo uniforme con frequenze irrilevanti (scipy è un po 'peggio), ma pywt "fortunato" con le sue cattive correlazioni compensate con ampiezze wavelet più piccole a scale inferiori, quindi il picco più piccolo.

Non sono esattamente sicuro del motivo per cui il ricalcolo diretto di scipy è peggiore del ricampionamento di pywt; Direi che il problema di risoluzione con un numero molto limitato di campioni all'inizio e il ricampionamento integrato funziona meglio (è anche leggermente più lungo), ma non ho indagato in modo esplicito.

Per ulteriori valutazioni su scale basse pywt vs scipy, vedere la sezione in basso. Il resto della risposta serve a giustificare il verdetto, ma non aggiunge molto di più; il più informativo è la Fig. 2. Viene fornito del codice che può essere riutilizzato per testare altre trasformazioni.


Un tipo più ingenuo di norma indica la risposta; media zero + coefficienti di scala tra$[-1,1]$ per scala:

Per la trama superiore, a $[0,1]$-rescale è equivalente, quindi mostra la forza di correlazione normalizzata con il wavelet indipendentemente dall'energia (in realtà non proprio; avvertimento1). Ciò suggerisce che la differenza sia radicata nelle ampiezze wavelet ; confrontiamo. (- codice coeffs3 )


Si correlano in modo diverso? - Per tutti i grafici, blu = scipy, arancione = pywt.

Scala standardizzata : dividere ognivettore di scala per il proprio massimo (la più alta correlazione assoluta tra tutti i timeshift ). Traccia il valore assoluto di ogni vettore di scala, in modo che si sposti lungo l'orizzontale. Un valore maggiore in un dato timeshift indica una maggiore correlazione della scala tracciata rispetto a tutti gli altri timeshift su quella scala .

  • Sopra mostra le prime scale di Scipy che hanno correlazioni comparabili a ciascuna scala per entrambe le metà del segnale, mentre per pywt la metà destra è dominante.
  • Questo implica che scipy sia correlato più fortemente con frequenze più basse a scale inferiori rispetto a pywt (cioè per la stessa ampiezza wavelet)? Sì ; otterremmo una standardizzazione di scala identica se forzassimo le stesse ampiezze wavelet. Vedere il grafico con equalizzazione dell'ampiezza ingrandito in Fig 2; nota come agli indici 2 e 4 pywt supera scipy, e osserva la gif sopra.

Timeshift standardizzato : dividere ognivettore di timeshift per il proprio massimo (la più alta correlazione assoluta tra tutte le scale ). Traccia il valore assoluto di ogni vettore di scala, in modo che si sposti lungo l'orizzontale. Un valore maggiore in un dato timeshift indica una maggiore correlazione della scala tracciata rispetto a tutte le altre scale nel timeshift .

  • Sopra mostra, per la metà sinistra, circa la stessa forza di correlazione per tutte le 20 scale rispetto alla scala di correlazione più forte. La metà destra oscilla molto di più per entrambi, ma scipy si mantiene multipla sopra pywt. Ciò implica che la maggior parte della discrepanza energetica a queste scale è dovuta alla metà destra.
  • Ma perché a causa della metà destra? E perché la metà sinistra è relativamente fissa? Figura 1; verso scale più alte (frequenze più basse, metà sinistra), scipy e pywt concordano in ampiezza e forma wavelet.

Confronto delle ampiezze wavelet

Invece di guardare all'ampiezza massima, definisco una misura di "ampiezza media": media del valore assoluto di wavelet tagliata di coda, dove "coda" = qualsiasi absval 1e7 volte inferiore all'ampiezza di picco (invece di zero strettamente che è più raro). Questo per sbloccare la media per le wavelet con coda lunga: (- codice2 )

left  = [i for i, v in enumerate(x)       if abs(v) > x.max() / 1e7][0]
right = [i for i, v in enumerate(x[::-1]) if abs(v) > x.max() / 1e7][0]
meanamp = np.mean(np.abs(x[left:-(right + 1)]))

A scales[0], il rapporto è 2,58 - quando si quadratura per le energie, è un coefficiente x6,64 maggiore per scipy a causa della sola differenza di ampiezza delle wavelet. Tuttavia, il rapporto tra le energie dei coefficienti a quella scala è 8,33, quindi c'è un altro fattore - e questo fattore è, sicuramente, la più forte correlazione di Scipy con la parte a bassa frequenza del segnale, come mostrato in precedenza.

Per vedere quanto rappresenta esattamente l'ampiezza, possiamo normalizzarlo; coefficienti di scala in base al rapporto delle ampiezze (medie):

Vediamo per la maggior parte delle scale inferiori le energie di Scipy maggiori anche se si tiene conto dell'ampiezza, lasciando solo la forza di correlazione come fonte della differenza. Interessante anche vedere pywt correlare molto più fortemente alla prima modalità vera (~ scala 50).


Avvertenza 1: la Fig. 0 è fuorviante

Si noti che lo scipy salta sopra pywt sul bordo destro, tuttavia, se guardiamo alle ampiezze medie della scala logaritmica, quella di pywt è sia maggiore, sia correlata più forte secondo il diagramma normato dall'ampiezza. Qual è l'accordo? Ricordare come è stato definito il grafico standardizzato in scala; questo è lo stesso, ma ora per i coefficienti: i vettori di scala vengono ridimensionati rispetto a se stessi , piuttosto che tra pywt e scipy.

Un valore maggiore in Fig 0 risulta se la maggior parte dei punti non è molto al di sotto del massimo (poiché tutti i punti sono divisi per max) nei timeshift, o se il wavelet sulla scala è correlato in modo più coerente per ogni timeshift. Quindi è più una misura di coerenza ; ecco l'ultima scala, mostrata per ogni timeshift:


Quindi ... pywt è meglio a scale inferiori? - Incerto, ma pywt vince in due importanti casi di test:

Frequenza massima più alta

Segnale di frequenza rumoroso e combinato