Um grupo da National Oceanography Centre (NOC) da Universidade de Southampton desenvolve um pacote para análise de coerência Wavelet (Ondeletas) em Matlab (http://noc.ac.uk/using-science/crosswavelet-wavelet-coherence). Como eu queria usar esse pacote, mas não tinha o menor interesse em usar o Matlab, eu acabei desenvolvendo uma API que permite usar as saídas desse pacote em um programa escrito em python. A página do meu projeto pode ser acessada em http://duducosmos.github.io/PIWavelet/. Basicamente o que fiz foi rodar o pacote original em Matlab no octave 3.6, os resultados obtidos são passados para um array python e assim vai.
A ideia aqui é fazer um breve tutorial sobre Wavelets e, dado dois conjuntos de sinal, como medir o grau de relação entre os dois.
Tradicionalmente o que se faz é, dado, por exemplo, dois conjuntos de dados, buscar qual a correlação linear entre eles. Mas fica a questão, e se a relação entre os dados não for linear? E se essa relação muda com o tempo?
Uma ferramente recente para resolver tais questões, em particular para análise de séries temporais, é o uso de Wavelets e da técnica de coerência, que mede o grau de relação entre os sinais ao longo do tempo.
Wavelet (Ondeleta)
A Wavelet, ou ondeleta em português, é uma função com média zero e que é definida em frequência e tempo. Pode se caracterizar a ondeleta pelo modo como ela se localiza no espaço de tempo e de frequência. Aqui vale ressaltar que de acordo com o princípio de incerteza de Heisenberg que sempre existirá uma incerteza intrínseca em o quão pequeno pode ser a banda de tempo e frequência.
Uma ondeleta particular é a de Morlet, a qual é definida como:
\(\psi_{0}(\eta)=\pi^{-1/4}e^{i\omega_{0}\eta}e^{-\frac{1}{2}\eta^{2}}\) (1)
sendo \(\omega_{0}\) a frequencia adimensional e \(\eta\) o tempo adimensional.
Transformação contínua de ondeleta
A ideia da transformação contínua de ondeleta (Continuous Wavelet Transform - CWT) está em aplicar a ondeleta como um filtro passa bandas em uma série temporal. A ondeleta sofre estreitamento no tempo variando sua escala ( \(s\) ), tal que \(\eta=s.t\) , sendo que sua normalização tem unidade de energia. A CWT de uma função \(f\) é definida pela transformação integral:
\(\Psi(a,b) = \int_{-\infty}^{\infty}f(u)\psi^{*}_{a,b}(u)du\) , para \(a>0\) . (2)
Sendo:
\(\psi^{*}_{a,b}(u) = \frac{1}{a}\psi\left(\frac{u-b}{a}\right)\) (3)
representa uma família de funções wavelets, chamada de wavelet mãe. O parâmetro $a$ refere-se a escala, $b$ é a translação ou parâmetro de localização da wavelet mãe e \(\psi^{*}_{a,b}(u)\) é o complexo conjugado de \(\psi_{a,b}(u)\) .
Exemplo e uso do código:
No exemplo abaixo é gerado um sinal aleatório. Esse dado é normalizado e em seguida se gera o gráfico da CTW desse sinal.
import numpy as np
import matplotlib.pyplot as plt
from piwavelet import piwavelet
y1 = np.random.rand(50) #Generation of the Random Signal
y1 = (y1-y1.mean())/y1.std() #Normalization of the Signal 1
wave, scales, freqs, coi, fft, fftfreqs=piwavelet.cwt(y1) # If you want to know the individual properties.'
piwavelet.plotWavelet(y1,title='test',label='Random Signal',units='days')
Na figura abaixo está a imagem resultante.
Decifrando o código:
Primeiramente são importados os módulos a serem usados
import numpy as np
import matplotlib.pyplot as plt
from piwavelet import piwavelet
Aqui é gerado uma série de dados aleatória
y1 = np.random.rand(50) #Generation of the Random Signal
O dado é normalizado de forma que é subtraída a média do mesmo e dividido pelo desvio padrão
y1 = (y1-y1.mean())/y1.std() #Normalization of the Signal 1
Finalmente são obtidos a CTW, a escala, a frequência, o cone de influência, a transformada de Fourrier (TF) do sinal e a frequências da TF.
wave, scales, freqs, coi, fft, fftfreqs=piwavelet.cwt(y1) # If you want to know the individual properties.'
piwavelet.plotWavelet(y1,title='test',label='Random Signal',units='days')
Parte 1. Um breve Tutorial de análise Wavelet (Ondeleta), usando Python.
Nenhum comentário:
Postar um comentário