CWT em escalas baixas: PyWavelets vs Scipy

Oct 07 2020

Escalas baixas são indiscutivelmente as mais desafiadoras de implementar devido às limitações nas representações discretizadas. Comparação detalhada aqui ; a principal diferença é como os dois lidam com wavelets em cada escala :

  • pywt : diffde int_psi reamostrado em cada escala, autonormalizado ( caveat2 );int_psi == cumsum(psi)
  • scipy : wavelet recomputado e explicitamente normalizado em cada escala

(Para pywt não é exatamente diff(int_psi), mas o comportamento chave é equivalente) Abaixo os gráficos comparam CWTs reais e complexos de morlet para um sinal de transição abrupto; todos os coeficientes foram normalizados para L1.

Não obtive muito inspecionando as formas das respectivas wavelets (azul = recalculado, laranja = reamostrado, ambos redimensionados de -1 para 1):

Qual é o problema? Estou perdendo algo nas diferenças de discretização ou a abordagem de wavelet integrada de pywt é superior para escalas inferiores (em caso afirmativo, por quê)?

Respostas

OverLordGoldDragon Oct 09 2020 at 04:17

Veredicto : Concluo que o pico mais à esquerda de scipy se deve à menor amplitude das wavelets de pywt em escalas mais baixas e à correlação mais forte das wavelets de scipy com frequências mais baixas em escalas mais baixas. No geral, ambos se correlacionam de maneira aproximadamente uniforme com frequências irrelevantes (scipy sendo um pouco pior), mas pywt "ganha" com suas correlações ruins sendo compensadas com amplitudes de wavelet menores em escalas mais baixas, portanto, o pico menor.

Não tenho certeza de por que a recomputação direta de scipy é pior do que a reamostragem de pywt; Eu diria que o problema de resolução com um número muito limitado de amostras no início e a reamostragem integrada está funcionando melhor (também é um pouco mais longa), mas não investiguei explicitamente.

Para avaliação adicional em escalas baixas pywt vs scipy, consulte a seção inferior. O resto da resposta serve para justificar o veredicto, mas não acrescenta muito mais; a mais informativa é a Fig. 2. Algum código é fornecido, que pode ser reutilizado para testar outras transformações.


Um tipo mais ingênuo de norma aponta para a resposta; média zero + coeficientes de escala entre$[-1,1]$ por escala:

Para o enredo superior, um $[0,1]$-rescale é equivalente, portanto, mostra a força de correlação normalizada com a wavelet, independentemente da energia (na verdade, não exatamente; advertência 1). Isso sugere que a diferença está enraizada nas amplitudes das ondas ; vamos comparar. (- código de coeficientes3 )


Eles se correlacionam de forma diferente? - Para todos os gráficos, blue = scipy, orange = pywt.

Padronizado por escala : divida cadavetor de escala por seu máximo (correlação absoluta mais alta entre todos os timeshifts ). Plote o valor absoluto de cada vetor de escala, de modo que as mudanças de tempo na horizontal. Um valor maior em um determinado timeshift indica maior correlação da escala traçada com relação a todos os outros timeshift nessa escala .

  • Acima mostra as primeiras escalas de scipy com correlações comparáveis ​​em cada escala para ambas as metades do sinal, enquanto para pywt a metade direita é dominante.
  • Isso implica que scipy se correlaciona mais fortemente com frequências mais baixas em escalas mais baixas do que pywt (ou seja, para a mesma amplitude de wavelet)? Sim ; obteríamos padronização de escala idêntica se forçássemos as amplitudes das ondas iguais. Veja o gráfico com equalização de amplitude ampliada na Fig 2; observe como nos índices 2 e 4 pywt excede scipy e observe o GIF acima.

Padronizado por timeshift : divida cadavetor timeshift pelo seu máximo (correlação absoluta mais alta entre todas as escalas ). Plote o valor absoluto de cada vetor de escala, de modo que as mudanças de tempo na horizontal. Um valor maior em um determinado timeshift indica maior correlação da escala plotada em relação a todas as outras escalas no timeshift .

  • Acima mostra, para a metade esquerda, aproximadamente a mesma força de correlação para todas as 20 escalas em relação à escala de correlação mais forte. A metade direita flutua muito mais para ambos, mas scipy se mantém múltiplos acima de pywt. Isso significa que a maior parte da discrepância de energia nessas escalas se deve à metade direita.
  • Mas por que devido à metade direita? E por que a metade esquerda está relativamente fixa? Figura 1; em direção a escalas mais altas (frequências mais baixas, metade esquerda), scipy e pywt concordam tanto na amplitude quanto na forma da wavelet.

Comparação de amplitudes wavelet

Em vez de olhar para a amplitude máxima, defino uma medida de "amplitude média": média do valor absoluto da wavelet aparada na cauda, ​​onde "cauda" = qualquer absval 1e7 vezes menor que a amplitude de pico (em vez de estritamente zero, que é mais raro). Isso serve para desviar a média para wavelets com caudas longas: (- code2 )

left  = [i for i, v in enumerate(x)       if abs(v) > x.max() / 1e7][0]
right = [i for i, v in enumerate(x[::-1]) if abs(v) > x.max() / 1e7][0]
meanamp = np.mean(np.abs(x[left:-(right + 1)]))

Em scales[0], a razão é 2,58 - ao elevar ao quadrado para as energias, é um coeficiente x6,64 maior para scipy devido apenas à diferença de amplitudes da wavelet. No entanto, a proporção das energias dos coeficientes nessa escala é de 8,33, então há outro fator - e esse fator é, certamente, a correlação mais forte de scipy com parte de baixa frequência do sinal, como mostrado anteriormente.

Para ver quanto exatamente a amplitude representa, podemos normalizar por ela; coeficientes de escala por razão de amplitudes (médias):

Vemos para a maioria das escalas mais baixas as energias de scipy maiores, mesmo com a amplitude considerada, deixando apenas a força de correlação como a fonte da diferença. Também é interessante ver a correlação de pywt com muito mais força no primeiro modo verdadeiro (~ escala 50).


Advertência 1: a Fig. 0 é enganosa

Observe o salto de scipy acima de pywt na borda direita, mas, se olharmos para as amplitudes médias da escala logarítmica, o pywt é maior e se correlaciona mais forte de acordo com o gráfico com amplitude normal. Qual é o problema? Lembre-se de como o gráfico padronizado em escala foi definido; isso é o mesmo, mas agora para os coeficientes - os vetores de escala são redimensionados em relação a eles mesmos , em vez de entre pywt e scipy.

Um valor maior na Fig 0 resulta se a maioria dos pontos não estiver muito abaixo do máximo (já que todos os pontos são divididos pelo máximo) em timeshift, ou se a wavelet na escala se correlaciona mais consistentemente para cada timeshift. Portanto, é mais uma medida de consistência ; aqui está a última escala, mostrada para cada timeshift:


Então ... pywt é melhor em escalas mais baixas? - Incerto, mas pywt vence em dois casos de teste importantes:

Maior frequência máxima

Sinal de frequência combinada barulhento