Introduccion
Cuando se realiza un análisis CWT utilizando la biblioteca PyWavelets (un software gratuito de código abierto lanzado bajo la licencia MIT), existen problemas para visualizar el resultado. El
programa de prueba de visualización propuesto por los desarrolladores se muestra en la siguiente lista:
Listadoimport pywt import numpy as np import matplotlib.pyplot as plt t = np.linspace(-1, 1, 200, endpoint=False) sig = np.cos(2 * np.pi * 7 * t) + np.real(np.exp(-7*(t-0.4)**2)*np.exp(1j*2*np.pi*2*(t-0.4))) widths = np.arange(1, 31) cwtmatr, freqs = pywt.cwt(sig, widths, 'cmor1-1.5') plt.imshow(cwtmatr, extent=[-1, 1, 1, 31], cmap='PRGn', aspect='auto', vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
Cuando se trabaja con wavelets complejas, por ejemplo con 'cmor1-1.5', el programa produce un error:
File"C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\image.py", line 642, in set_data raise TypeError("Image data cannot be converted to float") TypeError: Image data cannot be converted to float
Este error, así como las dificultades para elegir la escala (anchos) para proporcionar la resolución de tiempo necesaria, dificultan, especialmente para los usuarios novatos, estudiar el análisis de CWT, lo que me llevó a escribir este artículo de naturaleza educativa.
El propósito de esta publicación es considerar el uso del nuevo
módulo de visualización de
escalagrama para el análisis de señales simples y especiales, así como cuando se utilizan métodos de normalización, escalamiento logarítmico y síntesis, que proporcionan información adicional en el análisis de series de tiempo.
El artículo utilizó información de la publicación
"Una introducción suave a wavelet para el análisis de datos" . En los listados de ejemplos dados en la publicación, los errores se corrigen y cada listado del ejemplo se lleva a su forma final, lo que le permite usarlo sin familiarizarse con los anteriores. Para el análisis wavelet de señales especiales, se utilizaron datos de la base de datos de
muestra PyWavelets.
Un escalograma wavelet es una representación bidimensional de datos unidimensionales. El tiempo se traza en el eje X, y se muestra una escala en el eje Y, el resultado de la transformada wavelet de la señal correspondiente a la amplitud de la señal en el tiempo X. El valor analítico de tal visualización gráfica de la señal es que la resolución del tiempo se muestra en el eje Y, que proporciona información adicional sobre las propiedades dinámicas de la señal.
Wavelet - Escalogramas de señal simple
1. Onda cosenoidal con una envoltura gaussiana (Reemplazo de wavelets. Puede estudiar la dependencia de la resolución del tiempo en la escala)
Listado from numpy import* from pylab import* import scaleogram as scg import pywt
Función wavelet para conversión de señal: cmor1-1.5 (wavelets complejas de Morlet)


La señal periódica ahora aparece como una franja continua horizontal en el punto Y = p1, cuya intensidad varía según la amplitud de la señal periódica.
Hay algo de confusión en la detección, ya que el ancho de banda no es igual a cero, esto se debe al hecho de que las wavelets no detectan una frecuencia, sino más bien una banda. Este efecto está asociado con el ancho de banda de wavelet.
2. Se agregan tres pulsos secuencialmente con un período creciente (para considerar variaciones periódicas a diferentes escalas: análisis de resolución múltiple):
Listado from numpy import* import pandas as pd from pylab import* import scaleogram as scg


Los impulsos aparecen en el lugar esperado Y, correspondiente a su periodicidad, se localizan en frecuencia y tiempo. El comienzo de la tira y el final corresponden al impulso.
El ancho de banda se escala con la duración del período. Esta es una propiedad bien conocida de la transformada wavelet: cuando la escala aumenta, la resolución del tiempo disminuye. Esto también se conoce como el equilibrio entre tiempo y frecuencia. Cuando miras un espectrograma de este tipo, haces muchos análisis de resolución.
3. Tres oscilaciones periódicas de diferentes frecuencias al mismo tiempo (Wavelet: el análisis puede distinguir los componentes de la señal por frecuencia, si sus diferencias son significativas):
Listado from numpy import* import pandas as pd from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


4. Una señal periódica no sinusoidal (se considera la diferencia en las transformaciones de wavelet de una señal de onda triangular con un período de 30 segundos de las consideradas anteriormente):
Listado from numpy import* from pylab import* import scipy.signal import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Una banda grande es el primer armónico. El segundo armónico es visible exactamente a la mitad del valor del período del primer armónico. Este es el resultado esperado para señales periódicas no sinusoidales. Aparecen elementos verticales difusos alrededor del segundo armónico, que es más débil y tiene una amplitud de 1/4 del primero para una forma de onda triangular.
5. Los impulsos suaves (gaussianos) son similares a las estructuras de datos reales. (Este ejemplo muestra cómo usar el análisis wavelet para detectar cambios de señal localizados a lo largo del tiempo):
Una serie de pulsos suaves con diferentes valores sigma:
Ancho de pulso:
Listado from numpy import* from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Los pulsos discretos crean estructuras cónicas en el sialograma, que también se conocen como el cono de influencia. Los impulsos suaves (gaussianos) son similares a las estructuras de datos reales y crean conos que se expanden hacia grandes escalas. Las líneas de guía horizontales corresponden aproximadamente a períodos de tiempo (2 s, 10 s, 20 s). Por lo tanto, el pulso es similar a una señal periódica con un período.
6. Ruido (ruido de pantalla en el sialograma):
Listado from numpy import* from pylab import* import scaleogram as scg import random scg.set_default_wavelet('cmor1-1.5')


El ruido generalmente se muestra como un conjunto de elementos, y algunas irregularidades pueden parecer objetos de datos reales, por lo que al usar datos reales, debe tener cuidado y, si es necesario, verificar el nivel de ruido. El horario superior será diferente cada vez que se inicie el programa.
Escalogramas Wavelet de Señales Especiales
La base de datos PyWavelets contiene veinte señales especiales de transformación wavelet que serán útiles tanto para el estudio como para el desarrollo. Por lo tanto, le daré una lista que le permite realizar un análisis wavelet de las veinte señales:
Solo daré un resultado de la transformada wavelet de la señal Doppler:


Se consideran las variedades más comunes de señales simples y especiales, lo que nos permite pasar a usar un escalograma para resolver algunos problemas de análisis de series temporales.
Escalogramas de línea de tiempo de wavelet
1. Datos de fertilidad de los CDC en los Estados Unidos 1969-2008 (los datos de fertilidad contienen características periódicas, tanto en una escala anual como en una más pequeña):
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()


Aparece una línea horizontal con una frecuencia de aproximadamente 7 días. Los valores altos aparecen cerca de los bordes de la escala, que es el comportamiento normal del procesamiento de wavelets. Estos efectos son bien conocidos como un cono de influencia, por lo que una máscara (opcional) se superpone a esta área.
2. Normalización (Eliminar el valor promedio -
births_normed = births-births.mean () es obligatorio, de lo contrario, los límites de datos se consideran etapas que crean muchas detecciones falsas en forma de cono):
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

3. Cambio de escala en amplitud (para ver objetos anuales, usando
period2scales () se especifica
la escala a lo largo del eje Y).
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

El rango de amplitud del mapa de color (eje Y) ahora se establece mediante clim = (0.2500). El valor exacto de la amplitud de oscilación depende de la wavelet, pero permanecerá cerca del orden del valor real. Esto es mucho mejor, ahora vemos muy bien la variación anual, ¡así como alrededor de 6 meses!
4. Uso de la escala logarítmica (para poder ver períodos pequeños y grandes al mismo tiempo, es mejor usar la escala logarítmica en el eje Y. Esto se logra usando la opción xscale = log).
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

El resultado es mucho mejor, pero ahora los píxeles en valores bajos de períodos se alargan a lo largo del eje Y.
5. Distribución uniforme en una escala logarítmica (para obtener una distribución uniforme en una escala, los valores del período deben distribuirse uniformemente y luego convertirse a valores de escala, como se muestra a continuación :):
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

Podemos ver cambios de señal en todas las escalas. El sialograma muestra cada año en períodos iguales.
6. Resaltando parte de la línea de tiempo (Comprobación de datos intermedios entre las marcas de la línea de tiempo en busca de artefactos o datos faltantes):
Listado import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()


, , - , :
import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()


, :
7. ( , ):
import pandas as pd import numpy as np from pylab import* import scaleogram as scg import pywt from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()

CWT :
, , ;
80- , , ;
— . 3 1 , , . ;
1 . , , .
:
, . , , CWT .
. CWT — , .
, , . – , , mexh gaus5. 1 :


PS :
>>> import scaleogram; print(scaleogram .__version__) 0.9.5 >>> import pandas; print(pandas .__version__) 0.24.1 >>> import numpy; print(numpy .__version__) 1.16.1 >>> import matplotlib; print(matplotlib .__version__) 3.0.2
*.csv ( ):
year,month,day,gender,births
1969,1,1,F,4046
1969,1,1,M,4440
1969,1,2,F,4454
1969,1,2,M,4548
...
0.24.1 pandas matplotlib.
:
from pandas.plotting import register_matplotlib_converters register_matplotlib_converters()