[PYTHON] Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire

Il existe différents types d'ondelettes bi-orthogonales, mais cette fois nous trouverons le coefficient d'échelle de l'ondelette de Cohen-Daubechies-Feauveau **.

Bibliothèque à utiliser

Nous utiliserons sympy pour calculer le facteur d'échelle en mode interactif de Python.

Réglage de précision

sympy utilise mpmath pour l'arithmétique à virgule flottante de précision arbitraire. La précision par défaut (le nombre de bits dans la partie formelle) est 53, ce qui est le même que le nombre à virgule flottante double précision, définissez-le donc à environ 256 selon le cas.

Terminal


>>> import sympy
>>> sympy.mpmath.mp.prec
53
>>> sympy.mpmath.mp.prec = 256

Affacturage par méthode DKA

Définissez $ N = 4 $ pour trouver la solution de l'équation suivante.

q(y) =
\sum_{k=0}^{N-1}
\begin{pmatrix}
N-1+k \\
k
\end{pmatrix}
y^k = 0

La description spécifique est la suivante.

q(y) = 20y^3 + 10y^2 + 4y + 1 = 0

Terminal


>>> qy = [sympy.mpmath.binomial(4-1+k,k) for k in [3,2,1,0]]
>>> qy
[mpf('20.0'), mpf('10.0'), mpf('4.0'), mpf('1.0')]

Comme il s'agit d'une équation cubique, il est possible de trouver une solution exacte avec la formule de Cardano, mais comme il suffit d'obtenir le coefficient d'échelle avec un nombre à virgule flottante, méthode DKA E2% 80% 93Kerner_method) est utilisé.

Terminal


>>> y = sympy.mpmath.polyroots(qy)
>>> y
[mpf('-0.3423840948583691316993036540027816871936619136844427977504078911201017562570965'), mpc(real='-0.07880795257081543415034817299860915640316904315777860112479605443994912187145069', imag='0.3739306454336101226089715992265723406258901629829692932753904369966748441011043'), mpc(real='-0.07880795257081543415034817299860915640316904315777860112479605443994912187145069', imag='-0.3739306454336101226089715992265723406258901629829692932753904369966748441011043')]

Puisqu'une solution réelle et deux solutions complexes conjuguées peuvent être obtenues, $ q (y) $ peut être décomposé en le produit de l'équation linéaire obtenue à partir de la solution réelle et de l'équation quadratique obtenue à partir de la solution complexe conjuguée.

Coefficient d'échelle

Créez $ h_0 (z) $ en utilisant une solution réelle. Définissez $ y = - (1/4) z + (1/2) - (1/4) z ^ {-1} $ et ajustez pour que $ h_0 (1) = \ sqrt {2} $ Je vais le laisser.

Terminal


>>> h0z = sympy.sympify('-sqrt(2.0)*(y-y0)/y0') \
...            .subs({'y':'-1/4*z+1/2-1/4/z', 'y0':y[0]})
>>> h0z
-1.032622122063015088779015687939062566223023943573534440451244148644675318677*z + 3.479457806499125323032653234616953582887408360779881380902488297289350637353 - 1.032622122063015088779015687939062566223023943573534440451244148644675318677/z

Appliquez des moments de fuite pour créer $ h (z) $.

h(z) = z^{-2} \left( \frac{1+z}{2} \right)^4 h_0(z)

Terminal


>>> hz = (sympy.sympify('z**(-2)*((z+1)/2)**4')*h0z).expand()
>>> hz
-0.06453888262893844304868848049619141038893899647334590252820275929029220741729*z**3 - 0.04068941760955843950521309482120604262529296334464102380640551858058441483457*z**2 + 0.4180922732222122294173439451808985229992791148815490275282027592902922074173*z + 0.7884856164056644517477371190118263104712661635056882976128110371611688296691 + 0.4180922732222122294173439451808985229992791148815490275282027592902922074173/z - 0.04068941760955843950521309482120604262529296334464102380640551858058441483457/z**2 - 0.06453888262893844304868848049619141038893899647334590252820275929029220741729/z**3

Retirez le coefficient.

Terminal


>>> scaling_coeff = [hz.coeff('z',k) for k in [-3,-2,-1,0,1,2,3]]
>>> scaling_coeff
[-0.06453888262893844304868848049619141038893899647334590252820275929029220741729, -0.04068941760955843950521309482120604262529296334464102380640551858058441483457, 0.4180922732222122294173439451808985229992791148815490275282027592902922074173, 0.7884856164056644517477371190118263104712661635056882976128110371611688296691, 0.4180922732222122294173439451808985229992791148815490275282027592902922074173, -0.04068941760955843950521309482120604262529296334464102380640551858058441483457, -0.06453888262893844304868848049619141038893899647334590252820275929029220741729]
n h[n]
0 0.7884856164056644517477371190118263104713
-1,+1 0.4180922732222122294173439451808985229993
-2,+2 -0.04068941760955843950521309482120604262529
-3,+3 -0.06453888262893844304868848049619141038894
-4,+4 0.0

