CWT a escalas bajas: PyWavelets vs Scipy

Oct 07 2020

Las escalas bajas son posiblemente las más difíciles de implementar debido a las limitaciones en las representaciones discretizadas. Comparación detallada aquí ; la principal diferencia está en cómo manejan las dos ondículas en cada escala :

  • pywt : diffde int_psi remuestreado en cada escala, autonormalizado ( advertencia2 );int_psi == cumsum(psi)
  • scipy : wavelet recalculado y explícitamente normalizado en cada escala

(Para pywt no es exactamente diff(int_psi), pero el comportamiento clave es equivalente) A continuación, los gráficos comparan los CWT de morlet real y complejo para una señal de transición nítida; todos los coeficientes estaban normalizados en L1.

No obtuve mucho de inspeccionar las formas de las respectivas ondas (azul = recalculado, naranja = remuestreo, ambos reescalados de -1 a 1):

Entonces, cual es el trato? ¿Me estoy perdiendo algo en las diferencias de discretización, o el enfoque de wavelet integrado de pywt es superior para escalas más bajas (si es así, por qué)?

Respuestas

OverLordGoldDragon Oct 09 2020 at 04:17

Veredicto : Concluyo que el pico más alto más a la izquierda de scipy se debe a la menor amplitud de las wavelets de pywt en escalas más bajas y a la correlación más fuerte de las wavelets de scipy con frecuencias más bajas en escalas más bajas. En general, ambos se correlacionan aproximadamente uniformemente con frecuencias irrelevantes (scipy es un poco peor), pero pywt "tiene suerte" con sus malas correlaciones compensadas con amplitudes de ondas más pequeñas en escalas más bajas, por lo tanto, el pico más pequeño.

No estoy exactamente seguro de por qué el recálculo directo de scipy es peor que el remuestreo de pywt; Yo diría que el problema de resolución con un número muy limitado de muestras desde el principio, y el remuestreo integrado funciona mejor (también es un poco más largo), pero no se ha investigado explícitamente.

Para una evaluación adicional en escalas bajas pywt vs scipy, vea la sección inferior. El resto de la respuesta sirve para justificar el veredicto, pero no agrega mucho más; la más informativa es la Fig. 2. Se proporciona algún código, que puede reutilizarse para probar otras transformaciones.


Un tipo de norma más ingenua apunta a la respuesta; media cero + coeficientes de escala entre$[-1,1]$ por escala:

Para la trama superior, un $[0,1]$-rescale es equivalente, por lo que muestra la fuerza de correlación normalizada con la ondícula independientemente de la energía (en realidad no del todo; advertencia1). Esto sugiere que la diferencia se basa en amplitudes de ondículas ; comparemos. (- coeff código3 )


¿Se correlacionan de manera diferente? - Para todas las parcelas, azul = scipy, naranja = pywt.

Escala estandarizada : divida cadavector de escala por su propio máximo (correlación absoluta más alta entre todos los cambios de tiempo ). Trace el valor absoluto de cada vector de escala, por lo que el tiempo se desplaza a lo largo de la horizontal. Un valor mayor en un cambio de tiempo determinado indica una mayor correlación de la escala trazada con respecto a todos los demás cambios de tiempo en esa escala .

  • Arriba se muestra que las primeras escalas de scipy tienen correlaciones comparables en cada escala para ambas mitades de la señal, mientras que para pywt la mitad derecha es dominante.
  • ¿Esto implica que scipy se correlaciona más fuertemente con frecuencias más bajas en escalas más bajas que pywt (es decir, para la misma amplitud de ondícula)? Si ; obtendríamos una estandarización de escala idéntica si forzáramos las mismas amplitudes de ondas. Véase el gráfico de amplitud ecualizada ampliada en la figura 2; observe cómo en los índices 2 y 4 pywt supera a scipy, y observe el gif anterior.

Timeshift-estandarizado : divida cadavector de Timeshift por su propio máximo (correlación absoluta más alta entre todas las escalas ). Trace el valor absoluto de cada vector de escala, por lo que el tiempo se desplaza a lo largo de la horizontal. Un valor mayor en un intervalo de tiempo determinado indica una mayor correlación de la escala trazada en relación con todas las demás escalas en el intervalo de tiempo .

  • Arriba se muestra, para la mitad izquierda, aproximadamente la misma fuerza de correlación para las 20 escalas en relación con la escala de correlación más fuerte. La mitad derecha fluctúa mucho más para ambos, pero scipy se mantiene en múltiplos por encima de pywt. Esto implica que la mayor parte de la discrepancia de energía en estas escalas se debe a la mitad derecha.
  • ¿Pero por qué debido a la mitad derecha? ¿Y por qué la mitad izquierda está relativamente fija? Figura 1; hacia escalas más altas (frecuencias más bajas, mitad izquierda), scipy y pywt concuerdan tanto en amplitud como en forma de ondas.

Comparación de amplitudes de ondas

En lugar de mirar la amplitud máxima, defino una medida de "amplitud media": media del valor absoluto de la ondícula recortada por la cola, donde "cola" = cualquier valor absoluto 1e7 veces menor que la amplitud máxima (en lugar de estrictamente cero, que es más raro). Esto es para eliminar el sesgo de la media para wavelets con colas largas: (- código2 )

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

En scales[0], la relación es 2.58 - cuando se eleva al cuadrado las energías, ese es un coeficiente x6.64 mayor para scipy debido a la diferencia de amplitudes de las ondas solo. Sin embargo, la relación de las energías de los coeficientes en esa escala es 8,33, por lo que hay otro factor, y este factor es, seguramente, la correlación más fuerte de scipy con la parte de baja frecuencia de la señal, como se mostró anteriormente.

Para ver cuánto representa exactamente la amplitud, podemos normalizarlo; Coeficientes de escala por razón de amplitudes (medias):

Vemos que para la mayoría de las escalas más bajas, las energías de scipy son mayores incluso teniendo en cuenta la amplitud, dejando solo la fuerza de correlación como fuente de diferencia. También es interesante ver que pywt se correlaciona mucho más fuertemente en el primer modo verdadero (~ escala 50).


Advertencia 1: la figura 0 es engañosa

Observe el salto scipy por encima de pywt en el borde derecho, sin embargo, si miramos las amplitudes medias de la escala logs, la de pywt es mayor y se correlaciona más fuerte según la gráfica de amplitud normalizada. ¿Cual es el trato? Recuerde cómo se definió el diagrama de escala estandarizada; esto es lo mismo, pero ahora para los coeficientes: los vectores de escala se reescalan en relación con ellos mismos , en lugar de entre pywt y scipy.

Se obtiene un valor mayor en la figura 0 si la mayoría de los puntos no están muy por debajo del máximo (ya que todos los puntos están divididos por el máximo) en los cambios de tiempo, o si la ondícula en la escala se correlaciona de manera más consistente para cada cambio de tiempo. Entonces es más una medida de consistencia ; aquí está la última escala, que se muestra para cada cambio de tiempo:


Entonces ... ¿pywt es mejor en escalas más bajas? - Incierto, pero pywt gana en dos casos de prueba importantes:

Frecuencia máxima más alta

Señal de frecuencia combinada ruidosa