Extracción / reducción de características usando DWT

7

Para una serie de tiempo dada que tiene n marcas de tiempo de longitud, podemos tomar la Transformación discreta de wavelets (usando wavelets 'Haar'), luego obtenemos (por ejemplo, en Python):

>>> import pywt
>>> ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]
>>> (ca, cd) = pywt.dwt(ts,'haar')
>>> ca
array([ 41.01219331,  17.67766953,   4.94974747,  44.54772721,
        12.02081528,  47.37615434,   3.53553391,   5.65685425])
>>> cd
array([-38.18376618, -13.43502884,  -0.70710678,  34.64823228,
        -0.70710678,  14.8492424 ,  -2.12132034,   2.82842712])

donde ca y cd son aproximaciones y coeficientes detallados. Ahora, si los uso todos, puedo construir mi serie de tiempo original usando DWT inverso. Pero, en cambio, quiero usar menos coeficientes (como en la Transformada de Fourier si usamos solo los primeros coeficientes, podemos reconstruir aproximadamente la serie de tiempo original). Si solo uso cao simplemente uso cd, no obtengo los resultados deseados. Si uso solo los coeficientes we de cada uno de ellos (como los primeros 4), obtengo solo la mitad de las series de tiempo.

¿Cómo debo seleccionar los coeficientes (de cay cd) para poder crear aproximadamente la señal original a partir de ellos (es decir, la mayor parte de su energía)?

lo más duro
fuente

Respuestas:

9

Creo que es similar a un umbral suave y duro que se usa en la eliminación de ruido de ondículas. ¿Te has topado con este tema? pywtya tiene una función incorporada para este propósito. Eche un vistazo más de cerca a este código e intente jugar con él:

import pywt
import matplotlib.pyplot as plt
import numpy as np

ts = [2, 56, 3, 22, 3, 4, 56, 7, 8, 9, 44, 23, 1, 4, 6, 2]

(ca, cd) = pywt.dwt(ts,'haar')

cat = pywt.thresholding.soft(ca, np.std(ca)/2)
cdt = pywt.thresholding.soft(cd, np.std(cd)/2)

ts_rec = pywt.idwt(cat, cdt, 'haar')

plt.close('all')

plt.subplot(211)
# Original coefficients
plt.plot(ca, '--*b')
plt.plot(cd, '--*r')
# Thresholded coefficients
plt.plot(cat, '--*c')
plt.plot(cdt, '--*m')
plt.legend(['ca','cd','ca_thresh', 'cd_thresh'], loc=0)
plt.grid('on')

plt.subplot(212)
plt.plot(ts)
plt.hold('on')
plt.plot(ts_rec, 'r')
plt.legend(['original signal', 'reconstructed signal'])
plt.grid('on')
plt.show()

Esto producirá seguimiento, espero que esto te guíe.

ingrese la descripción de la imagen aquí

Nota sobre la ejecución del código con las últimas versiones:

si obtiene un error como este:

el módulo 'pywt' no tiene el atributo 'umbral'

uso en la línea 9 y 10:

 cat = pywt.threshold(ca, np.std(ca)/2, mode='soft')
 cdt = pywt.threshold(cd, np.std(cd)/2, mode='soft')

si obtiene un error en:

plt.hold ('on') luego comenta esta línea:

  # plt.hold('on')
jojek
fuente
@theharshest: Me alegra escuchar eso. ¡Buena suerte!
jojek