Coefficient de mise à l'échelle double

Créez $ \ tilde {h_0} (z) $ en utilisant une paire de solutions complexes conjuguées. Mettez $ y = - (1/4) z + (1/2) - (1/4) z ^ {-1} $ puis $ \ tilde {h_0} (1) = \ sqrt {2} $ Je vais l'ajuster pour cela.

Terminal


>>> d_h0z = sympy.sympify('sqrt(2.0)*(y-y1)/y1*(y-y2)/y2') \
...              .subs({'y':'-1/4*z+1/2-1/4/z', 'y1':y[1], 'y2':y[2]})
>>> d_h0z
(-0.353553390593274*z + 0.818558056535050389640616746751093460160688904372839526463833807943026504668 - 0.5288177901591365145695624730424192033800671915517564410974157359390278433361*I - 0.353553390593274/z)*(-z/4 + 0.5788079525708154341503481729986091564031690431577786011247960544399491218714 + 0.3739306454336101226089715992265723406258901629829692932753904369966748441011*I - 1/(4*z))/((-0.07880795257081543415034817299860915640316904315777860112479605443994912187145 - 0.3739306454336101226089715992265723406258901629829692932753904369966748441011*I)*(-0.07880795257081543415034817299860915640316904315777860112479605443994912187145 + 0.3739306454336101226089715992265723406258901629829692932753904369966748441011*I))

Appliquez le moment de fuite pour créer $ \ tilde {h} (z) $.

\tilde{h}(z) = z^{-2} \left( \frac{1+z}{2} \right)^4 \tilde{h_0}(z)

Terminal


>>> d_hz = (sympy.sympify('z**(-2)*((z+1)/2)**4')*d_h0z).expand()
>>> d_hz
0.03782845550699546397896088239109810588598928919558903883377596750890210864563*z**4 - 0.02384946501938000354347538567498536776364603312870487872179724070970779258271*z**3 - 0.1106244044184234045317958917055274640064847218822291494893245217456879810963*z**2 + 1.848054221112700632088327353557561911770062193154051589356698864673908481848e-78*I*z**2 + 0.3774028556126537624098752472272712265473030007883118118671540106333915390923*z - 0.00000000000000001776744107070853984299687632133069137868739252186023273178181181386681671503*I*z + 0.852698679009403501358319120148908609110388988411630399468592427310915899508 + 7.392216884450802528353309414230247647080248772616206357426795458695633927391e-78*I + 0.3774028556126537624098752472272712265473030007883118118671540106333915390923/z - 0.00000000000000001776744107070853984299687632133069137868739252186023273178180811775837448963*I/z - 0.1106244044184234045317958917055274640064847218822291494893245217456879810963/z**2 + 1.848054221112700632088327353557561911770062193154051589356698864673908481848e-78*I/z**2 - 0.02384946501938000354347538567498536776364603312870487872179724070970779258271/z**3 + 0.03782845550699546397896088239109810588598928919558903883377596750890210864563/z**4

Retirez le coefficient. Puisque la partie imaginaire est pratiquement 0, seule la partie réelle est utilisée.

Terminal


>>> d_scaling_coeff = [sympy.re(d_hz.coeff('z',k)) for k in [-4,-3,-2,-1,0,1,2,3,4]]
>>> d_scaling_coeff
[0.03782845550699546397896088239109810588598928919558903883377596750890210864563, -0.02384946501938000354347538567498536776364603312870487872179724070970779258271, -0.1106244044184234045317958917055274640064847218822291494893245217456879810963, 0.3774028556126537624098752472272712265473030007883118118671540106333915390923, 0.8526986790094035013583191201489086091103889884116303994685924273109158995080, 0.3774028556126537624098752472272712265473030007883118118671540106333915390923, -0.1106244044184234045317958917055274640064847218822291494893245217456879810963, -0.02384946501938000354347538567498536776364603312870487872179724070970779258271, 0.03782845550699546397896088239109810588598928919558903883377596750890210864563]
n h~[n]
0 0.8526986790094035013583191201489086091104
-1,+1 0.3774028556126537624098752472272712265473
-2,+2 -0.1106244044184234045317958917055274640065
-3,+3 -0.02384946501938000354347538567498536776365
-4,+4 0.03782845550699546397896088239109810588599

Coefficient d'ondelettes

Le coefficient d'ondelette $ g_n $ est le signe inversé de tout autre coefficient de double échelle $ \ tilde {h} _n $.

Terminal


