A Transformação rápida de Fourier realiza operações , enquanto a Transformação rápida de wavelet realiza O ( N ) . Mas o que, especificamente, o FWT calcula?
Embora muitas vezes sejam comparados, parece que o FFT e o FWT são maçãs e laranjas. Pelo que entendi, seria mais apropriado comparar o STFT (FFTs de pequenos pedaços ao longo do tempo) com o complexo Morlet WT , uma vez que ambas são representações de frequência de tempo baseadas em sinusóides complexos (por favor, corrija-me se estiver errado ) Isso geralmente é mostrado com um diagrama como este:
( Outro exemplo )
A esquerda mostra como o STFT é um monte de FFTs empilhados uns sobre os outros à medida que o tempo passa (essa representação é a origem do espectrograma ), enquanto a direita mostra o WD diádico, que tem melhor resolução de tempo em altas frequências e melhor frequência resolução em frequências baixas (essa representação é chamada de escalograma ). Neste exemplo, para o STFT é o número de colunas verticais (6) e uma única operação O ( N log N ) FFT calcula uma única linha de N coeficientes de N amostras. O total é de 8 FFTs de 6 pontos cada, ou 48 amostras no domínio do tempo.
O que eu não entendo:
Quantos coeficientes calcula uma única operação FWT e onde eles estão localizados no gráfico de tempo-frequência acima?
Quais retângulos são preenchidos por uma única computação?
Se calcularmos um bloco de área igual de coeficientes de frequência de tempo usando ambos, obteremos a mesma quantidade de dados?
O FWT ainda é mais eficiente que o FFT?
Exemplo concreto usando PyWavelets :
In [2]: dwt([1, 0, 0, 0, 0, 0, 0, 0], 'haar')
Out[2]:
(array([ 0.70710678, 0. , 0. , 0. ]),
array([ 0.70710678, 0. , 0. , 0. ]))
Ele cria dois conjuntos de 4 coeficientes, portanto, é o mesmo que o número de amostras no sinal original. Mas qual é a relação entre esses 8 coeficientes e os blocos no diagrama?
Atualizar:
Na verdade, eu provavelmente estava fazendo isso errado e deveria estar usando wavedec()
, o que faz uma decomposição DWT em vários níveis:
In [4]: wavedec([1, 0, 0, 0, 0, 0, 0, 0], 'haar')
Out[4]:
[array([ 0.35355339]),
array([ 0.35355339]),
array([ 0.5, 0. ]),
array([ 0.70710678, 0. , 0. , 0. ])]