.

Traduzir

quarta-feira, 17 de julho de 2013

Parte 1. Um breve Tutorial de análise Wavelet (Ondeleta), usando Python.


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')

 


Share
PDF Download    Enviar artigo em PDF   

Parte 1. Um breve Tutorial de análise Wavelet (Ondeleta), usando Python.

Nenhum comentário:

Postar um comentário