CWT à basse échelle: PyWavelets vs Scipy
Les échelles basses sont sans doute les plus difficiles à mettre en œuvre en raison des limites des représentations discrétisées. Comparaison détaillée ici ; la principale différence réside dans la manière dont les deux ondelettes gèrent à chaque échelle :
- pywt :
diffdeint_psirééchantillonné à chaque échelle, auto-normalisé (mise en garde2 );int_psi == cumsum(psi) - scipy : ondelette recalculée et explicitement normalisée à chaque échelle
(Pour pywt, ce n'est pas exactement diff(int_psi), mais le comportement des touches est équivalent) Les graphiques ci-dessous comparent les CWT morlet réels et complexes pour un signal de transition net; tous les coefficients étaient normalisés L1.
Je n'ai pas beaucoup profité de l'inspection des formes des ondelettes respectives (bleu = recalculé, orange = rééchantillonné, tous deux redimensionnés de -1 à 1):
Alors, quel est le problème? Est-ce que je manque quelque chose dans les différences de discrétisation, ou l'approche par ondelettes intégrée de pywt est-elle supérieure pour les échelles inférieures (si oui, pourquoi)?
Réponses
Verdict : Je conclus que le pic le plus à gauche de scipy est dû à la plus faible amplitude des ondelettes de pywt à des échelles inférieures et à la corrélation plus forte des ondelettes de scipy avec des fréquences plus basses à des échelles inférieures. Dans l'ensemble, ils sont tous deux en corrélation approximativement égale avec des fréquences non pertinentes (scipy étant un peu pire), mais pywt "perd" avec ses mauvaises corrélations étant compensées avec des amplitudes d'ondelettes plus petites à des échelles inférieures, donc le plus petit pic.
Je ne sais pas exactement pourquoi le recalcul direct de scipy est pire que le rééchantillonnage de pywt; Je dirais un problème de résolution avec un nombre très limité d'échantillons au début et un rééchantillonnage intégré fonctionnant mieux (c'est aussi légèrement plus long), mais je n'ai pas enquêté explicitement.
Pour une évaluation supplémentaire sur pywt vs scipy à faible échelle, voir la section du bas. Le reste de la réponse sert à justifier le verdict, mais n'ajoute rien de plus; le plus informatif est la figure 2. Un certain code est fourni, qui peut être réutilisé pour tester d'autres transformations.
Une sorte de norme plus naïve indique la réponse; moyenne nulle + coeffs d' échelle entre$[-1,1]$ par échelle:
Pour le tracé du haut, un $[0,1]$-rescale est équivalent, donc il montre la force de corrélation normalisée avec l'ondelette indépendamment de l'énergie (en fait pas tout à fait; mise en garde1). Cela suggère la différence à enraciner dans les amplitudes d' ondelettes ; comparons. (- code coeffs3 )
Sont-ils corrélés différemment? - Pour toutes les parcelles, bleu = scipy, orange = pywt.
Échelle standardisée : divisez chaquevecteur d' échelle par son propre maximum (corrélation absolue la plus élevée parmi tous les décalages temporels ). Tracez la valeur absolue de chaque vecteur d'échelle, donc les décalages temporels le long de l'horizontale. Une valeur plus élevée à un décalage temporel donné indique une plus grande corrélation de l'échelle tracée avec par rapport à tous les autres décalages temporels à cette échelle .
- Ci-dessus montre les premières échelles de scipy ayant des corrélations comparables à chaque échelle pour les deux moitiés du signal, alors que pour pywt la moitié droite est dominante.
- Cela implique-t-il que scipy est plus fortement corrélé avec des fréquences plus basses à des échelles plus basses que pywt (c'est-à-dire pour la même amplitude d'ondelettes)? Oui ; nous obtiendrions une standardisation d'échelle identique si nous imposions les mêmes amplitudes d'ondelettes. Voir le tracé égalisé en amplitude agrandi sur la figure 2; notez comment aux indices 2 et 4 pywt dépasse scipy, et observez le gif ci-dessus.
Timeshift standardisé : divisez chaquevecteur de décalage temporel par son propre maximum (corrélation absolue la plus élevée parmi toutes les échelles ). Tracez la valeur absolue de chaque vecteur d'échelle, donc les décalages temporels le long de l'horizontale. Une valeur plus élevée à un décalage temporel donné indique une plus grande corrélation de l'échelle tracée par rapport à toutes les autres échelles au décalage temporel .
- Ci-dessus montre, pour la moitié gauche, à peu près la même force de corrélation pour les 20 échelles par rapport à l'échelle de corrélation la plus forte. La moitié droite fluctue beaucoup plus pour les deux, mais scipy se maintient des multiples au-dessus de pywt. Cela implique que la majeure partie de la différence d'énergie à ces échelles est due à la moitié droite.
- Mais pourquoi en raison de la moitié droite? Et pourquoi la moitié gauche est-elle relativement fixe? Figure 1; vers des échelles plus élevées (basses fréquences, moitié gauche), scipy et pywt s'accordent à la fois dans l'amplitude et la forme des ondelettes.
Comparaison des amplitudes des ondelettes
Au lieu de regarder l'amplitude maximale, je définis une mesure de «l'amplitude moyenne»: moyenne de la valeur absolue de l'ondelette taillée en queue, où «queue» = toute absval 1e7 fois inférieure à l'amplitude du pic (au lieu de strictement zéro ce qui est plus rare). Il s'agit de dissocier la moyenne des ondelettes à longues queues: (- code2 )
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)]))
À scales[0], le rapport est de 2,58 - lors de la mise au carré des énergies, c'est un coefficient x6,64 plus grand pour scipy en raison de la seule différence d'amplitudes d'ondelettes. Cependant, le rapport des énergies des coefficients à cette échelle est de 8,33, il y a donc un autre facteur - et ce facteur est sûrement la corrélation plus forte de scipy avec la partie basse fréquence du signal, comme indiqué précédemment.
Pour voir à quel point l'amplitude représente exactement, nous pouvons la normaliser; coefficients d'échelle par rapport des amplitudes (moyennes):
Nous voyons pour la plupart des échelles inférieures les énergies de scipy plus grandes même avec l'amplitude prise en compte, ne laissant que la force de corrélation comme source de différence. Intéressant également de voir pywt corréler beaucoup plus fortement au premier vrai mode (~ échelle 50).
Mise en garde 1: la figure 0 est trompeuse
Remarquez le saut scipy au-dessus de pywt sur le bord droit, mais si nous regardons les amplitudes moyennes à échelle logarithmique, pywt est à la fois plus grand et corrélé plus fort selon le graphique normé en amplitude. Quel est le problème? Rappelez-vous comment le graphique normalisé à l'échelle a été défini; c'est la même chose, mais maintenant pour les coefficients - les vecteurs d'échelle sont redimensionnés par rapport à eux - mêmes , plutôt qu'entre pywt et scipy.
Une valeur plus élevée dans la figure 0 résulte si la plupart des points ne sont pas très en dessous du maximum (car tous les points sont divisés par max) sur les décalages temporels, ou si l'ondelette à l'échelle est corrélée de manière plus cohérente pour chaque décalage temporel. Il s'agit donc davantage d'une mesure de cohérence ; voici la dernière échelle, affichée pour chaque décalage horaire:
Alors ... pywt est mieux à des échelles inférieures? - Incertain, mais pywt gagne dans deux cas de test importants:
Fréquence max plus élevée
Signal de fréquence combiné bruyant