# Transformada discreta de wavelet

A transformada wavelet discreta é a transformada correspondente à transformada contínua de wavelet para funções discretas. Esta transformada é utilizada para analisar sinais digitais, e também na compressão de imagens digitais. A forma mais simples dessa transformada, conhecida como transformada de Haar foi criada em 1909.
A transformada discreta de wavelet consiste em identificar os parâmetros $c_{k}$ e $d_{j,k}$,$k\in \mathbb {N} ,j\in \mathbb {N}$ da equação: $f(t)=\sum _{k=-\infty }^{\infty }{c_{k}\phi (t-k)}+\sum _{k=-\infty }^{\infty }{\sum _{j=0}^{\infty }{d_{j,k}\psi (2^{j}t-k)}},$
onde $\phi (t)$ e $\psi (t)$ são as funções conhecidas respectivamente como wavelet pai (do inglês father wavelet) e wavelet mãe (ver wavelet para mais detalhes sobre a função wavelet mãe). A wavelet pai é na verdade uma função de escala, que depende da wavelet mãe. Das funções $\phi (t)$ e $\psi (t)$ podemos calcular as seqüências $h=\{h_{n}\}_{n\in \mathbb {Z} }$ e $g=\{g_{n}\}_{n\in \mathbb {Z} }$:
    $h_{n}=\langle \psi _{0,0},\,\phi _{1,n}\rangle$ e $\psi (t)={\sqrt {2}}\sum _{n\in \mathbb {Z} }h_{n}\phi (2t-n)$
e
    $g_{n}=\langle \phi _{0,0},\,\phi _{1,n}\rangle$ e $\phi (t)={\sqrt {2}}\sum _{n\in \mathbb {Z} }g_{n}\phi (2t-n)$.
Estas duas seqüências são a base da transformada discreta de wavelet.

## Bancos de filtros

A maneira mais comum de se calcular a transformada discreta de wavelet é através da aplicação de bancos de filtros onde o filtro determinado pelos coeficientes $h=\{h_{n}\}_{n\in \mathbb {Z} }$ corresponde a um filtro passa-altas e o filtro $g=\{g_{n}\}_{n\in \mathbb {Z} }$ a um filtro passa-baixas (conforme imagem ao lado).
Os filtros $h$ e $g$ são operadores lineares, que podem ser aplicados no sinal digital de entrada $x$ como uma convolução:
$c(n)=\sum \limits _{k}g(k)x(n-k)=g\star x$
e
$d(n)=\sum \limits _{k}h(k)x(n-k)=h\star x.$
O sinal $c(n)=\{c_{n}\}_{n\in \mathbb {Z} }$ é conhecido como aproximação e o sinal $d(n)=\{d_{n}\}_{n\in \mathbb {Z} }$ como diferença ou detalhe.

### Sub-amostragem

O operador $(\downarrow 2)$ é o operador de sub-amostragem (do inglês downsampling). Este operador aplicado a uma função discreta (uma seqüência) reduz o seu número de elementos pela metade, recuperando apenas os elementos em posições pares:
$(\downarrow 2)x(n)={x_{0},x_{2},x_{4},...}.\,$
O uso de filtros ortogonais nos permite recuperar o sinal original (reconstrução perfeita do sinal) apesar da perda de dados devido à sub-amostragem. Filtros bi-ortogonais também são capazes de reconstruir perfeitamente o sinal mesmo após a sub-amostragem.

### Encadeamento de bancos de filtros

A decomposição com o filtro acima decompõe o sinal em apenas duas faixas de freqüência. Podemos encadear uma série de bancos de filtros, usando a operação de sub-amostragem para proporcionar a divisão da freqüência de amostragem por 2 (como visto na figura ao lado) a cada novo banco de filtros encadeado.
Assim, temos um sinal de detalhe específico para cada faixa de freqüência na nossa etapa de análise do sinal.

## Transformada inversa

A transformada discreta inversa de wavelet consiste em aplicar os filtros inversos no sinal decomposto, e juntar novamente as duas (ou mais) bandas de freqüência do sinal. No caso dos filtros ortogonais, os filtros inversos $h'$ e $g'$ podem ser obtidos como:
* o filtro $g'$ é o reverso do filtro $g$ (filtro $g$ com os coeficientes invertidos):
    $g'=(g'_{1},g'_{2},...,g'_{N})=(g_{N},g_{N}-1,...,g_{1}).$
* o filtro $h'$ é igual ao filtro $g$ com os sinais dos elementos pares invertidos:
    $h'=(h'_{1},h'_{2},...,h'_{n},...,h'_{N})=(g_{1},-g_{2},...,(-1)^{n+1}g_{n},...,(-1)^{N+1}g_{N}).$
Antes de se recompor o sinal, entretanto, é necessário aplicar o operador de super-amostragem $(\uparrow 2)$ nas seqüências decompostas $h'$ e $d'$.

### Super-amostragem

O operador de super-amostragem (do inglês upsampling) que usamos na transformada inversa corresponde simplesmente a acrescentar zeros nas posições que foram eliminadas pela sub-amostragem:
$(\uparrow 2)s=(s'_{1},s'_{2},s_{3},...,s'_{2N-1},s'_{2N})=(s_{1},0,s_{2},...,s_{N},0)$

## Exemplo de implementação

Abaixo um exemplo de implementação em python da transformada discreta de wavelet usando bancos de filtros: