1. Introdução
Ao realizar a análise CWT usando a biblioteca PyWavelets (um software de código aberto gratuito lançado sob a licença MIT), há problemas com a visualização do resultado. O
programa de teste de visualização proposto pelos desenvolvedores é mostrado na lista a seguir:
Listagemimport 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())
Ao trabalhar com wavelets complexas, por exemplo com 'cmor1-1.5', o programa produz um erro:
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
Esse erro, além de dificuldades na escolha da escala (larguras) para fornecer a resolução de tempo necessária, dificulta, principalmente para usuários iniciantes, o estudo da análise CWT, o que me levou a escrever este artigo de natureza educacional.
O objetivo desta publicação é considerar o uso do novo
módulo de visualização do
escalograma para a análise de sinais simples e especiais, bem como ao usar métodos de normalização, escala logarítmica e síntese, que fornecem informações adicionais na análise de séries temporais.
O artigo utilizou informações da publicação
“Uma introdução suave à wavelet para análise de dados” . Nas listagens de exemplos mostrados na publicação, os erros são corrigidos e cada listagem do exemplo é trazida para sua forma finalizada, o que permite usá-lo sem se familiarizar com os anteriores. Para análise wavelet de sinais especiais, foram utilizados dados do banco de dados de
amostras PyWavelets.
Um escalograma de wavelet é uma representação bidimensional de dados unidimensionais. O tempo é plotado no eixo X e uma escala é mostrada no eixo Y - o resultado da transformação wavelet do sinal correspondente à amplitude do sinal no tempo X. O valor analítico de uma exibição gráfica do sinal é que a resolução do tempo é exibida no eixo Y, o que fornece informações adicionais sobre as propriedades dinâmicas do sinal.
Wavelet - Escalogramas simples de sinais
1. Onda cosseno com um envelope gaussiano (substituindo wavelets. Você pode estudar a dependência da resolução do tempo na escala):
Listagem from numpy import* from pylab import* import scaleogram as scg import pywt
Função wavelet para conversão de sinal: cmor1-1.5 (wavelets complexas de Morlet)


O sinal periódico aparece agora como uma faixa contínua horizontal no ponto Y = p1, cuja intensidade varia dependendo da amplitude do sinal periódico.
Há alguma imprecisão na detecção, uma vez que a largura de banda não é igual a zero, isso se deve ao fato de as wavelets não detectarem uma frequência, mas sim uma banda. Esse efeito está associado à largura de banda da wavelet.
2. Três pulsos são adicionados seqüencialmente com um período crescente (para considerar variações periódicas em diferentes escalas: análise de resolução múltipla):
Listagem from numpy import* import pandas as pd from pylab import* import scaleogram as scg


Os impulsos aparecem no local esperado Y, correspondendo à sua periodicidade, estão localizados em frequência e tempo. O começo da tira e o fim correspondem ao pulso.
A largura de banda é escalada com a duração do período. Essa é uma propriedade bem conhecida da transformação wavelet: quando a escala aumenta, a resolução do tempo diminui. Isso também é conhecido como o compromisso entre tempo e frequência. Quando você olha para um espectrograma desse tipo, faz muita análise de resolução.
3. Três oscilações periódicas de diferentes frequências ao mesmo tempo (Wavelet - a análise é capaz de distinguir componentes de sinal por frequências se suas diferenças forem significativas):
Listagem from numpy import* import pandas as pd from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