>>> wavelet_coeff = [s*(-1)**k for k,s in zip([-4,-3,-2,-1,0,1,2,3,4], d_scaling_coeff)]
>>> wavelet_coeff
[0.03782845550699546397896088239109810588598928919558903883377596750890210864563, 0.02384946501938000354347538567498536776364603312870487872179724070970779258271, -0.1106244044184234045317958917055274640064847218822291494893245217456879810963, -0.3774028556126537624098752472272712265473030007883118118671540106333915390923, 0.8526986790094035013583191201489086091103889884116303994685924273109158995080, -0.3774028556126537624098752472272712265473030007883118118671540106333915390923, -0.1106244044184234045317958917055274640064847218822291494893245217456879810963, 0.02384946501938000354347538567498536776364603312870487872179724070970779258271, 0.03782845550699546397896088239109810588598928919558903883377596750890210864563]
n g[n]
0 0.8526986790094035013583191201489086091104
-1,+1 -0.3774028556126537624098752472272712265473
-2,+2 -0.1106244044184234045317958917055274640065
-3,+3 0.02384946501938000354347538567498536776365
-4,+4 0.03782845550699546397896088239109810588599

Coefficient d'ondelettes double

Le coefficient d'ondelettes double $ \ tilde {g} _n $ est l'inversion de tout autre coefficient de mise à l'échelle $ h_n $.

Terminal


>>> d_wavelet_coeff = [s*(-1)**k for k,s in zip([-3,-2,-1,0,1,2,3], scaling_coeff)]
>>> d_wavelet_coeff
[0.06453888262893844304868848049619141038893899647334590252820275929029220741729, -0.04068941760955843950521309482120604262529296334464102380640551858058441483457, -0.4180922732222122294173439451808985229992791148815490275282027592902922074173, 0.7884856164056644517477371190118263104712661635056882976128110371611688296691, -0.4180922732222122294173439451808985229992791148815490275282027592902922074173, -0.04068941760955843950521309482120604262529296334464102380640551858058441483457, 0.06453888262893844304868848049619141038893899647334590252820275929029220741729]
n g~[n]
0 0.7884856164056644517477371190118263104713
-1,+1 -0.4180922732222122294173439451808985229993
-2,+2 -0.04068941760955843950521309482120604262529
-3,+3 0.06453888262893844304868848049619141038894
-4,+4 0.0

Dessiner avec un algorithme en cascade

Vous pouvez trouver la valeur approximative de la fonction de mise à l'échelle avec l'algorithme en cascade. cdf_9_7_scaling.png cdf_9_7_wavelet.png

Les références

Recommended Posts

Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment calculer la volatilité d'une marque
Comment trouver la zone du diagramme de Boronoi
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
[Ubuntu] Comment supprimer tout le contenu du répertoire
Comment trouver le nombre optimal de clusters pour les k-moyennes
Comment connecter le contenu de la liste dans une chaîne de caractères
Comment trouver la quantité moyenne d'informations (entropie) de la distribution de probabilité d'origine à partir de l'échantillon
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
[NNabla] Comment supprimer le niveau intermédiaire d'un réseau prédéfini
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Comment vérifier la version de Django
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné
Comment mettre un numéro de ligne au début d'un fichier CSV
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Trouver la main de "Millijan" par l'optimisation des combinaisons
Comment trouver la corrélation pour les variables catégorielles
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
[NNabla] Comment obtenir la sortie (variable) de la couche intermédiaire du réseau construit
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
[python] Comment trier par le Nth Mth élément d'un tableau multidimensionnel
[Numpy, scipy] Comment calculer la racine carrée d'une matrice Elmeet à valeur semi-régulière
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Lire la source Python-Markdown: Comment créer un analyseur
Comment connaître le numéro de port du service xinetd
Comment écrire une interface graphique à l'aide de la commande maya
Comment obtenir le nombre de chiffres en Python
Remarques sur l'utilisation d'AIST Spacon ABCI
Un mémo pour comprendre visuellement l'axe des pandas.
Comment créer un sous-menu avec le plug-in [Blender]
La décision de scikit-learn Comment visualiser un modèle en bois
Comment écrire un type liste / dictionnaire de Python3
Étapes pour calculer la probabilité d'une distribution normale
[Blender] Comment définir dynamiquement les sélections EnumProperty
Bases de PyTorch (2) -Comment créer un réseau de neurones-
[Python] Résumé de la façon de spécifier la couleur de la figure
Comment frapper le document de Magic Function (Line Magic)
Comment accéder à la variable globale du module importé
Comment publier un ticket depuis l'API Shogun
[Selenium] Comment spécifier le chemin relatif de chromedriver?
Note Python: Le mystère de l'attribution d'une variable à une variable
Comment afficher la date de modification d'un fichier en langage C jusqu'à nanosecondes
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Je ne trouve pas l'horloge tsc! ?? L'histoire d'essayer d'écrire un patch de noyau
[Ruby] Comment remplacer uniquement une partie de la chaîne de caractères correspondant à l'expression régulière?
Comment vérifier en Python si l'un des éléments d'une liste est dans une autre liste
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
L'explication la plus simple au monde sur la création de LINE BOT (1) [Account preparation]