4. Sinal periódico não sinusoidal (Considera-se a diferença nas transformações de wavelets de um sinal de onda triangular com um período de 30 segundos em relação aos considerados anteriormente):
Listagem from numpy import* from pylab import* import scipy.signal import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Uma banda grande é o primeiro harmônico. O segundo harmônico é visível exatamente pela metade do valor do período do primeiro harmônico. Este é o resultado esperado para sinais não sinusoidais periódicos. Elementos verticais nebulosos aparecem ao redor do segundo harmônico, que é mais fraco e tem uma amplitude 1/4 do primeiro para uma forma de onda triangular.
5. Impulsos suaves (gaussianos) são semelhantes a estruturas de dados reais. (Este exemplo mostra como usar a análise wavelet para detectar alterações de sinal localizadas ao longo do tempo):
Uma série de pulsos suaves com diferentes valores de sigma:
Largura de pulso:
Listagem from numpy import* from pylab import* import scaleogram as scg scg.set_default_wavelet('cmor1-1.5')


Pulsos discretos criam estruturas cônicas no sialograma, também conhecidas como cone de influência. Impulsos suaves (gaussianos) são semelhantes a estruturas de dados reais e criam cones expandindo-se em direção a grandes escalas. As linhas de orientação horizontais correspondem aproximadamente a períodos de tempo (2 s, 10 s, 20 s). Portanto, o pulso é semelhante a um sinal periódico com um período.
6. Ruído (exibir ruído no sialograma):
Listagem from numpy import* from pylab import* import scaleogram as scg import random scg.set_default_wavelet('cmor1-1.5')


O ruído geralmente é exibido como um conjunto de elementos e algumas irregularidades podem parecer objetos de dados reais; portanto, ao usar dados reais, você deve ter cuidado e, se necessário, verificar o nível de ruído. A programação superior será diferente cada vez que o programa for iniciado.
Escalogramas Wavelet de Sinais Especiais
O banco de dados PyWavelets contém vinte sinais especiais de transformação de wavelets que serão úteis para estudo e desenvolvimento. Portanto, darei uma lista que permite realizar uma análise wavelet de todos os vinte sinais:
Vou dar apenas um resultado da transformação wavelet do sinal Doppler:


As variedades mais comuns de sinais simples e especiais são consideradas, o que nos permite passar a usar um escalograma para resolver alguns problemas da análise de séries temporais.
Escalogramas da linha do tempo da Wavelet
1. Dados de fertilidade do CDC nos EUA 1969-2008 (os dados de fertilidade contêm características periódicas, tanto em escala anual quanto em menor):
Listagem 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()


Uma linha horizontal aparece com uma frequência de cerca de 7 dias. Valores altos aparecem perto das bordas da escala, que é o comportamento normal do processamento de wavelets. Esses efeitos são conhecidos como cone de influência, e é por isso que uma máscara (opcional) se sobrepõe a essa área.
2. Normalização (a remoção do valor médio -
births_normed = births-births.mean () é obrigatória, caso contrário, os limites dos dados são considerados como estágios que criam muitas detecções falsas em forma de cone):
Listagem 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. Alteração da escala em amplitude (para ver objetos anuais, usando
period2scales (), a escala ao longo do eixo Y é especificada).
Listagem 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()

A faixa de amplitude do mapa de cores (eixo Y) agora é definida por clim = (0,2500). O valor exato da amplitude das oscilações depende da wavelet, mas permanecerá próximo da ordem do valor real. Isso é muito melhor, agora vemos muito bem a variação anual, bem como cerca de 6 meses!
4. Usando a escala logarítmica (Para ver períodos pequenos e grandes ao mesmo tempo, é melhor usar a escala logarítmica no eixo Y. Isso é conseguido usando a opção xscale = log.)
Listagem 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()

O resultado é muito melhor, mas agora os pixels com baixos valores de períodos são alongados ao longo do eixo Y.
5. Distribuição uniforme em uma escala logarítmica (Para obter uma distribuição uniforme em uma escala, os valores do período devem ser distribuídos uniformemente e depois convertidos em valores da escala, conforme mostrado abaixo :):
Listagem 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 mudanças de sinal em todas as escalas. O sialograma mostra todos os anos em períodos iguais.
6. Destaque parte da linha do tempo (verificação de dados intermediários entre as marcas da linha do tempo em busca de artefatos ou dados ausentes.):
Listagem 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()