Sie sind auf Seite 1von 156

Tratamiento de Señales Digitales

Mediante Wavelets y su

Uso con MATLAB

Félix Martínez Giménez


Alfredo Peris Manguillot
Francisco Rodenas Escribá

Valencia 2004
Tratamiento de señales digitales mediante wavelets y su uso con Matlab

© Félix Martínez Giménez


Alfredo Peris Manguillot
Francisco Rodenas Escribá

ISBN: 978–84–9948–628–4

e-book v.1.0

ISBN edición en Papel: 978-84-8454-387-9

Edita: Editorial Club Universitario. Telf.: 96 567 61 33


C/. Cottolengo, 25 – San Vicente (Alicante)
www.ecu.fm

Maqueta y diseño: Gamma. Telf.: 965 67 19 87


C/. Cottolengo, 25 – San Vicente (Alicante)
www.gamma.fm
gamma@gamma.fm

Reservados todos los derechos. Ni la totalidad ni parte de este libro puede


reproducirse o transmitirse por ningún procedimiento electrónico o mecánico, incluyendo
fotocopia, grabación magnética o cualquier almacenamiento de información o siste ma
de reproducción, sin permiso previo y por escrito de los titulares del Copyright.
Prólogo

Las wavelets proporcionan un conjunto de herramientas flexible para proble-


mas prácticos en ciencia e ingeniería. En la última década se han aplicado con
éxito al análisis de señales en disciplinas tan diversas como la medicina, la
ingeniería eléctrica, teledetección y muchas otras. Una de las principales vir-
tudes de las wavelets es que permiten modelar mejor procesos que dependen
fuertemente del tiempo y para los cuales su comportamiento no tiene porqué
ser suave. La transformada wavelet resulta especialmente eficiente para extraer
información de señales no periódicas o de vida finita. Otra de las ventajas de
dicha transformada frente a otros métodos es el de poder disponer de una am-
plia familia de wavelets, lo cual permite tratar señales de diversa índole. La
elección de la wavelet dependerá del tipo de señal que analicemos.
Algunos de los principales problemas que afectan al tratamiento de señales
e imágenes digitales, y en los que las wavelets constituyen una potente herra-
mienta para afrontarlos, son la reducción del ruido (en señales de audio y en
imágenes), la compresión de señales (de vital importancia tanto en la transmi-
sión de grandes cantidades de datos como en su almacenamiento) o la detección
de determinados objetos en imágenes o irregularidades locales en ciertos tipos
de señales (electrocardiogramas, vibraciones de motores, etc.). Esta moderna
teoría ha experimentado un gran desarrollo en las dos últimas décadas mos-
trándose muy eficiente donde otras técnicas, como por ejemplo la transformada
rápida de Fourier, no resultaban satisfactorias. En esta última se maneja una
base de funciones bien localizada en frecuencia pero no en tiempo, mientras
que la mayoría de las wavelets interesantes presentan una buena localización en
tiempo y en frecuencia, disponiendo incluso de bases de wavelets con soporte
compacto.
Este texto se centra fundamentalmente en la transformada wavelet discre-
ta. Esta transformada está íntimamente ligada al análisis de multirresolución,

iii
iv

formulado por Mallat a finales de los 80, y facilita su computación rápida cuan-
do la familia de wavelets es ortogonal. La transformada wavelet discreta es una
transformación de la señal que la divide en dos tipos de subseñales, la tendencia
y las fluctuaciones. La tendencia viene a ser una copia de la señal a menor reso-
lución y las fluctuaciones almacenan información referida a los cambios locales
en la señal original. La tendencia y las fluctuaciones más significativas permi-
ten una compresión de la señal a cambio de descartar información irrelevante
y de la eliminación del ruido producido por los aparatos y las condiciones de
medida. Según el tipo de medición realizada el ruido correspondiente se com-
porta matemáticamente siguiendo distribuciones de probabilidad gaussianas,
uniformes... El estudio de las fluctuaciones permite detectar anomalías o dis-
funciones en el comportamiento esperado de la señal inicial. También permite
la comparación con patrones para detectar formas en una imagen o una señal
unidimensional de forma automática. El nuevo formato de JPEG2000 basa la
compresión de imágenes en la transformada wavelet.
La mayor parte de las familias de wavelets que utilizaremos son ortogonales,
los cual nos permite una transformada inversa de fácil computación, y tan
rápida como la transformada directa.
No existe una transformada wavelet única, ni que resuelva todos los pro-
blemas, a partir del modelado del proceso y de un análisis a priori del tipo
de señal tratada y del objetivo que se pretenda (compresión, eliminación del
ruido, segmentación de la imagen,...) se busca la familia de wavelets (Haar,
Daubechies, Coiflets,...) que mejor coincida con las características de la señal
a estudiar.
El tratamiento con wavelets discretas permite su aplicación directa a pro-
cesos computacionales. Las wavelets continuas presentan por una parte la difi-
cultad de su manejo al tener que evaluar un gran número de integrales y tener
en consecuencia una redundancia de información, pero por otra parte permiten
la flexibilidad de poder adaptarse a situaciones en las que las discretas no dan
un resultado satisfactorio. Concretamente en el tratamiento de imágenes digi-
tales se precisa realzar detalles y detectar texturas analizando la imagen desde
distintos ángulos, lo cual es posible con las wavelets continuas al disponer de
un mayor número de parámetros que posteriormente se pueden discretizar para
su tratamiento computacional. Además la transformada wavelet continua, al
proveer una alta resolución temporal y espectral en el espacio transformado,
permite observar aspectos sutiles no estacionarios que pueden ser obviados en
la transformada discreta, lo cual compensa el mayor coste computacional.
v

Este texto es el resultado de la impartición de la asignatura “Tratamiento de


señales e imágenes digitales mediante wavelets”, durante los cursos 2001/2002 y
2002/2003, en el marco del Centro de Formación de Postgrado de la Universitat
Politècnica de València, como Curso de Formación Específica que versaría sobre
el uso de las wavelets para el tratamiento de señales e imágenes digitales. El
público al que iba dirigido estaba fundamentalmente formado por ingenieros y
estudiantes de tercer ciclo de la Universitat Politècnica de València.
Este curso pretende ser una introducción al tratamiento de señales me-
diante wavelets. Los prerrequisitos necesarios son poco exigentes y se reducen
a conocimientos básicos de algebra lineal y cálculo. El objetivo del curso es
claramente práctico y por esa razón se incluyen en el texto (en los apéndices
finales) ejercicios y aplicaciones. Para la realización de los ejercicios prácti-
cos se usó el software comercial “Wavelet Toolbox for MATLAB”. Las rutinas
de este paquete se ejecutan en el entorno matemático de computación MAT-
LAB y por lo tanto también necesita estar instalado en nuestro sistema. En
la red se pueden encontrar otros paquetes alternativos de libre distribución
(como SCILAB) que el lector puede utilizar, bajo los cuales se podrán realizar
los ejercicios propuestos si lo desea pero será necesario traducir las órdenes y
rutinas descritas al nuevo entorno que se esté utilizando.
El texto se estructura en capítulos y apéndices. Los capítulos están dedi-
cados a la exposición teórica de los conceptos y los apéndices son fundamen-
talmente prácticos.
El capítulo 2 se dedica a la explicación básica de la teoría de wavelets
unidimensionales tomando el caso concreto de la wavelet de Haar. Muchas
de las ideas desarrolladas en este capítulo para este tipo de wavelets serán
utilizadas en capítulos posteriores. También se introducen algunas nociones
básicas sobre compresión de señales.
En el capítulo 3 se introducen otras wavelets ortogonales como las de Dau-
bechies y las Coiflets, estudiando sus propiedades fundamentales.
En el capítulo 4 se profundiza en las técnicas de compresión de señales y
de eliminación de ruido blanco. Se abordan también cuestiones importantes a
tener en cuenta en compresión como la cuantización y la entropía.
Los dos últimos capítulos están dedicados a wavelet packets y a la trans-
formada wavelet continua.
Como se ha indicado anteriormente el objetivo de la segunda parte del
texto es la visualización práctica de las técnicas basadas en wavelets para el
tratamiento de señales. Estas prácticas se realizan con el paquete “Wavelet
vi

Toolbox for MATLAB” que se ejecuta dentro del entorno MATLAB. Por esta
razón el apéndice A se dedica a dar unos conceptos básicos sobre el uso del
programa MATLAB y de la “Wavelet Toolbox for MATLAB”.
El apéndice B contiene la mayoría de los ejercicios que se proponen para
su resolución de forma paralela al estudio del texto. En algunos se incluye
el código MATLAB para su resolución e incluso se aportan imágenes con los
resultados.
El último apéndice C pretende ofrecer al lector un pequeño repertorio de
ejemplos y aplicaciones de tratamiento de señales con wavelets. La mayoría
de estas aplicaciones han sido tomadas de el paquete “Wavelet Toolbox for
MATLAB” y se utilizan señales que se distribuyen con el citado paquete.
Los autores agradecen la financiación del Proyecto Interdisciplinar “La
Transformada Wavelet en el Tratamiento de Señales e Imágenes Digitales” den-
tro del programa INNOVA, por el Vicerrectorada de Investigación, Desarrollo
e Innovación de la Universitat Politècnica de València (c.e. 20020629).

Valencia, julio de 2004

Los autores
Índice Abreviado

Prólogo iii

Índice Abreviado vii

Índice General ix

Índice de figuras xiii

Índice de códigos para MATLAB xv

1 Introducción a las Wavelets y prerrequisitos 1

2 Wavelets de Haar 7

3 Familias de wavelets ortogonales 23

4 Compresión de señales y reducción de ruido 41

5 Wavelet packets 51

6 La transformada wavelet continua 55

A MATLAB y la “Wavelet Toolbox” 63

B Ejercicios 79

C Ejemplos y aplicaciones 125

Bibliografía 137

vii
Índice general

Prólogo iii

Índice Abreviado vii

Índice general ix

Índice de figuras xiii

Índice de códigos para MATLAB xv

1 Introducción a las Wavelets y prerrequisitos de álgebra lineal 1

2 Wavelets de Haar 7
2.1 Scaling y wavelets . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Análisis de multirresolución (MRA) . . . . . . . . . . . . . . . . 12
2.3 Transformada de Haar . . . . . . . . . . . . . . . . . . . . . . . 16

3 Familias de wavelets ortogonales 23


3.1 Wavelets de Daubechies . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1 Daubechies db2 . . . . . . . . . . . . . . . . . . . . . . . 23
Conceptos básicos . . . . . . . . . . . . . . . . . . . . . 23
Característica de las fluctuaciones pequeñas . . . . . . . 27
3.1.2 Daubechies db3 . . . . . . . . . . . . . . . . . . . . . . . 29
Conceptos básicos . . . . . . . . . . . . . . . . . . . . . 29
Característica de las fluctuaciones pequeñas . . . . . . . 31
3.1.3 Daubechies dbJ . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 Coiflets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3 Transformada de Fourier discreta y MRA . . . . . . . . . . . . 34

ix
x

4 Compresión de señales y reducción de ruido 41


4.1 Cuantización y umbralizado . . . . . . . . . . . . . . . . . . . . 42
4.2 Codificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.3 Medidas de la aproximación . . . . . . . . . . . . . . . . . . . . 49

5 Wavelet packets 51

6 La transformada wavelet continua 55

A MATLAB y la “Wavelet Toolbox” 63


A.1 MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
A.1.1 Breve (muy breve) introducción . . . . . . . . . . . . . . 63
A.1.2 Representación de señales . . . . . . . . . . . . . . . . . 64
Datos en un fichero ASCII . . . . . . . . . . . . . . . . . 65
Datos creados a partir de una función . . . . . . . . . . 66
A.2 La “Wavelet Toolbox” . . . . . . . . . . . . . . . . . . . . . . . 68
A.2.1 Wavelets 1-D desde la línea de comandos (primeros pasos) 68
A.2.2 Wavelets 1-D desde el entorno gráfico (primeros pasos) . 74
A.3 Programando algunas funciones en MATLAB . . . . . . . . . . 75

B Ejercicios 79
B.1 Transformada de Haar de una señal . . . . . . . . . . . . . . . . 79
B.2 Compresión de señales (primeros pasos) . . . . . . . . . . . . . 80
B.3 Otras wavelets ortogonales: Daubechies y Coiflets . . . . . . . . 85
B.4 Dibujando wavelets and scaling . . . . . . . . . . . . . . . . . . 88
B.5 Compresión de señales y cuantización . . . . . . . . . . . . . . . 92
B.6 Reducción del ruido en una señal . . . . . . . . . . . . . . . . . 98
B.6.1 Comportamiento del ruido blanco a través de una trans-
formada wavelet . . . . . . . . . . . . . . . . . . . . . . 98
B.6.2 Reducción del ruido en una señal . . . . . . . . . . . . . 100
B.7 Transformada de Fourier Discreta . . . . . . . . . . . . . . . . . 105
B.7.1 “Fast Fourier Transform” . . . . . . . . . . . . . . . . . . 105
B.7.2 El espectro de señales wavelets y scaling . . . . . . . . . 108
B.7.3 Análisis de frecuencias y transformada wavelet . . . . . 110
B.8 Detección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
B.9 Wavelets packets . . . . . . . . . . . . . . . . . . . . . . . . . . 120
B.9.1 Analizando una señal . . . . . . . . . . . . . . . . . . . . 120
B.9.2 Comprimiendo la señal . . . . . . . . . . . . . . . . . . . 120
xi

B.9.3 Reducción de ruido . . . . . . . . . . . . . . . . . . . . . 121


B.10 Transformada wavelet continua . . . . . . . . . . . . . . . . . . 121
B.10.1 Transformada wavelet continua desde la línea de comandos121
B.10.2 Transformada wavelet continua en el entorno gráfico . . 123

C Ejemplos y aplicaciones 125


C.1 Detección de “breakdown points” . . . . . . . . . . . . . . . . . 125
C.1.1 Un cambio en la frecuencia . . . . . . . . . . . . . . . . 125
C.1.2 Evolución a largo tiempo . . . . . . . . . . . . . . . . . 128
C.1.3 Discontinuidad en derivadas . . . . . . . . . . . . . . . . 129
C.2 Identificando frecuencias puras . . . . . . . . . . . . . . . . . . 131
C.3 Análisis de un caso real . . . . . . . . . . . . . . . . . . . . . . 133
C.4 Detección de auto-semejanza (estructura fractal) . . . . . . . . 134

Bibliografía 137
Índice de figuras

1.1 Análisis de multirresolución de una señal . . . . . . . . . . . . . 3

2.1 Tendencia y fluctuación de una señal a nivel 1 . . . . . . . . . . 9


2.2 Tendencia y fluctuación de una señal a niveles 1 y 2 . . . . . . 11
2.3 Análisis de multirresolución de una señal a nivel 2 . . . . . . . 14
2.4 Transformada de Haar y perfiles de energía acumulada . . . . . 19

3.1 Vectores wavelets y scaling para db2 . . . . . . . . . . . . . . . 25


3.2 Vectores wavelets y scaling para coif . . . . . . . . . . . . . . . 34
3.3 Análisis de frecuencias con DFT . . . . . . . . . . . . . . . . . . 36
3.4 Espectros de wavelets y scaling . . . . . . . . . . . . . . . . . . 37
3.5 Análisis de frecuencias con DFT del MRA . . . . . . . . . . . . 38
3.6 Espectros de wavelets y scaling a varios niveles . . . . . . . . . 39

4.1 Eliminación de ruido blanco . . . . . . . . . . . . . . . . . . . . 44


4.2 Transformada wavelet de un ruido blanco gaussiano . . . . . . . 45
4.3 Cuantización de una señal de audio . . . . . . . . . . . . . . . . 49

6.1 Wavelet madre “sombrero mejicano” . . . . . . . . . . . . . . . 57


6.2 Transformada wavelet continua . . . . . . . . . . . . . . . . . . 58
6.3 Espectros sombrero mejicano . . . . . . . . . . . . . . . . . . . 59
6.4 Wavelet madre Morlet . . . . . . . . . . . . . . . . . . . . . . . 60
6.5 Escalograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

A.1 Un ejemplo de plot() . . . . . . . . . . . . . . . . . . . . . . . 66


A.2 Creando una señal . . . . . . . . . . . . . . . . . . . . . . . . . 67
A.3 Tendencia y fluctuación de una señal . . . . . . . . . . . . . . . 69
A.4 Señales promedio y detalle a primer nivel . . . . . . . . . . . . 70

xiii
xiv

A.5 Análisis de tres niveles de una señal . . . . . . . . . . . . . . . 73


A.6 Herramienta gráfica de la “Wavelet Toolbox” . . . . . . . . . . . 76

B.1 Transformada de Haar de 1 nivel de una señal . . . . . . . . . . 80


B.2 Transformada de Haar de nivel 2 de una señal y sus perfiles de
energía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.3 Compresión de una señal . . . . . . . . . . . . . . . . . . . . . . 83
B.4 Comparación Daubechies y Coiflets . . . . . . . . . . . . . . . . 88
B.5 Transformadas inversas de Haar . . . . . . . . . . . . . . . . . . 90
B.6 Compresión de una señal con cuantización . . . . . . . . . . . . 95
B.7 Transformada wavelet de Haar de un ruido blanco gaussiano . . 100
B.8 Reducción del ruido blanco en una señal . . . . . . . . . . . . . 103
B.9 Reducción del ruido blanco en una señal con la orden wden . . . 104
B.10 Transformada discreta de Fourier de una señal . . . . . . . . . . 106
B.11 Análisis de frecuencias de una señal con DFT . . . . . . . . . . 107
B.12 Espectro de wavelets y scaling . . . . . . . . . . . . . . . . . . . 108
B.13 Análisis de frecuencias combinando DFT y wavelets . . . . . . . 111
B.14 Detección de señales cortas en señales grandes . . . . . . . . . . 115
B.15 Detección de señales cortas en señales grandes (manipuladas con
wavelets) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
B.16 Transformada wavelet continua de una señal . . . . . . . . . . . 123

C.1 Localización de “breakdown points” . . . . . . . . . . . . . . . . 126


C.2 Evolución a largo tiempo de una señal . . . . . . . . . . . . . . 128
C.3 Discontinuidad en la segunda derivada . . . . . . . . . . . . . . 130
C.4 Identificando frecuencias puras . . . . . . . . . . . . . . . . . . 132
Índice de códigos para
MATLAB

Archivo ana_nivel_3.m
Análisis wavelet de una señal hasta nivel 3 . . . . . . . . . . . . 71
Archivo energy.m
Energía de una señal . . . . . . . . . . . . . . . . . . . . . . . . 77
Archivo cumenergy.m
Energía acumulada (normalizada) de una señal . . . . . . . . . 77
Archivo rms.m
Error RMS entre dos señales . . . . . . . . . . . . . . . . . . . . 78
Archivo compress.m
Compresión de una señal . . . . . . . . . . . . . . . . . . . . . . 81
Archivo daub_coif.m
Mejoría Coiflets respecto Daubechies . . . . . . . . . . . . . . . 86
Archivo wav_sca.m
Construcción de wavelets y scaling . . . . . . . . . . . . . . . . 89
Archivo compress2.m
Compresión señal con cuantización . . . . . . . . . . . . . . . . 93
Archivo comp_audio.m
Compresión señal audio con cuantización y codificación . . . . . 96
Archivo white_noise.m
Transformada wavelet de ruido blanco . . . . . . . . . . . . . . 99
Archivo make_noisy_signal.m
Adición de ruido blanco gaussiano a una señal . . . . . . . . . . 101
Archivo denoise.m
Reducción de ruido . . . . . . . . . . . . . . . . . . . . . . . . . 101

xv
xvi

Archivo denoise_auto.m
Reducción de ruido (con comando wden) . . . . . . . . . . . . . 103
Archivo fourier_1.m
Transformada discreta de Fourier . . . . . . . . . . . . . . . . . 105
Archivo fourier_2.m
Análisis de frecuencias con Transformada discreta de Fourier . . 107
Archivo spectrum.m
Espectros de scaling y wavelets . . . . . . . . . . . . . . . . . . 109
Archivo fourier_wav.m
Análisis de frecuencias con wavelets y Fourier . . . . . . . . . . 110
Archivo corr.m
Correlación entre dos señales . . . . . . . . . . . . . . . . . . . 114
Archivo detect.m
Detección de patrones cortos en señales grandes . . . . . . . . . 114
Archivo corrfft.m
Correlación entre dos señales usando transformada de Fourier . 117
Archivo detect_wav.m
Detección de patrones (incorpora técnicas wavelets) . . . . . . . 118
Archivo break_anal.m
Búsqueda de discontinuidades (‘‘breakdown points’’) . . . . . . 126
Archivo evol_anal.m
Evolución en el tiempo de una señal . . . . . . . . . . . . . . . 128
Archivo disc_anal.m
Discontinuidad en las derivadas . . . . . . . . . . . . . . . . . . 130
Capítulo 1

Introducción a las Wavelets y


prerrequisitos de álgebra lineal

Trabajaremos con vectores en RN . Es decir, para cada señal discreta f supon-


dremos que
f = (f1 , f2 , . . . , fN ) ∈ RN .
En general N (la dimensión del espacio, la cual coincide con el número de
datos discretos que tenemos de cada señal) será una potencia de 2 (N = 2k )
suficientemente grande.
Recordamos también un par de conceptos sobre señales discretas que utili-
zaremos en el texto:
La energía de una señal f es

E(f ) := f12 + f22 + · · · + fN


2
.

El soporte de f se define como el conjunto

sop(f ) := {m : fm 6= 0},

y el valor medio de f lo tomamos como

f1 + f2 + · · · + fN
,
| sop(f )|

siendo | sop(f )| el número de índices en el soporte de f .

1
2 Introducción a las Wavelets y prerrequisitos de álgebra lineal

En esta sección preliminar intentaremos introducir, de un modo simple, al-


guna de las nociones básicas que serán desarrolladas con rigor en los posteriores
capítulos. Tomemos, por ejemplo, la siguiente señal

f := (1, 7, 4, 3).

A partir de f generamos otra señal A1 de la siguiente manera: promediamos


los dos primeros elementos de f y los dos últimos, lo cual nos da 4 y 3.5
respectivamente. Si los dos primeros elementos son sustituidos por su promedio,
al igual que los dos últimos, obtenemos la señal

A1 := (4, 4, 3.5, 3.5).

De esta forma la nueva señal viene a ser una aproximación de f de menor


resolución. Es lo que llamaremos más adelante como señal de promedio de
Haar a primer nivel.
Examinemos ahora la diferencia entre f y la aproximación

D1 := f − A1 = (−3, 3, 0.5, −0.5).

Esta nueva señal D1 será la señal de detalle de Haar a primer nivel. Es pre-
cisamente lo que necesitamos añadir a la señal de promedio para recuperar la
señal original f .
Podemos observar que D1 consiste en, hacer las diferencias promediadas
entre los elementos 1o y 2o , 2o y 1o , 3o y 4o , y 4o y 3o respectivamente de f .
Si quisiéramos continuar el proceso y pasar a una aproximación de incluso
menor resolución podríamos promediar los cuatro elementos de f y obtener la
señal constante
A2 := (3.75, 3.75, 3.75, 3.75).
También deberíamos observar que este mismo resultado se hubiera obtenido
de proceder con A1 en vez de f . La señal A2 es el promedio de Haar a segundo
nivel de f .
La diferencia entre A1 y A2 es la señal de detalle de Haar a segundo nivel,
es decir,
D2 := A1 − A2 = (0.25, 0.25, −0.25, −0.25).
En definitiva podemos recuperar f a partir de A2 añadiendo los detalles

f = A2 + D 2 + D 1 .
3

(a) f(t) (b) Detalle de Haar a nivel 1


1 0.05

0.5

0 0

−0.5

−1 −0.05
0 0.5 1 0 0.5 1

(c) Promedio de Haar a nivel 2 (d) Detalle de Haar a nivel 2


1 0.05

0.5

0 0

−0.5

−1 −0.05
0 0.5 1 0 0.5 1

Figura 1.1: (a) Señal original f (t). (b) Detalle de Haar a nivel 1. (c) Promedio
de Haar a nivel 2. (d) Detalle de Haar a nivel 2.

En esto consiste el análisis de multirresolución.


En la figura 1.1 representamos
2
f (t) = 0.8e10(t−0.5) sen(40t)

muestreada a 1024 puntos en el intervalo [0, 1], la señal D1 , diferencia entre f y


A1 (no representada) de promedio a primer nivel que consiste en promediar los
elementos 1o y 2o , 3o y 4o , y así sucesivamente, de f y sustituir los elementos de
f por los correspondientes promedios. La señal A2 formada por el promedio de
los cuatro primeros elementos de f , situado en las cuatro primeras posiciones,
luego el promedio de los elementos 5o a 8o , situado en las cuatro siguientes
posiciones, y así sucesivamente. Por último la señal D2 de detalle a segundo
nivel es la diferencia entre A1 y A2 .
Como se puede comprobar, en el proceso anterior estamos introduciendo
redundancia de información a cada paso del análisis de multirresolución que
efectuamos, ya que partimos de una señal N -dimensional y vamos obteniendo
sucesivas señales de la misma dimensión. Con la transformada wavelet que
veremos con detalle en los próximos capítulos dicha redundancia se elimina
y obtendremos en cada nivel una señal N -dimensional compuesta por varias
4 Introducción a las Wavelets y prerrequisitos de álgebra lineal

subseñales que representan la información de las señales de promedio y detalles.


A lo largo del texto damos por supuestos conocimientos básicos de alge-
bra lineal. No obstante, en aras de la completitud, recordamos brevemente la
notación y nociones que utilizaremos.
Dado un sistema de vectores X = {v1 , v2 , . . . , vm } en RN , su envoltura li-
neal es el subespacio V formado por las combinaciones lineales de los elementos
de X y lo denotamos por

V := lin{v1 , v2 , . . . , vm }.

El producto escalar de dos vectores u = (u1 , . . . , uN ), w = (w1 , . . . , wN ) ∈


RN es
u · w := u1 w1 + u2 w2 + · · · + uN wN .
Los vectores u y w son ortogonales entre sí cuando su producto escalar es nulo.
La norma euclídea de u es la raíz cuadrada de su energía, es decir
√ q
kuk := u · u = u21 + u22 + · · · + u2N .

Un sistema de vectores X = {v1 , v2 , . . . , vm } en RN es ortonormal si cada


vector del sistema tiene norma 1 y son ortogonales entre sí. En ese caso son un
sistema linealmente independiente y, al ser también sistema generador, forman
una base de la envoltura lineal V de X, siendo cada elemento v ∈ V expresable
de forma única como combinación lineal de los elementos de X de la siguiente
manera
v = (v · v1 )v1 + (v · v2 )v2 + · · · + (v · vm )vm .
Dos subespacios V y W son ortogonales entre sí cuando cada vector de V es
ortogonal a todos los vectores de W . En ese caso al espacio suma de V y W
generado por dichos subespacios lo denotamos como

V ⊕⊥ W.

Si v ∈ RN y W es un subespacio de RN , la proyección ortogonal de v sobre W


es el (único) vector w ∈ W tal que v − w es ortogonal a W . También coincide
con el vector w ∈ W tal que la distancia de v a w, dada por kv −wk, es mínima.
Una aplicación lineal T : RN → RN es una transformación ortogonal si
conserva el producto escalar, es decir, T v · T w = v · w para todo par v, w ∈ RN .
Esto equivale a que sea una isometría, o sea conserva la norma (kT vk = kvk,
5

para todo v ∈ RN ). En particular una transformación ortogonal preserva la


energía, al ser el cuadrado de la norma. T es transformación ortogonal si y sólo
si su expresión matricial en una (cualquier) base ortonormal de RN es tal que
sus filas (columnas) son una base ortonormal.
Capítulo 2

Wavelets de Haar

El tipo de wavelets (ondículas) que introducimos a continuación son las de


Haar. Estas sirven de modelo por su sencillez y por contener la mayoría de
los ingredientes que requerirán los restantes tipos de wavelets que iremos co-
nociendo a lo largo del texto.

2.1 Scaling y wavelets


Las wavelets de Haar de nivel 1 son:
µ ¶
1 1 −1
w1 := √ , √ , 0, . . . , 0
2 2
µ ¶
1 1 −1
w2 := 0, 0, √ , √ , 0, . . . , 0
2 2
..
.
µ ¶
1 1 −1
wN/2 := 0, . . . , 0, √ , √ .
2 2

El número de wavelets de Haar en el primer nivel es, por tanto, la mitad


de la dimensión N . Observamos también que cada una de las wavelets wj1 ,
j > 1, se obtiene a partir de la wavelet√w11 desplazando
√ hacia la derecha 2j
posiciones el par de entradas no nulas 1/ 2, −1/ 2. Por último hay que notar
que conforman un sistema ortonormal y que el valor medio de cada wavelet es
0.

7
8 Wavelets de Haar

Si tenemos una señal f ∈ RN , esta lleva asociada una subseñal d1 de


primera fluctuación de Haar (coeficientes de detalle) expresada como:

d1 = (d1 , . . . , dN/2 ) := (f · w11 , . . . , f · wN/2


1
).

Es decir, es una subseñal con N/2 entradas que contiene todos los productos
escalares de nuestra señal f con cada una de las wavelets del primer nivel.
Estas entradas serían:
f1 − f2 f −f f −f
d1 = √ , d2 = 3√ 4 , . . . , dN/2 = N −1
√ N.
2 2 2
Por otra parte, los coeficientes de primera tendencia de f se definen como
f1 + f2 f +f f +f
a1 = √ , a2 = 3√ 4 , . . . , aN/2 = N −1
√ N.
2 2 2
Estos también se pueden expresar como los productos escalares de f por ciertas
señales simples, llamadas scaling de Haar (funciones escala) de nivel 1, dadas
por
µ ¶
1 1 1
v1 := √ , √ , 0, . . . , 0
2 2
µ ¶
1 1 1
v2 := 0, 0, √ , √ , 0, . . . , 0
2 2
..
.
µ ¶
1 1 1
vN/2 := 0, . . . , 0, √ , √ .
2 2
Se tiene que
1
am = f · vm , m = 1, . . . , N/2,
conformando de esta manera la subseñal de primera tendencia

a1 := (a1 , a2 , . . . , aN/2 ).

En la figura 2.1 podemos ver la señal f (t) = 10t2 (2 − t)6 sen(5πt) en el


intervalo [0, 2], muestreada con 1024 puntos (N = 1024) y las subseñales a1 y
d1 asociadas.
En las señales scaling de Haar se observan las siguientes similitudes con las
respectivas wavelets:
2.1 Scaling y wavelets 9

(a) f(t)
50

−50
0 100 200 300 400 500 600 700 800 900 1000

(b) Subseñal tendencia a nivel 1 (c) Subseñal detalle a nivel 1


50 2

0 0

−1

−50 −2
0 100 200 300 400 500 0 100 200 300 400 500

Figura 2.1: (a) Señal original f (t). (b) Subseñal tendencia a nivel 1. (c) Subseñal
fluctuación a nivel 1.

(a) Conforman un sistema ortonormal.

1 ) = sop(w 1 ), para cada m = 1, . . . , N/2.


(b) Respecto los soportes, sop(vm m

1 se obtiene a partir de la scaling v 1 desplazando hacia la derecha


(c) Cada vm 1 √ √
2m posiciones el par de entradas no nulas 1/ 2, 1/ 2.

Pero se diferencian en que, √ mientras las wavelets tienen un valor medio


igual a 0, en las scaling es 1/ 2.
Además se cumple que

vn1 · wm
1
= 0, ∀ n, m = 1, . . . , N/2.

Con lo cual la familia de vectores {v11 , . . . , vN/2


1 , w 1 , . . . , w 1 } es una base
1 N/2
N
ortonormal de R .
10 Wavelets de Haar

Si pasamos al nivel 2, las wavelets de Haar se definen como


µ ¶
2 1 1 −1 −1
w1 := , , , , 0, . . . , 0
2 2 2 2
µ ¶
2 1 1 −1 −1
w2 := 0, 0, 0, 0, , , , , 0, . . . , 0
2 2 2 2
..
.
µ ¶
2 1 1 −1 −1
wN/4 := 0, . . . , 0, , , , .
2 2 2 2

Y las scaling son


µ ¶
1 1 1 1
v12 := , , , , 0, . . . , 0
2 2 2 2
µ ¶
2 1 1 1 1
v2 := 0, 0, 0, 0, , , , , 0, . . . , 0
2 2 2 2
..
.
µ ¶
2 1 1 1 1
vN/4 := 0, . . . , 0, , , , .
2 2 2 2

Ahora definiremos las correspondientes subseñales de fluctuación y tenden-


cia a nivel 2 como

d2 := (f · w12 , . . . , f · wN/4
2
)
a2 := (f · v12 , . . . , f · vN/4
2
).

En la figura 2.2 podemos ver la señal f (t) = 10t2 (2 − t)6 sen(5πt) en el


intervalo [0, 2], muestreada con 1024 puntos (N = 1024) y las subseñales a1
y d1 asociadas en la segunda fila y las subseñales a2 , d2 y d1 asociadas en la
tercera fila.
Se puede observar, en primer lugar, que el soporte de las scaling y las
wavelets a nivel 2 consta de 4 entradas consecutivas, conforman un sistema
ortonormal, las wavelets a nivel 2 siguen teniendo un valor medio igual a 0
y en las scaling es 1/2. Las wm2 se obtienen desplazando hacia la derecha 4m

posiciones las entradas no nulas de w12 , al igual que las vm


2 respecto v 2 . Pero
1
también hay que notar que, tanto las wavelets como las scaling a nivel 2, se
2.1 Scaling y wavelets 11

(a) f(t)
50

−50
0 100 200 300 400 500 600 700 800 900 1000
(b) Subseñal tendencia a nivel 1 (c) Subseñal detalle a nivel 1
50 2

0 0

−1

−50 −2
0 100 200 300 400 500 0 100 200 300 400 500
(d) Tend. nivel 2 (e) Det. nivel 2 (f) Subseñal detalle a nivel 1
2 2
50
1 1

0 0 0

−1 −1
−50
−2 −2
0 100 200 0 100 200 0 100 200 300 400 500

Figura 2.2: (a) Señal original f (t). (b) Subseñal tendencia a nivel 1. (c) Subseñal
fluctuación a nivel 1. (c) Subseñal tendencia a nivel 2. (d) Subseñal fluctuación
a nivel 2. (e) Subseñal fluctuación a nivel 1.

obtienen a partir de las scaling de nivel 1 por las formulas


v11 + v21 v11 − v21
v12 = √ w12 = √
2 2
.. ..
. . (2.1)
1
vN/2−1 1
+ vN/2 1
vN/2−1 − vN/2 1
2 2
vN/4 = √ wN/4 = √ .
2 2
Otra forma de ver la situación es que wavelets y scaling a nivel 2 se deducen
de las wavelets y scaling a nivel 1 “dilatando” el soporte (que√ahora es el doble)
y “contrayendo” sus valores al multiplicarlos por el factor 1/ 2 (para preservar
la energía unitaria).
De las igualdades (2.1) deducimos que {v12 , . . . , vN/4
2 , w 2 , . . . , w 2 } es una
1 N/4
base ortonormal del subespacio
V 1 := lin{v11 , . . . , vN/2
1
}.
Todas estas observaciones nos acercan al análisis de multirresolución, objetivo
de nuestra siguiente sección.
12 Wavelets de Haar

2.2 Análisis de multirresolución (MRA)


Constituye el eje central en el tratamiento de señales mediante wavelets. A
partir de la señal original la descomponemos en suma de otras dos, una de
promedio y otra de detalles. En el siguiente paso aplicamos el proceso anterior
a la señal de promedio, y así sucesivamente. Para el proceso inverso de síntesis,
empezamos por una señal de baja resolución, añadiendo los detalles sucesiva-
mente con lo cual vamos alcanzando señales de mayor resolución, para acabar
con la síntesis completa de la señal a la resolución más alta. Esto es lo que se
conoce como análisis de multirresolución (MRA).
Hemos señalado que {v11 , . . . , vN/2
1 , w 1 , . . . , w 1 } es una base ortonormal
1 N/2
N
de R . Por tanto una señal f la expresaremos como
f = (f · v11 )v11 + · · · + (f · vN/2
1 1
)vN/2 + (f · w11 )w11 + · · · + (f · wN/2
1 1
)wN/2
= a1 v11 + · · · + aN/2 vN/2
1
+ d1 w11 + · · · + d1N/2 wN/2
1
µ ¶ µ ¶
a1 a1 aN/2 aN/2 d1 −d1 dN/2 −dN/2
= √ , √ ,..., √ , √ + √ , √ ,..., √ , √ .
2 2 2 2 2 2 2 2
Esto nos lleva al primer nivel de MRA de Haar
f = A1 + D 1 ,
siendo A1 la señal del primer promedio
µ ¶ N/2
X
a a aN/2 aN/2
A = 1
√1 , √1 , . . . , √ , √ = (f · vj1 )vj1 ,
2 2 2 2 j=1

y D1 la señal de primer detalle


µ ¶ N/2
X
d −d dN/2 −dN/2
D =1
√1 , √ 1 , . . . , √ , √ = (f · wj1 )wj1 .
2 2 2 2 j=1

Por tanto la señal de promedio es una combinación lineal de las scaling, toman-
do los valores de la subseñal de primera tendencia como coeficientes, mientras
que la señal de detalle es combinación de las wavelets, tomando las fluctuacio-
nes de nivel 1 como coeficientes.
En realidad A1 es la proyección de f sobre el espacio V 1 , y D1 , por ser
la diferencia entre f y A1 , es la proyección de f sobre el espacio W 1 :=
lin{w11 , . . . , wN/2
1 }.
2.2 Análisis de multirresolución (MRA) 13

Si expresamos A1 y D1 en función de los valores de f tenemos


µ ¶
1 f1 + f2 f1 + f2 f3 + f4 f3 + f4 fN −1 + fN fN −1 + fN
A = , , , ,..., , ,
2 2 2 2 2 2
µ ¶
1 f1 − f2 f2 − f1 f3 − f4 f4 − f3 fN −1 − fN fN − fN −1
D = , , , ,..., , .
2 2 2 2 2 2
Por tanto f es la suma de una señal de resolución más baja A1 y de la señal
de detalles D1 .
Si vamos al segundo nivel del MRA de f
f = A2 + D 2 + D 1 ,
donde
A2 = (f · v12 )v12 + · · · + (f · vN/4
2 2
)vN/4 ,
D2 = (f · w12 )w12 + · · · + (f · wN/4
2 2
)wN/4 ,
2 , w 2 , . . . , w 2 , w 1 , . . . , w 1 } es una base ortonormal de
ya que {v12 , . . . , vN/4 1 N/4 1 N/2
RN .
En este caso A2 es la señal del segundo promedio de f , que consiste en
proyectar f (o, equivalentemente, A1 ) sobre el espacio
V 2 := lin{v12 , . . . , vN/4
2
}

y D2 es la proyección de f (o A1 ) sobre
W 2 = lin{w12 , . . . , wN/4
2
}.
Expresados en función de los valores de f tenemos que
µ
f1 + f2 + f3 + f4 f1 + f2 + f3 + f4 f1 + f2 + f3 + f4
A2 = , , ,
4 4 4

f1 + f2 + f3 + f4 fN −3 + fN −2 + fN −1 + fN
,..., ,
4 4

µ
f1 + f2 − f3 − f4 f1 + f2 − f3 − f4 −f1 − f2 + f3 + f4
D2 = , , ,
4 4 4

−f1 − f2 + f3 + f4 −fN −3 − fN −2 + fN −1 + fN
,..., .
4 4
14 Wavelets de Haar

(a) f(t) (b) D1


1 0.05

0.5

0 0

−0.5

−1 −0.05
0 0.5 1 0 0.5 1

2 2
(c) A (d) D
1 0.05

0.5

0 0

−0.5

−1 −0.05
0 0.5 1 0 0.5 1

Figura 2.3: (a) Original f (t). (b) Detalle D1 . (c) Promedio A2 . (d) Detalle D2 .

Así reconstruimos la señal f a partir de una señal de baja resolución A2


añadiendo sucesivamente los detalles D2 y D1 .
En la figura 2.3 representamos la señal f (t) = 20t2 (1 − t)4 cos(12πt) mues-
treada a 1024 puntos en el intervalo [0, 1] en (a), la señal D1 de primer detalle
en (b), la señal D2 de segundo detalle en (d) y la señal A2 de segundo promedio
en (c).
Continuaríamos el proceso de forma inductiva y el MRA a nivel m de f es

f = Am + D m + · · · + D 2 + D 1 ,

donde m ≤ k y N = 2k (por ejemplo, si la señal original es de N = 1024 datos,


entonces podemos llegar hasta un nivel máximo de k = 10 en el MRA). El
promedio y el detalle a este nivel es

Am = (f · v1m )v1m + · · · + (f · vN/2


m m
m )vN/2m ,

Dm = (f · w1m )w1m + · · · + (f · wN/2


m m
m )wN/2m ,
2.2 Análisis de multirresolución (MRA) 15

siendo las wavelets y scaling a nivel m definidas por


1 1 −1 −1
w1m := ( m/2 , . . . , m/2 , m/2 , . . . , m/2 , 0, . . . , 0)
|2 {z 2 } |2 {z 2 }
2m−1 2m−1
1 1 −1 −1
w2m := (0, . . . , 0, m/2 , . . . , m/2 , m/2 , . . . , m/2 , 0, . . . , 0)
| {z } 2
2m
| {z 2 } |2 {z 2 }
2m−1 2m−1
..
.
m 1 1 −1 −1
wN/2 m := (0, . . . , 0, , . . . , m/2 , m/2 , . . . , m/2 )
|2m/2 {z 2 } |2 {z 2 }
2m−1 2m−1
1 1
v1m := ( , . . . , m/2 , 0, . . . , 0)
2m/2
| {z 2 }
2m
1 1
v2m := (0, . . . , 0, m/2 , . . . , m/2 , 0, . . . , 0)
| {z } 2
2m
| {z 2 }
2m
..
.
m 1 1
vN/2 m := (0, . . . , 0,
m/2
, . . . , m/2
).
|2 {z 2 }
2m
Como ocurría en el caso de las wavelets y scaling de nivel 2, que se expre-
saban en función de las scaling de nivel 1, las wavelets y scaling de nivel m son
combinaciones lineales de las scaling de nivel m − 1 bajo las mismas fórmulas
de recurrencia, concretamente
v1m−1 + v2m−1 v1m−1 − v2m−1
v1m = √ w1m = √
2 2
.. ..
. . (2.2)
m−1 m−1 m−1 m−1
vN/2 m−1 −1 + vN/2m−1 vN/2 m−1 −1 − vN/2m−1
m m
vN/2 m = √ wN/2 m = √ .
2 2
En definitiva, la señal de m-ésimo promedio Am , es la proyección ortogonal de
f sobre el subespacio
V m := lin{v1m , . . . , vN/2
m
m },
16 Wavelets de Haar

mientras que la señal Dm de detalles a nivel m es la proyección de f sobre

W m := lin{w1m , . . . , wN/2
m
m }.

Por las relaciones anteriores, los subespacios V m y W m están contenidos en


V m−1 . Es más, cada uno de ellos es el complemento ortogonal del otro en
V m−1 , es decir,
V m ⊕⊥ W m = V m−1 .
Esto nos da la siguiente descomposición, que es precisamente el MRA a nivel
m.
RN = V m ⊕⊥ W m ⊕⊥ · · · ⊕⊥ W 1 .
Como hemos observado anteriormente, m ≤ k (N = 2k ). De manera que al
llegar al último nivel k sólo tendríamos una wavelet y una scaling
1 1 −1 −1
w1k = ( √ , . . . , √ , √ , . . . , √ ),
N N | N {z N
| {z } }
N/2 N/2
1 1
v1k = ( √ , . . . , √ ).
N N
| {z }
N

Con lo cual nos daría, dada una señal f , la resolución más baja posible Ak
consiste en la constante
f1 + f2 + · · · + fN f1 + f2 + · · · + fN
Ak = ( ,..., ),
N N
que, en definitiva, es tomar el valor promedio de toda la señal f y considerar la
señal constante asociada. Si añadimos de forma sucesiva los detalles Dk , Dk−1 ,
. . . , D1 , a AK recuperamos la original f .
En la descomposición del MRA para cada f lo único que hay que calcular
son los coeficientes que multiplican a las wavelets y scaling, que son las ten-
dencias y fluctuaciones. Esto nos conduce de forma natural a la transformada
de Haar.

2.3 Transformada de Haar


La transformada de Haar a nivel m es sencillamente una transformación tal
que a cada señal f le hace corresponder la señal consistente en los coeficientes
2.3 Transformada de Haar 17

de las tendencias de nivel m, junto con las fluctuaciones de nivel m e inferior


ordenadas, es decir,

H m
f 7−→ (am |dm |dm−1 | . . . |d1 ).

Esta transformación es, en primer lugar, lineal. Además, teniendo en cuenta


como se obtienen los coeficientes, es una transformación ortogonal. Escrito
matricialmente, para el nivel 1 obtendríamos

 
  f1
  v11
..  .. 
   . 
 a1   .   
   1   .. 
   vN/2   . 
 =   
   w1   .. 
   1   . 
 d1   ..   
 .   .. 
1
 . 
wN/2 fN

Se observa que la matriz asociada a dicha transformación es tal que sus filas
forman una base ortonormal. Es por ello que la transformación H1 es ortogonal.
Esto es una gran ventaja a la hora de realizar cálculos ya que, por ejemplo, la
transformada inversa

H−1
(a1 |d1 ) 7−→
1
f

se calcula de forma trivial simplemente trasponiendo la matriz:

 
 T f1
v11  
..  .. 
   . 
 .   a1   
 1     .. 
 vN/2     . 
   =  
 w1     .. 
 1     . 
 ..   d1   
 .   .. 
1
 . 
wN/2 fN
18 Wavelets de Haar

De forma análoga, la transformación Hm a nivel m también es ortogonal, sería


 
  f1
  v1m  .. 
 ..   . 
 .   .. 
 am   m   
   v m   . 
   N/2   .. 
   wm   
   1   . 
 m   ..   .. 
 d   .   
     . 
  =  wm   .. 
   m   
 .   N/2 ..   . 
 ..     .. 
   .   . 
     
   w11   .. 
 d1     . 
 ..   
 .   .. 
1  . 
wN/2
fN

y análogamente podemos invertir el proceso de forma sencilla.


A efectos gráficos, como hacer la transformada de nivel 1 produce

f1 + f2 fN −1 + fN f1 − f2 fN −1 − fN
H1 (f ) = ( √ , . . . , √ , √ ,..., √ ),
2 2 2 2
| {z } | {z }
N/2 N/2

entonces esta transformada viene a ser una “compresión”


√ de la señal original
en la primera mitad, multiplicada por el factor 2, mientras que la segunda
mitad contiene las fluctuaciones, las cuales serán “pequeñas” si la señal original
no tiene cambios “bruscos”. A niveles superiores, en cada paso sucesivo esen-
cialmente comprimimos a la mitad la subseñal de tendencia que teníamos en el
paso anterior y lo situamos en la primera parte, a continuación las fluctuacio-
nes de dicha subseñal, y por último las fluctuaciones que ya había en el paso
anterior.
Hay dos propiedades fundamentales de esta transformada: Por una parte la
conservación de la energía al ser una transformación ortogonal. Por otra parte
se cumple la característica de las fluctuaciones pequeñas, es decir, si una señal
es constante en el soporte de una wavelet, al multiplicarla escalarmente por
ella nos saldrá 0, es decir, la correspondiente fluctuación es nula. Si la señal
no “varía” mucho a lo largo del soporte de la wavelet, entonces la fluctuación
asociada es “pequeña”.
2.3 Transformada de Haar 19

La conjunción de las dos observaciones anteriores conlleva el fenómeno co-


nocido como compactación de la energía. Concretamente, la energía de la señal
original es la suma de las energías de las subseñales de tendencia y fluctuaciones
E(f ) = E(am ) + E(dm ) + · · · + E(d1 ).
Ahora bien, por la característica de las fluctuaciones pequeñas, será la tenden-
cia quien concentrará en general la mayor parte de la energía de la transforma-
da. Una manera de cuantificarlo es mediante el perfil de energía acumulada:
à !
f12 f12 + f22 f12 + · · · + fN
2
−1
, ,..., ,1 .
E(f ) E(f ) E(f )

En la figura 2.4 tenemos la señal original (a), la transformada de nivel 2 (b),


y los perfiles de energía acumulada de ambas ((c) y (d)).

(a) (b)
1.5 1.5
1 1
0.5 0.5
0 0
−0.5 −0.5
−1 −1
−1.5 −1.5
0 1000 2000 3000 4000 0 1000 2000 3000 4000

(c) (d)
1.5 1.5

1 1

0.5 0.5

0 0

−0.5 −0.5
0 1000 2000 3000 4000 0 1000 2000 3000 4000

Figura 2.4: (a) Señal original. (b) Transformada de Haar de nivel 2. (c) Per-
fil de energía acumulada de la señal. (d) Perfil de energía acumulada de la
transformada de Haar de nivel 2.

Como se puede apreciar claramente, la energía se acumula antes en la trans-


formada que en la original. De hecho en el primer cuarto del intervalo, que
corresponde precisamente a la subseñal a2 , se acumula el mayor porcentaje de
la energía.
20 Wavelets de Haar

Por último podemos calcular el número de operaciones necesario para rea-


lizar la transformada de Haar. La idea fundamental reside en el proceso de
obtención de Hm (f ), que paso a paso sigue el siguiente diagrama, conocido
como algoritmo en pirámide de Mallat.
H H H
f −→1
a1 −→
1
a2 . . . am−1 −→1
am
ց ց ց
d1 d2 dm
Si esto lo expresamos matricialmente tenemos
 m   N   
a H 1 ( 2m−1 ) 0
 dm     H 1 ( N2 ) 0 
     
     
     
 ..     
 . = ... .
     
 ..     
 .   0 I   0 I 
     
     
d1
  
√1 √1 0 0 ... 0 0 f1
2 2
 0 0 √1 √1 ... 0 0  f2 
 2 2  
  
 ...  
 √1
  .. 
 0 0 0 0 ... √1  . 
. 2 2  
 √1 − √12 0 0 ... 0 0   .. 
 2  . 
  
 0 0 √1 − √12 ... 0 0  
 2  
 ...   fN −1 
0 0 0 0 ... √1
2
− √12 fN
donde
  
√1 √1 0 0 ... 0 0
2 2 
 0 0 √1 √1 ... 0 0  

 2 2 
  j/2
 ...  
  

 0 0 0 0 ... √1 √1 
H1 (j) =  2 2  
 √1 − √12 0 0 ... 0 0  
 2  

 
 0 0 √1 − √12 ... 0 0  j/2
 2  
 ...  

0 0 0 0 ... √1 − √12
2
2.3 Transformada de Haar 21

Multiplicar por la primera matriz requiere 3N operaciones, por la segunda


3N/2, por la tercera 3N/4, . . . , por la m-ésima 3N/2m−1 . Esto nos da un
número de operaciones no superior a 6N , es decir O(N ) operaciones. Resultado
que debe ser comparado con otras transformadas rápidas, como la FFT que
requiere O(N log N ) operaciones.
Capítulo 3

Familias de wavelets ortogonales

3.1 Wavelets de Daubechies


En esta sección describimos una amplia colección de tipos de wavelets orto-
gonales descubiertas por Daubechies. La diferencia respecto a las de Haar es
la forma en como se definen las scaling y las wavelets. Las propiedades más
importantes del MRA y la transformada seguirán siendo válidas en el nuevo
contexto. Las ventajas que se obtendrán con las nuevas wavelets residen en el
hecho que hay una mejora substancial en el tratamiento de señales que posean
cualidades adecuadas de “suavidad”.

3.1.1 Daubechies db2


Conceptos básicos

En primer lugar introducimos las scaling y wavelets Daubechies2 (db2), a


nivel 1.

v11 := (α1 , α2 , α3 , α4 , 0, 0, . . . , 0) w11 := (β1 , β2 , β3 , β4 , 0, 0, . . . , 0)


v21 := (0, 0, α1 , α2 , α3 , α4 , 0, . . . , 0) w21 := (0, 0, β1 , β2 , β3 , β4 , 0, . . . , 0)
.. ..
. .
1 1
vN/2−1 := (0, . . . , 0, α1 , α2 , α3 , α4 ) wN/2−1 := (0, . . . , 0, β1 , β2 , β3 , β4 )
1 1
vN/2 := (α3 , α4 , 0, . . . , 0, α1 , α2 ) wN/2 := (β3 , β4 , 0, . . . , 0, β1 , β2 ).

23
24 Familias de wavelets ortogonales

Donde las entradas en las scaling son


√ √ √ √
1+ 3 3+ 3 3− 3 1− 3
α1 := √ , α2 := √ , α3 := √ , α4 := √ .
4 2 4 2 4 2 4 2

y las entradas en las wavelets son

β1 = α4 , β2 = −α3 , β3 = α2 , β4 = −α1 .

Estos valores son tales que

α12 + α22 + α32 + α42 = 1,

α1 α3 + α2 α4 = 0.

Estas relaciones implican que {v11 , . . . , vN/2


1 , w 1 , . . . , w 1 } sea una base orto-
1 N/2
normal de RN . Por otra parte también se cumple

β1 + β2 + β3 + β4 = 0,

lo cual conlleva que el valor medio de las wavelets sea 0. Posteriormente resalta-
remos una igualdad añadida respecto a las de Haar que cumplen los elementos
de las wavelets y que les dotan de una mayor ventaja en el tratamiento de
señales suaves.
Dada un señal f , definiendo las subseñales de primera tendencia y fluctua-
ción, respectivamente, al igual que lo hicimos con las de Haar, es decir,

a1 := (f · v11 , f · v21 , . . . , f · vN/2


1
),
d1 := (f · w11 , f · w21 , . . . , f · wN/2
1
),

se observa que los elementos de la subseñal de tendencia vuelven a ser una


media ponderada, esta vez entre 4 valores consecutivos de f , mientras que las
fluctuaciones son diferencias ponderadas.
Para niveles superiores se definen las correspondientes scaling y wavelets a
partir de las del nivel anterior, utilizando los coeficientes nuevos dados por las
3.1 Wavelets de Daubechies 25

fórmulas recurrentes
v1m = α1 v1m−1 + α2 v2m−1 + α3 v3m−1 + α4 v4m−1
..
.
m−1 m−1 m−1
m
vN/2 m = α1 v
N/2m−1 −1
+ α2 vN/2 m−1 + α3 v1 + α4 v2m−1
w1m = β1 v1m−1 + β2 v2m−1 + β3 v3m−1 + β4 v4m−1
..
.
m−1 m−1 m−1
m
wN/2 m = β1 v
N/2m−1 −1
+ β2 vN/2 m−1 + β3 v1 + β4 v2m−1 .

Wavelets w11, w11 y w11 Scaling v11, v11 y v11


2 4 7 2 4 7

Figura 3.1: Para N = 214 y db2 a la izquierda las wavelet w211 w411 y w711 y a
la derecha las scaling v211 , v411 y v711 .

La figura 3.1 nos muestra, para N = 214 y m = 11, la gráfica de varios


vectores wavelet y scaling de la db2.
Como en el caso de Haar, el MRA a nivel m de una señal f se define como
f = Am + D m + · · · + D 2 + D 1 ,
donde m ≤ k − 1 (N = 2k ), y las señales promedio y detalle son
Am = (f · v1m )v1m + · · · + (f · vN/2
m m
m )vN/2m

Dm = (f · w1m )w1m + · · · + (f · wN/2


m m
m )wN/2m .

Por tanto, la señal de m-ésimo promedio Am , es también la proyección


ortogonal de f sobre el subespacio
V m := lin{v1m , . . . , vN/2
m
m },
26 Familias de wavelets ortogonales

mientras que la señal de detalles a nivel m, Dm , es la proyección de f sobre

W m := lin{w1m , . . . , wN/2
m
m }.

En definitiva llegamos a la descomposición

RN = V m ⊕⊥ W m ⊕⊥ · · · ⊕⊥ W 1 .

Como hemos observado anteriormente, m ≤ k − 1 (N = 2k ). De manera que


al llegar al último nivel k − 1 solo tendríamos un par de wavelets y un par de
scaling.
Al igual que en la transformada de Haar, la transformada db2 a nivel m
es una transformación tal que a cada señal f le hace corresponder la señal
consistente en la tendencia de nivel m, junto con las fluctuaciones de nivel m
e inferior ordenadas, es decir,
db2
m
f 7−→ (am |dm |dm−1 | . . . |d1 ).

Esta transformación que también es ortogonal y escrita matricialmente,


para el nivel m, se tendría
 
 m
 f1
  v1  . 
 ..   .. 
   
 am   m.   .. 
     . 
   vN/2m   . 
   wm   . 
   1   . 
 m   .   . 
 d   ..   . 
     . 
  =  wm   . 
   m   
 .   N/2 ..   .. 
 ..     . 
   .   .. 
   1   
   w1   . 
 d1     . 
 ..   . 
 .   . 
1  .. 
wN/2
fN
Una vez más, por ser una transformación ortogonal, se conserva la energía
(E(db2m (f )) = E(f )) y se da la propiedad de las “fluctuaciones pequeñas”, lo
que implica el fenómeno de compactación de la energía. Además la transfor-
mada se invierte de forma sencilla trasponiendo la matriz correspondiente en
el nivel en el cual dispongamos de la señal transformada.
3.1 Wavelets de Daubechies 27

También aquí podemos obtener cada una de las subseñales de tendencia y


fluctuación de un determinado nivel a partir de la subseñal de tendencia del
nivel anterior aplicando la transformada db21 , resultando igualmente como en
el caso de Haar un diagrama en forma de pirámide.

db21 db2 db2


f −→ a1 −→1 a2 . . . am−1 −→1 am
ց ց ց
d1 d2 dm

Característica de las fluctuaciones pequeñas


Si una señal es lineal en el soporte de una wavelet db2, el producto escalar de
la señal por dicha wavelet es 0, es decir, la correspondiente fluctuación es nula.
Si la señal es “aproximadamente” lineal a lo largo del soporte de la wavelet,
entonces la fluctuación asociada es “pequeña”.
La razón de que, en este caso, obtengamos una mejora respecto a las wa-
velets de Haar es consecuencia de la siguiente igualdad

1β1 + 2β2 + 3β3 + 4β4 = 0.

Indicamos la prueba para el nivel 1. El caso general es análogo. Sea {i, i +


1, i + 2, i + 3} el soporte de cierta wavelet wj1 . Si f es lineal a lo largo de dicho
soporte, entonces existen a, b ∈ R tales que

fl = a + b(l − i + 1), l = i, . . . , i + 3.

Entonces

f · wj1 = β1 (a + b) + β2 (a + 2b) + β3 (a + 3b) + β4 (a + 4b) = 0.

Esta observación resulta particularmente importante cuando estamos tratando


una señal discreta obtenida a partir del muestreo de una señal analógica que
es de clase C 2 , es decir, dos veces derivable en el intervalo y cuya derivada
segunda es continua. En este caso, por el desarrollo de Taylor, sabemos que
siendo fn = f (nh) (suponemos, por comodidad, que el muestreo es en un
intervalo cuyo extremo inferior es el 0) con h el paso de muestreo, se cumple

fi+n = fn + f ′ (nh)ih + O(h2 ), i = 0, 1, 2, 3.


28 Familias de wavelets ortogonales

Y así llegamos a f · wjm = O(h2 ). En las mismas condiciones para la señal f ,


se obtiene que f · wjm = O(h) para las wavelets de Haar, lo cual es claramente
peor.
Si juntamos esta última ecuación con las que ya teníamos anteriormente,
obtenemos el sistema:

β12 + β22 + β32 + β42 = 1,


β1 + β2 + β3 + β4 = 0,
β1 β3 + β2 β4 = 0,
1β1 + 2β2 + 3β3 + 4β4 = 0.

A partir de estas ecuaciones se determinan los valores de los coeficientes de


db2.
También aquí podemos calcular el número de operaciones necesario para
realizar la transformada db2. La expresión matricial de la transformada es

   N   
am db21 ( 2m−1 ) 0
 dm  
  



 db21 ( N2 ) 0 

     
     
 ..     
 . = ... .
     
 ..     
 .   0 I   0 I 
     
     
d1
 
  f1
α1 α2 α3 α4 0 0 ... 0 0
 f2 
 0 0 α1 α2 α3 α3 . . . 0 0   
  
 ...  
   .. 
 α3 α4 0 0 ... 0 0 α1 α2   
.  . 
 β1 β2 β3 β4 0 0 ... 0 0 
 . 
  .. 
 0 0 β1 β2 β3 β4 . . . 0 0   
  
 ...  
 fN −1 
β3 β4 0 0 ... 0 0 β1 β2 fN
3.1 Wavelets de Daubechies 29

donde

  
α1 α2 α3 α4 0 0 ... 0 0 



 0 0 α1 α2 α3 α3 . . . 0 0 
  j/2
 ...  


 α3 α4 0 0 ... 0 0 α1 α2 

db21 (j) =  

 β1 β2 β3 β4 0 0 ... 0 0  



 0 0 β1 β2 β3 β4 . . . 0 0 
  j/2
... 


β3 β4 0 0 ... 0 0 β1 β2

Y nos da un computo total de O(N ) operaciones.

3.1.2 Daubechies db3

El buen comportamiento que presenta la transformada db2 para señales “sua-


ves” se puede mejorar añadiendo más condiciones, y por tanto más números
en las scaling o wavelets.

Conceptos básicos

Los valores que definen las scaling de db3 son

α1 := 0.332670552950083 α4 := −0.135011020010255
α2 := 0.806891509311092 α5 := −0.0854412738820267
α3 := 0.459877502118491 α6 := 0.0352262918857095

y los correspondientes para las wavelets se toman como

β1 := α6 , β2 := −α5 , β3 := α4 , β4 := −α3 , β5 := α2 , β6 := −α1 .


30 Familias de wavelets ortogonales

Con lo cual definimos las scaling y wavelets a nivel 1.


v11 := (α1 , α2 , α3 , α4 , α5 , α6 , 0, 0, . . . , 0)
v21 := (0, 0, α1 , α2 , α3 , α4 , α5 , α6 , 0, . . . , 0)
..
.
1
vN/2−1 := (α5 , α6 , 0, . . . , 0, α1 , α2 , α3 , α4 )
1
vN/2 := (α3 , α4 , α5 , α6 , 0, . . . , 0, α1 , α2 )
w11 := (β1 , β2 , β3 , β4 , β5 , β6 , 0, 0, . . . , 0)
w21 := (0, 0, β1 , β2 , β3 , β4 , β5 , β6 , 0, . . . , 0)
..
.
1
wN/2−1 := (β5 , β6 , 0, . . . , 0, β1 , β2 , β3 , β4 )
1
wN/2 := (β3 , β4 , β5 , β6 , 0, . . . , 0, β1 , β2 ).
Para, finalmente, generar las de niveles superiores mediante las correspondien-
tes fórmulas
v1m = α1 v1m−1 + α2 v2m−1 + α3 v3m−1 + α4 v4m−1 + α5 v5m−1 + α6 v6m−1
..
.
m−1 m−1 m−1
m
vN/2 m = α1 v
N/2m−1 −1
+ α2 vN/2 m−1 + α3 v1 + α4 v2m−1 + α5 v3m−1 + α6 v4m−1
w1m = β1 v1m−1 + β2 v2m−1 + β3 v3m−1 + β4 v4m−1 + β5 v5m−1 + β6 v6m−1
..
.
m−1 m−1 m−1
m
wN/2 m = β1 v
N/2m−1 −1
+ β2 vN/2 m−1 + β3 v1 + β4 v2m−1 + β5 v3m−1 + β6 v4m−1 .
A partir de aquí se definen las subseñales de tendencia, de fluctuaciones, la
descomposición ortogonal del MRA y la transformada como en el caso de Haar
y db2. Pero en esta ocasión se cumple una ecuación lineal más, concretamente
se tienen que
β1 + β2 + β3 + β4 + β5 + β6 = 0,
1β1 + 2β2 + 3β3 + 4β4 + 5β5 + 6β6 = 0,
1 β1 + 22 β2 + 32 β3 + 42 β4 + 52 β5 + 62 β6 = 0.
2

Esta última ecuación es precisamente la que permite mejorar el tratamiento


de señales con buenas condiciones de diferenciabilidad.
3.1 Wavelets de Daubechies 31

Característica de las fluctuaciones pequeñas

Si una señal es cuadrática en el soporte de una wavelet db3, al multiplicarla


escalarmente por ella nos saldrá 0, es decir, la correspondiente fluctuación es
nula. Si la señal es “aproximadamente” cuadrática a lo largo del soporte de la
wavelet, entonces la fluctuación asociada es “pequeña”.
En particular, si partimos de una señal que se obtiene como muestreo de una
analógica de clase C 3 en un cierto intervalo, y tomamos los puntos equidistantes
a distancia h, entonces las fluctuaciones son O(h3 ). La implicación clara de
este fenómeno es que, en lo que respecta a la compresión y eliminación del
ruido de señales de estas características, la transformada db3 tendrá un mejor
comportamiento que la db2 o la de Haar.
Sin embargo si, por ejemplo, lo que se pretendiera es localizar los puntos
donde la pendiente de la señal cambia más bruscamente (donde hay “picos”),
entonces db2 consigue ese objetivo de forma más eficiente que db3.

3.1.3 Daubechies dbJ


El resto de transformadas wavelet de Daubechies, dbJ con J = 4, 5, . . . , 10, se
definen de la misma manera cumpliendo la anulación de momentos de orden
superior. Por lo que los números scaling α1 , . . . , α2J son tales que

α12 + α22 + · · · + α2J


2
= 1,

α1 + α2 + · · · + α2J = 2

Y los números wavelet β1 , . . . , β2J se toman como

β1 = α2J , β2 = −α2J−1 , . . . , β2J−1 = α2 , β2J = −α1 .

Que además han de cumplir las ecuaciones de anulación de momentos

β1 + 2n β2 + 3n β3 + · · · + (2J)n β2J = 0, n = 0, 1, . . . , J − 1,

junto con las de ortogonalidad. La anulación de momentos es lo que permite


obtener fluctuaciones pequeñas. Concretamente, si tratamos mediante dbJ una
señal obtenida como muestreo de una analógica de clase C J , tomando el paso
igual a h, entones las fluctuaciones son O(hJ ).
32 Familias de wavelets ortogonales

3.2 Coiflets

Finalmente damos una descripción de las coiflets. Siguiendo la sugerencia de


Coifman, este tipo de wavelets ortogonales fueron construidas por Daubechies.
El objetivo era conseguir una aproximación mejorada entre los valores de las
tendencias y los de la señal original. Si definimos, en primer lugar, los números
scaling para coif1

√ √ √
1− 7 5+ 7 14 + 2 7
α1 := √ , α2 := √ , α3 := √ ,
16 2 16 2 16 2
√ √ √
14 − 2 7 1− 7 −3 + 7
α4 := √ , α5 := √ , α6 := √ .
16 2 16 2 16 2

Entonces las scaling y wavelets a nivel 1 se construyen, a diferencia de las db3,


como

v11 := (α3 , α4 , α5 , α6 , 0, . . . , 0, α1 , α2 )
v21 := (α1 , α2 , α3 , α4 , α5 , α6 , 0, 0, . . . , 0)
v31 := (0, 0, α1 , α2 , α3 , α4 , α5 , α6 , 0, . . . , 0)
..
.
1
vN/2 := (α5 , α6 , 0, . . . , 0, α1 , α2 , α3 , α4 )
w11 := (β3 , β4 , β5 , β6 , 0, . . . , 0, β1 , β2 )
w21 := (β1 , β2 , β3 , β4 , β5 , β6 , 0, 0, . . . , 0)
w31 := (0, 0, β1 , β2 , β3 , β4 , β5 , β6 , 0, . . . , 0)
..
.
1
wN/2 := (β5 , β6 , 0, . . . , 0, β1 , β2 , β3 , β4 ).

Las relaciones entre los numeros wavelet y los scaling son como en db3, es decir,

β1 := α6 , β2 := −α5 , β3 := α4 , β4 := −α3 , β5 := α2 , β6 := −α1 .


3.2 Coiflets 33

Y también son iguales las siguientes igualdades que se cumplían en la wavelet


db3, concretamente,

α12 + α22 + α32 + α42 + α52 + α62 = 1,



α1 + α2 + α3 + α4 + α5 + α6 = 2,
β1 + β2 + β3 + β4 + β5 + β6 = 0,
1β1 + 2β2 + 3β3 + 4β4 + 5β5 + 6β6 = 0,

junto con las igualdades de ortogonalidad. Sin embargo ahora tenemos que la
anulación del momento para términos cuadráticos no se cumple en las wavelets,
pero a cambio obtenemos las siguientes anulaciones de momentos en las scaling

−2α1 − 1α2 + 0α3 + 1α4 + 2α5 + 3α6 = 0,


(−2) α1 + (−1)2 α2 + 02 α3 + 12 α4 + 22 α5 + 32 α6 = 0.
2

Estas dos nuevas ecuaciones nos permiten llegar a una mejor aproximación
entre las tendencias y los valores originales de la señal. Concretamente, si
tomamos una señal f que sea el muestreo con paso h de una analógica de clase
C 3 , entonces √
a1j = 2f2j + O(h3 ), j = 1, . . . , N/2.
Las scaling y wavelets de orden superior se definen como cabría esperar, en
función de las del nivel anterior mediante las fórmulas recurrentes
m−1 m−1 m−1
v1m = α1 vN/2 m−1 −1 + α2 vN/2m−1 + α3 v1 +
α4 v2m−1 + α5 v3m−1 + α6 v4m−1 ,
v2m = α1 v1m−1 + α2 v2m−1 + α3 v3m−1 +
α4 v4m−1 + α5 v5m−1 + α6 v6m−1 ,
..
.
m m−1 m−1 m−1
vN/2 m = α1 v
N/2m−1 −3
+ α2 vN/2 m−1 −2 + α3 vN/2m−1 −1 +

m−1 m−1
α4 vN/2 m−1 + α5 v1 + α6 v2m−1 ,
m−1 m−1 m−1
w1m = β1 vN/2 m−1 −1 + β2 vN/2m−1 + β3 v1 +
β4 v2m−1 + β5 v3m−1 + β6 v4m−1 ,
w2m = β1 v1m−1 + β2 v2m−1 + β3 v3m−1 +
34 Familias de wavelets ortogonales

β4 v4m−1 + β5 v5m−1 + β6 v6m−1 ,


..
.
m m−1 m−1 m−1
wN/2 m = β1 v
N/2m−1 −3
+ β2 vN/2 m−1 −2 + β3 vN/2m−1 −1 +

m−1 m−1
β4 vN/2 m−1 + β5 v1 + β6 v2m−1 .

De esta manera las tendencias de orden superior aproximan la señal original



a2j ≈ 2f4j , a3j ≈ 2 2f8j , . . .

De forma análoga se pueden definir coif2, coif3, coif4, coif5.


La figura 3.2 nos muestra, para N = 214 y m = 11 varios vectores wavelet
de coif3 y varios vectores scaling de coif4.
11 11 11 11 11 11
Wavelets w2 , w4 y w7 Scaling v6 , v8 y v2

Figura 3.2: Para N = 214 y m = 11 a la izquierda las wavelets w211 , w411 y w711
de coif3 y a la derecha las scaling v611 , v811 y v211 de coif4.

3.3 Transformada de Fourier discreta y MRA


El análisis matemático del contenido en frecuencia de las señales es lo que se
conoce como el análisis de Fourier. En esta sección trataremos las nociones
básicas dentro del contexto de las señales discretas y su relación con el MRA.
Mediante el estudio del contenido en frecuencia se puede profundizar más en
el entendimiento de las wavelets. Para ello nos centraremos fundamentalmente
en el análisis de las transformadas.
Por conveniencia de notación en esta sección consideramos que el conjunto
de índices de las señales es {0, 1, . . . , N − 1} y que sus componentes se denotan
3.3 Transformada de Fourier discreta y MRA 35

por f (j) en vez de fj . Es decir


f = (f (0), f (1), . . . f (N − 1)).
El contenido en frecuencia de una señal discreta f se obtiene mediante la
transformada discreta de Fourier (DFT). Dicha transformada la denotaremos
por fˆ y sus valores se definen como
N
X −1
fˆ(k) := f (j)e−i2πkj/N .
j=0

Estos valores están definidos para cualquier valor k entero, no obstante nos
restringiremos a k = 0, 1, . . . , N − 1 por razones de periodicidad que ahora
describimos. Recordamos, en primer lugar, que la exponencial con valores pu-
ramente imaginarios se define como
eiθ := cos θ + i sen θ.
Esto nos lleva por tanto a la periodicidad de la DFT
fˆ(k + N ) = fˆ(k)
para todo entero k. Si nos quedamos con los N valores de la DFT tomados
anteriormente entonces ya tenemos descrita la transformada y así
ˆ: CN → CN , f 7→ fˆ,
teniendo eso si en cuenta la numeración de subíndices que hemos considerado
en la DFT por razones de conveniencia. Aparte de la propiedad de periodicidad,
esta transformación es lineal e invertible, siendo su fórmula de inversión
N −1
1 X ˆ
f (j) = f (k)ei2πkj/N ,
N
k=0

para j = 0, . . . , N − 1. Además se cumple la igualdad de Parseval


1
E(f ) = E(fˆ).
N
En la figura 3.3 tenemos las señales
f (x) = sen 4πx + 3 cos 24πx (a)
−x2
g(x) = e (1 + sen 24πx) (c)
36 Familias de wavelets ortogonales

(a) (b)
4
1000
2 500

0 0

−2 −500

−1000
−4
−10 0 10 −10 0 10

(c) (d)
2
60
1.5
40
1
0.5 20

0 0
−0.5
−20
−10 0 10 −10 0 10

Figura 3.3: (a) Señal f . (b) Valor absoluto de DFT de la señal f . (c) Señal g.
(d) Valor absoluto de DFT de la señal g.

muestreadas en el intervalo [−16, 16] con N = 1024 puntos, y sus DFT asocia-
das en valor absoluto ((b) y (d) respectivamente).

Como se puede observar en el primer caso hay unos “picos” en la DFT de la


señal (a) en los puntos ±2 y ±12, correspondientes a los periodos de las funcio-
nes en los sumandos, y en el segundo caso los tenemos en ±12, correspondiente
al seno, y también en el 0.

La DFT de una señal se puede calcular de forma rápida mediante un al-


goritmo. Este se conoce como la transformada rápida de Fourier (FFT). Si
realizamos de forma directa el cálculo de la DFT de una señal f muestreada
con N valores, entonces necesitamos hacer O(N ) operaciones para cada valor
fˆ(n). Teniendo en cuenta que la transformada también es una señal con N
valores, obtenemos un total de O(N 2 ) operaciones. Con la FFT se reduce el
número de operaciones a O(N log(N )).

Para cada señal f se define su espectro como la señal |fˆ|2 consistente en


tomar los cuadrados de los valores absolutos de la transformada. Observamos
3.3 Transformada de Fourier discreta y MRA 37

que, según la identidad de Parseval, como


N −1
1 X ˆ
E(f ) = |f (n)|2
N
n=0

entonces la energía de f resulta ser el valor medio del espectro de f .


A partir del espectro podemos analizar el efecto que produce el tratamiento
de señales mediante wavelets a nivel de frecuencia. En la figura 3.4 represen-
tamos los espectros de la primera scaling (a) y primera wavelet (b) a nivel 1
de coif2.
(a) (b)
3 3

2.5 2.5

2 2

1.5 1.5

1 1

0.5 0.5

0 0

−0.5 −0.5

−1 −1
−0.5 0 0.5 −0.5 0 0.5

Figura 3.4: (a) Espectro de la primera scaling coif2 a nivel 1. (b) Espectro de
la primera wavelet coif2 a nivel 1.

Como se puede apreciar, el espectro de la scaling se anula para frecuencias


altas y toma su máximo valor en frecuencias bajas. En el caso de la wavelet es
al contrario: su espectro alcanza el máximo en frecuencias altas y se anula en
la zona media correspondiente a baja frecuencia.
Para una mayor ilustración, tomamos la señal
2
g(x) = e−x (1 + sen 24πx)

muestreada en el intervalo [−16, 16] con N = 1024 puntos, la cual ya habíamos


considerado con anterioridad. En la figura 3.5 representamos en (a) el primer
promedio A1 del MRA mediante coif2. En (b) tenemos la representación de
los valores absolutos de la DFT de A1 . El primer detalle D1 es el gráfico (c),
y la representación de los valores absolutos de la DFT la tenemos en (d).
Recordemos que f se descomponía como f = A1 + D1 . Al aplicar la DFT
obtenemos un filtrado de frecuencias de f . En la DFT de A1 han sido separadas
38 Familias de wavelets ortogonales

(a) (b)
3 60

2 40

1 20

0 0

−1 −20
−10 0 10 −10 0 10

(c) (d)
3 30
2
20
1
0 10
−1
0
−2
−3 −10
−10 0 10 −10 0 10

Figura 3.5: (a) Promedio A1 de g. (b) Valores absolutos de DFT del promedio
A1 . (c) Detalle D1 de g. (d) Valores absolutos DFT del detalle D1 .

las bajas frecuencias y en la DFT de D1 las altas frecuencias. Esto es lo que


se conoce como filtros de paso bajo y paso alto, respectivamente.
Efectivamente, esto lo podemos verificar en general a partir de las fórmulas
de las señales de promedio y detalle y por la linealidad de la transformada de
Fourier discreta:

c1 = (f · v 1 )vb1 + · · · + (f · v 1 )vd
A 1
1 1 N/2 N/2
c1 + · · · + (f · w1 )w
c1 = (f · w1 )w
D [1
1 1 N/2 N/2 .

Si tenemos ahora en cuenta que el efecto de la transformada de Fourier sobre


una traslación cíclica de una determinada señal (como es el caso de las scaling y
wavelets al mismo nivel) tan sólo varía en multiplicar por elementos de módulo
unitario las entradas de la transformada de la señal sin trasladar, llegamos a
que en definitiva todas las wavelets al mismo nivel tienen idéntico espectro
entre sí, como ocurre con las scaling. Por tanto las igualdades anteriores nos
llevan a que A1 es una combinación de señales cuyo espectro se anula (o es muy
pequeño) en las altas frecuencias, mientras que D1 es combinación de señales
con espectro nulo en las frecuencias bajas.
3.3 Transformada de Fourier discreta y MRA 39

Conjuntando esto con los espectros de scaling y wavelet que habíamos ob-
tenido anteriormente deducimos que en el primer caso se tiene un filtro paso
bajo de los valores de la DFT de f , que solo permite los valores de frecuencia
baja, mientras que en el segundo caso representa un filtro paso alto de la DFT
de f que solo permite los valores de frecuencia alta.
A niveles superiores se cumplen las correspondientes fórmulas de descom-
posición, pero ahora hay que tener en cuenta que, mientras que vc m
j sigue siendo
nula en frecuencias altas, las transformadas w d m
j , m ≥ 2, se anulan para fre-
cuencias bajas, pero también en las muy altas. Es lo que se conoce por filtro
paso banda. Concretamente, se establecen un par de bandas de frecuencia que
son las que fundamentalmente estamos filtrando. En la figura 3.6 se represen-
tan los espectros de scaling a distintos niveles (desde 1 arriba, hasta 4 abajo)
a la izquierda, y los de wavelets (también desde 1 a 4) a la derecha. A partir
del segundo espectro de las wavelets podemos observar el fenómeno de filtrado
paso banda.

(a) (b)

1 1

0 0

−1 −1

−2 −2

−3 −3

−4 −4

−5 −5

−0.5 0 0.5 −0.5 0 0.5

Figura 3.6: (a) Espectros de las scaling v1k de la familia coif2 para k = 1, . . . , 4.
(b) Espectros de las wavelets w1k de la familia coif2 para k = 1, . . . , 4. Los
gráficos se han escalado con constantes 2−k y se han desplazado verticalmente.

Profundizando algo más en el análisis de frecuencias, se pueden establecer


40 Familias de wavelets ortogonales

las tres siguientes igualdades (ver la sección 3.1 de [2]) en el primer nivel

|vbk1 (j)|2 + |vbk1 (j + N/2)|2 = 2,

c1 (j)|2 + |w
|w c1 (j + N/2)|2 = 2,
k k

c1 (j + N/2) = 0,
c1 (j) + vb1 (j + N/2)w
vbk1 (j)w k k k

k = 1, . . . , N/2, j = 0, . . . , N/2 − 1, donde z̄ denota el complejo conjugado de


z (a + bi = a − bi).
De las dos primeras igualdades deducimos que las bajas frecuencias son
nulas (o casi nulas) si y solo si las altas tienen una gran magnitud, y viceversa.
De la tercera igualdad concluimos que una scaling tiene nulas o casi nulas altas
frecuencias si y solo si las wavelets tienen bajas frecuencias nulas o de pequeña
magnitud.
Aquí hay que resaltar que las igualdades anteriores se verifican para cual-
quier base ortonormal {v11 , . . . , vN/2
1 , w 1 , . . . , w 1 } tal que cada v 1
1 N/2 k+1 (respecti-
1 1 1
vamente, wk+1 ) se obtiene a partir del vk (resp., wk ) desplazando cíclicamente
sus entradas dos posiciones. Esto nos permite una forma sencilla de construc-
ción de familias de wavelets ortogonales, ya que se trataría de fijar un sistema
de vectores cumpliendo esas tres igualdades y aplicar a continuación la fórmula
de inversión de la transformada de Fourier.
Capítulo 4

Compresión de señales y
reducción de ruido

En los capítulos anteriores hemos observado el fenómeno de la compactación


de la energía al aplicar la transformada wavelet ya que esta se concentra funda-
mentalmente en la parte de la tendencia, mientras que las fluctuaciones tienen
magnitud menor. Esto constituye, en gran parte, el punto clave en la compre-
sión de señales y reducción del ruido.
El proceso, esencialmente común en ambos casos, lo podríamos esquemati-
zar de la siguiente manera:

Paso 1: Transformada. Realizar la transformada wavelet de la señal (con-


taminada o no) a un determinado nivel.

Paso 2: Cuantización. Los valores obtenidos en la señal transformada están


en un determinado intervalo y deben ser almacenados con precisión finita,
lo cual requiere de una “cuantización” de dichos valores pasando a estar
en un conjunto finito fijo. Este paso puede combinarse con una previa
umbralización, precisa en el caso de reducción del ruido y opcional para la
compresión, que consiste en anular aquellos valores que se encuentren en
un cierto intervalo alrededor del 0. Estos dos procesos conllevan pérdida
de información.

Paso 3: Codificación. Se trata de codificar en modo binario la señal obte-


nida en el paso anterior de manera que ocupe lo mínimo posible. Aquí

41
42 Compresión de señales y reducción de ruido

no hay pérdida de información. Este paso no es necesario si tan sólo


pretendemos la reducción del ruido.

En el primer paso de la transformada, según las condiciones de suavidad de


la señal, convendrá elegir las wavelets en consonancia con el suficiente número
de momentos nulos.
A continuación describiremos los pasos de cuantización y codificación con
detalle.

4.1 Cuantización y umbralizado


En el proceso de cuantización suponemos los valores de la señal transformada
en un intervalo de la forma [−α, α]. Incluso podemos restarle a la señal su valor
medio para que esté centrada en el 0. A continuación, si pretendemos cuantizar
a q niveles (q entero positivo par), tomamos δ := 2α/q y se define la función
de cuantización escalar uniforme
½
0 si |x| ≤ δ
Q(x) :=
sig(x)(k + 1/2)δ si kδ < |x| ≤ (k + 1)δ
Es decir, los valores que caen en cada subintervalo de la partición son
redondeados al punto medio. Al aplicarle a la señal la función de cuantización
Q(x), los valores los tomará ahora en el conjunto finito
½ ¾
q−1 q−3 q−3 q−1
− α, − α, . . . , 0, . . . , α, α .
q q q q

Si nuestro objetivo final es la compresión de la señal, la cuantización puede


combinarse con una previa umbralización o corte de aquellos valores que no
superen un cierto umbral. Para elegir el valor umbral hay que buscar un criterio.
Una forma es basarnos en la energía. Concretamente, si ordenamos en forma
decreciente los valores absolutos de la transformada de una señal f

y1 ≥ y 2 ≥ · · · ≥ y N

entonces vamos calculando sucesivamente los cocientes

y12 y12 + y22


, ,...
E(f ) E(f )
4.1 Cuantización y umbralizado 43

hasta que lleguemos a un valor lo suficientemente cercano a 1 como para ase-


gurar que captamos un porcentaje de energía adecuado. Por ejemplo podemos
establecer el valor 0.9999. De esta manera al aplicar la transformada inversa
posteriormente llegaremos a una aproximación de la señal original que contenga
el 99.99 por cien de la energía.
Sea j el primer índice tal que

y12 + y22 + · · · + yj2


≥ 0.9999.
E(f )

Tomamos, por tanto, como valor umbral T := yj .


En definitiva, una vez fijado el umbral T , se trata de anular los coeficientes
que no superan el umbral. Esto se hace mediante una función de umbralización.
El caso más simple consiste en anular los coeficientes por debajo del umbral
y dejar como están los restantes, lo que se concreta en la llamada función de
umbralización fuerte
½
0 si |x| ≤ T
Df (x) := .
x si |x| > T
Otro procedimiento alternativo, que tan sólo difiere en como afecta a los
coeficientes que superan el umbral, es mediante la umbralización suave

 0 si |x| ≤ T
Ds (x) := x − T si x > T .

x + T si x < −T
La umbralización es un paso preciso si nuestro objetivo es la reducción del
ruido. Por ruido nos referiremos a la alteración no deseada de los valores de la
señal original. Supondremos que dicho ruido es aditivo, es decir que

g =f +x

donde f es la señal original, x es el ruido añadido, y g es la señal contaminada


o alterada. Supondremos también que la señal de ruido x es aleatoria, también
llamado ruido blanco, y de media 0. Al realizar la transformada wavelet de
la señal g los coeficientes provenientes del ruido x, de altas frecuencias por
su componente aleatoria, se concentran en la porción de las fluctuaciones. Un
método simple de reducción del ruido consistiría en examinar visualmente la
porción de fluctuaciones en la transformada para establecer el umbral de corte.
44 Compresión de señales y reducción de ruido

Sin embargo se puede llegar a un proceso más sofisticado basándose en métodos


estadísticos.
La compresión y la reducción del ruido blanco están estrechamente rela-
cionados. Veremos como seleccionar el umbral de ruido en el caso (bastante
usual) de que el ruido sea gaussiano. Por otra parte, para poder efectuar una
reducción del ruido de forma adecuada hay que partir de la situación en que el
umbral T necesario para dicha reducción es menor que el que se precisa para
capturar la energía de la señal original (sin contaminar) de forma eficiente, en
otro caso podríamos estar eliminando coeficientes significativos de la señal. Es-
to va a depender del tipo de wavelet que estemos utilizando. En el ejemplo de
la figura 4.1 utilizamos la transformada db10. Se ha utilizado la señal generada
con la función
½ 2
t (2 − t)2 sen 8πt si 0 ≤ t ≤ 2
f (t) = ,
2(2 − t)(3 − t)2 sen 20πt si 2 ≤ t ≤ 3

muestreada con N = 4096 puntos. A esta señal se le ha añadido ruido blanco


gaussiano.

(a) (b)
2 2

1 1

0 0

−1 −1

−2 −2
0 1000 2000 3000 4000 0 1000 2000 3000 4000

(c) (d)
2 2

1 1

0 0

−1 −1

−2 −2
0 1000 2000 3000 4000 0 1000 2000 3000 4000

Figura 4.1: (a) Señal con ruido blanco. (b) Transformada db10 de 10 niveles
con umbral de ±0.227. (c) Valores de la transformada que han sobrevivido al
umbral. (d) Reconstrucción de la señal.
4.1 Cuantización y umbralizado 45

Si el ruido es gaussiano, es posible escoger el valor umbral T de forma


automática sin un conocimiento previo de la señal. En la figura 4.2 presen-
tamos el ruido gaussiano (a), su histogramas de frecuencias de valores (b), la
transformada db10 del ruido (c), y el histograma de dicha transformada (d).

(a) (b)
5 0.03

0.02

0 0.01

−5 −0.01
0.5 1 1.5 2 −100 −50 0 50 100
4
x 10
(c) (d)
5 0.03

0.02

0 0.01

−5 −0.01
0.5 1 1.5 2 −100 −50 0 50 100
4
x 10

Figura 4.2: (a) Ruido blanco gaussiano. (b) Histograma de frecuencias del
ruido. (c) Transformada db10 del ruido. (d) Histograma de frecuencias de la
transformada.

Como podemos observar los histogramas presentan la típica forma de cam-


pana gaussiana. Una de las consecuencias de estar trabajando con transforma-
ciones ortogonales es que se preserva la naturaleza gaussiana del ruido cuando
aplicamos la transformación. A partir de los histogramas deducimos que la
media es 0 y la desviación típica es σ = 0.056.
La idea es tomar T de forma que haya una alta probabilidad de estar justo
por encima del máximo nivel de los coeficientes que provienen del ruido. Un
resultado de Donoho y Johnstone (ver la sección 10.2.2 de [3] para más detalles)
cuantifica el valor óptimo del umbral mediante la fórmula
p
T =σ 2 log N .

En el ejemplo de la figura 4.1 la fórmula nos da un valor de T = 0.227.


46 Compresión de señales y reducción de ruido

Nos queda la cuestión de como estimar la desviación típica σ del ruido que
sea añadido a una cierta señal. La estrategia es la siguiente: Tomamos una
porción de la transformada de la señal contaminada que consista fundamental-
mente de valores provenientes del ruido (ese es el caso en general si tomamos
una porción de la primera fluctuación, ya que los valores transformados de
la señal sin contaminar que están en esa primera fluctuación deben tener una
magnitud pequeña). Estimamos σ a partir de esa porción de señal seleccionada.

4.2 Codificación
En el paso de la cuantización, junto con la posible umbralización, gran parte
de los coeficientes pasan a ser nulos. Esta información se almacena en lo que
llamaremos mapa de significancia. Los valores serán 1 (si el correspondiente
índice sobrevivió al corte) o 0 (si el índice correspondía a un valor menor que
el umbral). Este mapa de significancia contiene muchos ceros, en general, con
lo cual se comprime de forma eficiente con los métodos usuales de compresión
sin pérdida de información.
Un buen ratio de compresión lo alcanzaremos si tenemos en cuenta la en-
tropía. Hay que hacer notar que no todos los valores de la señal transformada
y cuantizada se repiten con la misma frecuencia. Esto lo podemos verificar
mediante un histograma de frecuencias. En consecuencia, asignar el mismo
número de bits a todos los valores es un gasto innecesario. Ciertamente po-
dremos alcanzar una mayor compresión si asignamos menos bits a los valores
que se repiten con mayor frecuencia, reservando más bits a los menos frecuen-
tes. Este proceso se puede precisar de forma matemática utilizando resultados
fundamentales en el campo de la teoría de la información. A continuación
expondremos algunas nociones básicas.
Supongamos que queremos codificar la siguiente secuencia de 16 números,
del 1 al 4:
2412212332213232 (4.1)
Esto lo podríamos hacer, por ejemplo, con 2 bits por número con las asig-
naciones 1 7→ 00, 2 7→ 01, 3 7→ 10, 4 7→ 11, resultando la secuencia de 32
bits:
01110001010001101001010010011001 (4.2)
Ahora bien, podemos observar que en la secuencia anterior de números hay al-
gunos mucho más frecuentes (como el 2) que otros. Una forma de codificación
4.2 Codificación 47

mucho más inteligente consistiría en asignar menos bits a los valores más fre-
cuentes y más bits a los menos frecuentes, pudiendo así obtener una secuencia
de bits codificada más corta. Por ejemplo, en la secuencia de números anterior
vemos que el 2 se repite 8 veces, el 3 lo hace 4 veces, el 1 tres veces y el 4
una vez. Si realizamos la siguiente asignación de bits 1 7→ 110, 2 7→ 0, 3 7→ 10,
4 7→ 111, nos resulta la siguiente secuencia codificada de 28 bits:

0111110001100101000110100100 (4.3)

Esto produce un ahorro del 12.5 %. Aquí hay que hacer una observación funda-
mental en lo que respecta a sistemas de codificación con asignación de longitud
variable de bits: Deben ser decodificables es decir, no tiene que existir ambi-
güedad en la decodificación. ¿Como conseguimos este objetivo? Basta con que
se cumpla la condición del prefijo: En una codificación de longitud variable
ningún símbolo puede tener asignada una secuencia de bits que sea prefijo de
la asignación de otro símbolo. Si nos fijamos en la codificación anterior, el 2
tiene asignado el 0, que no es prefijo de las secuencias del 1, 3 o 4, y el 3 tiene
asignado 10, que no es prefijo de las secuencias del 1 o el 4, por tanto se cumple
la condición del prefijo. Esta codificación del ejemplo se conoce como código
Huffman, descubierta por David A. Huffman en 1951 y que hoy es utilizada en
la transmisión comprimida de datos por internet, módem o fax! Esta codifi-
cación se puede sistematizar para secuencias arbitrarias de símbolos mediante
árboles binarios.
Si partimos de una determinada señal que, después del proceso de cuantiza-
ción, toma sus valores en el conjunto finito {vk , k = 1, . . . , n}, y que {pk }nk=1
son las frecuencias relativas de repetición de la sucesión {vk }nk=1 . En este caso
cada pk ∈ [0, 1] y
p1 + p2 + · · · + pn = 1.
Sea Lk la longitud de la secuencia de bits que se le asigna al valor vk mediante
un determinado sistema de codificación. La longitud media de bits asociada es

L := p1 L1 + p2 L2 + · · · + pn Ln .

Por ejemplo, si tomamos la señal formada por la secuencia (4.1), mediante la


codificación binaria de longitud fija (4.2), obtenemos L = 2. Pero si utilizamos
la codificación de Huffman (4.3), llegamos a L = 1.75.
Un resultado de Shannon nos indica que L no puede ser inferior a la en-
tropía. Este valor de entropía lo representaremos por H y entonces tenemos
48 Compresión de señales y reducción de ruido

que
L ≥ H := −p1 log2 p1 − p2 log2 p2 − · · · − pn log2 pn .

La cuestión es, en definitiva, como asignar las longitudes Lk para optimizar


el valor L, teniendo en cuenta la restricción dada por el teorema de Shannon.
Técnicas de codificación, como la codificación Huffman descrita, consiguen si-
tuar L entre H y H + 1. De hecho la aproximación es mejorable (con tendencia
asintótica a H) si agrupamos los símbolos en bloques adecuadamente y pos-
teriormente se aplica la codificación Huffman. Cabe mencionar que existen
códigos correctores de errores que introducen algo de redundancia, pero que
minimizan la transmisión de errores producidos por alteración de bits.
Veamos un ejemplo en la figura 4.3. La señal representada en (a) consiste en
la grabación de la palabra greasy, cuantizada a 8 bpp, tomando 16384 puntos.
La entropía es H = 5.43. Si codificamos directamente la señal con un buen
método de codificación podemos esperar 5.93 bpp, que representan un total de
unos 97000 bits al multiplicar por el número de puntos. Esto no nos conduce a
una compresión muy efectiva teniendo en cuenta los 8 bpp originales. Mediante
la codificación utilizando la transformada wavelet llegamos a una compresión
importante. Tomamos la transformada coif5 a nivel 14 (gráfico (c)).
A la derecha se representan los histogramas de la señal original (b), y de la
cuantización a 8 bits con umbralizado previo de los valores transformados (d).
La entropía, en el segundo caso, es de 4.34. Según el estimador establecido, un
buen método de codificación de la señal transformada y cuantizada nos dará
una longitud media de bits no superior a 4.84. Ahora tenemos en cuenta que
hay 3922 valores que superan el umbral en la transformada, lo que nos llevaría
a un total de
3922 · 4.84 ≈ 18922 bits.

Cuando se aplica la transformada inversa a los valores de la transformada


cuantizados, la señal resultante es prácticamente indistinguible de la original.
De hecho, todavía se puede mejorar la compresión. Recordemos que ha-
bíamos cuantizado con umbralizado previo toda la transformada de la señal
anterior a 8 bpp, para después codificar en función de la entropía del histo-
grama correspondiente. Si, como método alternativo, hubiéramos cuantizado
la parte de la tendencia a 8 bpp, la de las fluctuaciones a 6 bpp (lógico, pues el
intervalo donde éstos valores se encuentran es claramente más pequeño que el
de la tendencia), y además hubiéramos analizado por separado los histogramas
de la tendencia y de las fluctuaciones a distintos niveles, observaríamos que la
4.3 Medidas de la aproximación 49

(a) (b)
0.3
100
0.2
50

0 0.1

−50
0
−100
−0.1
5000 10000 15000 −100 −50 0 50 100

(c) (d)
500 0.4

0.3

0.2
0
0.1

0
−500 −0.1
5000 10000 15000 −100 −50 0 50 100

Figura 4.3: (a) Señal original “greasy”. (b) Histograma de la cuantización de los
niveles de intensidad de “greasy” a 8 bits. (c) Transformada coif5 de “greasy”
de 14 niveles. (d) Histograma de la cuantización a 8 bits con umbralizado previo
de los valores de la transformada

entropía en las fluctuaciones es menor, con lo cual podemos codificar por sepa-
rado las subseñales de fluctuación cuantizadas llegando a una cantidad de bpp
menor. Por ejemplo, con esta modificación aplicada a la transformada coif5
de nivel 4 de la señal anterior, llegamos a una compresión de 11305 bits.

4.3 Medidas de la aproximación

Una vez completados los tres pasos del proceso anterior, mediante la transfor-
mada inversa obtenemos una aproximación de la señal original. En un buen
número de aplicaciones es conveniente cuantificar el grado de aproximación
entre señales. Existen distintas formas de medir este grado de aproximación,
dos de las medidas más utilizadas son el error cuadrático medio (error RMS)
y la relación señal-ruido (SNR).
Dadas dos señales f y g, el error cuadrático medio entre f y g está dado
50 Compresión de señales y reducción de ruido

por
r p
(f1 − g1 )2 + (f2 − g2 )2 + · · · + (fN − gN )2 E(f − g)
RMS(f, g) := = √ ,
N N
y la relación señal-ruido, medida en decibelios, por la expresión
PN 2
i=1 fi
SNR(f, g) := 10 log10 PN .
i=1 (fi − gi )2

Ambas medidas son muy utilizadas en el campo del tratamiento de la se-


ñal. El error RMS, debido a su sencillez, será la fórmula más habitual que
utilizaremos para estimar el grado de aproximación entre señales.
Capítulo 5

Wavelet packets

En esta sección estudiaremos transformadas ortogonales basadas en wavelets


pero con una estructura en árbol diferente, de hecho lo que hacemos es com-
pletar el árbol binario. Este tipo de transformadas son las wavelet packets.
En ellas seguiremos calculando las tendencias al igual que lo hacíamos
con las wavelets, pero difiere en el hecho que no guardamos las fluctuaciones
obtenidas en pasos anteriores sino que también las transformamos.
A modo introductorio veremos como es el proceso con la transformada
wavelet packet asociada a las transformada de Haar, la cual se conoce como
transformada de Walsh.
Sea H1 la transformada de Haar de primer nivel. Al actuar sobre una señal
f producimos una subseñal de tendencia a1 y otra de fluctuaciones d1 , es decir,
H1 (f ) = (a1 |d1 ).
La transformada de Walsh de nivel 1, llamémosle Wh1 , actúa de la misma
manera
Wh1 (f ) = (a1 |d1 ) = H1 (f ).
Para el siguiente nivel aplicaremos una transformada de Haar a la subseñal de
tendencia y también a la de fluctuaciones: ahí radica la diferencia.
Wh2 (f ) = (H1 (a1 )|H1 (d1 )) = (a2 |d2 |H1 (d1 )).
Si denotamos H1 (d1 ) = (d1,a |d1,d ), donde d1,a es la subseñal de tendencia a
primer nivel de la señal d1 y d1,d es la subseñal de fluctuaciones a nivel 1 de la
señal d1 , entonces
Wh2 (f ) = (a2 |d2 |d1,a |d1,d ).

51
52 Wavelet packets

Cada una de las 4 subseñales anteriores tiene la misma longitud N/4.


El proceso se repite para niveles superiores de manera que vamos calculando
en cada paso las tendencias y fluctuaciones de cada una de las subseñales que
tenemos en el paso anterior. Para el nivel 3 tendríamos

Wh3 (f ) = (H1 (a2 )|H1 (d2 )|H1 (d1,a )|H1 (d1,d ))


= (a3 |d3 |d2,a |d2,d |d1,a,a |d1,a,d |d1,d,a |d1,d,d ).

Comparando la transformada de Haar con la de Walsh, con esta última se


suele conseguir una mayor compresión de la energía. La razón de ello reside en
que al computar fluctuaciones de fluctuaciones podemos obtener más términos
nulos o cercanos a cero.
Matricialmente podemos expresar la transformada de Walsh de primer ni-
vel al igual que la de Haar, y para niveles superiores se descompone en un
producto de matrices ortogonales en bloques, los cuales son matrices de Haar.
Concretamente, si denotamos por H̄(k) a la matriz ortogonal k × k asociada a
la transformada de Haar H1 , entonces tenemos

   H̄( N ) 
.. 2j−1
0 ... 0
 .   0 H̄( N
) ... 0 
 Whj (f )  =  2j−1 
    .. ...
.. 0 ... . 0 
. 0 0 ... N
H̄( 2j−1 )
 
..
· ¸
H̄( N2 ) 0  . 
... H̄(N ) 
 f 

0 H̄( N2 ) ..
.

Como estamos realizando un producto de matrices ortogonales, se seguirá cum-


pliendo la ley de conservación de la energía. Por otra parte invertir el proceso
consistirá simplemente en trasponer matrices.
El nivel máximo de transformada que podemos alcanzar, si N = 2n , es
igual a n = log2 N . Por tanto a lo sumo tenemos un producto de log2 N
matrices. Cada una de ellas genera un número de operaciones no superior a
3N . En definitiva esto nos da un cómputo total de O(N log N ) operaciones
para realizar la transformada de Walsh de un determinado nivel, al igual que
con la transformada rápida de Fourier, pero superior al número de operaciones
necesario con la transformada wavelet que era O(N ).
53

El proceso que hemos descrito con la transformada de Walsh es análogo si


tomamos una transformada wavelet distinta (por ejemplo dbI, coifJ).
Posibles ventajas al aplicar la transformada wavelet packet, comparada con
la transformada wavelet, se concretan en un ratio de compresión generalmente
mejor. Cabría ponderar en cada caso las posibles ventajas de estas mejoras con
el hecho de tener que realizar un número superior de operaciones.
Concluimos diciendo que el método adoptado por el FBI para la compresión
de huellas digitales, llamado método WSQ, es un híbrido entre la transformada
wavelet y la wavelet packet.
Capítulo 6

La transformada wavelet
continua

En este capítulo analizaremos la transformada wavelet continua. En primer


lugar el espacio de señales donde trabajaremos serán las señales definidas en
toda la recta real de energía finita. Concretamente, señales f ∈ L2 (R), es decir
tales que Z
E(f ) := |f (t)|2 dt < ∞.
R

Los valores que toman las señales pueden ser complejos (f : R → C). El
producto escalar definido en L2 (R) está dado por
Z
f · g := f (t)g ∗ (t)dt, f, g ∈ L2 (R),
R

donde g ∗ (t) denota el conjugado de g(t).


La transformada de Fourier para señales de módulo integrable es
Z
fˆ(w) := f (t)e−iwt dt.
R

Esta transformada se extiende por completitud a L2 (R).


El producto de convolución de f y g es
Z
f ∗ g(u) := f (t)g(u − t)dt, u ∈ R.
R

55
56 La transformada wavelet continua

En lo que sigue supondremos que la señal scaling cumple que tiene media 1,
es decir, Z
φ(t)dt = 1,
R
y que la señal wavelet tiene media cero, es decir,
Z
ψ(t)dt = 0.
R

Además también supondremos que ambas están normalizadas de forma que

E(φ) = E(ψ) = 1.

Por ejemplo, la wavelet de Haar se define como



 1, 0 ≤ t ≤ 1/2
ψH (t) := −1, 1/2 < t ≤ 1 .

0, t 6∈ [0, 1]

La correspondiente función scaling es


½
1, t ∈ [0, 1]
φH (t) := .
0, t ∈
6 [0, 1]

Otro ejemplo interesante viene dado por la wavelet sombrero mejicano


µ ¶
2 t2 −t2
ψ(t) := √ 1 − 2 e 2σ2 .
π 1/4 3σ σ

La figura 6.1 muestra su representación gráfica.


A partir de la wavelet madre ψ obtenemos las wavelets “hijas” mediante
cambios de escala y traslaciones, es decir,
µ ¶
1 t−u
ψu,s (t) := √ ψ , u ∈ R, s > 0.
s s

Con esta definición las hijas también están normalizadas y tienen media cero.
La transformada wavelet continua de una señal f se define como
Z µ ¶
1 ∗ t−u
W f (u, s) := f · ψu,s = f (t) √ ψ dt = f ∗ ψ̄s (u), u ∈ R, s > 0,
R s s
57

0.8

0.6

0.4

0.2

−0.2

−0.4
−8 −6 −4 −2 0 2 4 6 8

Figura 6.1: Wavelet madre “sombrero mejicano”.

donde µ ¶
1 −t
ψ̄s (t) := √ ψ ∗ .
s s
En realidad la cantidad W f (u, s) mide la variación de f en un entorno de u
de magnitud proporcional a s.
En la figura 6.2 tenemos una señal f (t) y debajo la transformada wavelet
mediante el sombrero mejicano. Ha de tenerse en cuenta que la notación en el
entorno matemático MATLAB (usado para generar las figuras) es

Ca,b = W f (b, a) = W f (posición, escala).

Evidentemente se observa que hay una redundancia de información al com-


putar la transformada wavelet continua puesto que pasamos de una señal uni-
dimensional a una bidimensional. Bajo ciertas condiciones generales se puede
establecer una fórmula de inversión. Para ello supondremos a partir de ahora
que la wavelet tiende a cero en el infinito con suficiente rapidez, lo cual lo
cuantificaremos mediante la expresión
Z
(1 + |t|)|ψ(t)|dt < ∞.
R

En estas condiciones se cumple la siguiente fórmula de inversión para cualquier


señal f ∈ L2 (R):
Z Z µ ¶
1 1 t−u ds
f (t) = W f (u, s) √ ψ du 2 , t ∈ R.
Cψ [0,∞] R s s s
58 La transformada wavelet continua

1.5
1
0.5
0
−0.5
−1
−1.5
500 1000 1500 2000 2500 3000 3500 4000

Absolute Values of Ca,b Coefficients for a = 512 445.7219 388.0234 337.794 294.0668 ...
2.297397
3.482202
5.278032
8
12.12573
scales a

18.37917
27.85762
42.22425
64
97.00586
147.0334
222.8609
337.794
512
500 1000 1500 2000 2500 3000 3500 4000
time (or space) b

Figura 6.2: Señal original y transformada wavelet continua con mexh.

La constante Cψ es la condición de admisibilidad dada por la expresión


Z
|ψ̂(t)|2
Cψ := dt,
[0,∞] t

la cual es finita en nuestro contexto de trabajo.


También se cumple la siguiente ley de conservación de la energía:
Z Z Z
1 ds
2
|f (t)| dt = |W f (u, s)|2 du 2 .
R Cψ [0,∞] R s

Por otra parte, a partir de la scaling padre podemos definir las scaling
“hijos” correspondientes mediante
µ ¶
1 t−u
φu,s (t) := √ φ , u ∈ R, s > 0.
s s

La señal de aproximación de f a escala s es entonces

Lf (u, s) := f · φu,s , u ∈ R.
59

A partir de la fórmula de inversión anterior se puede probar que, para una


escala fija s0 , obtenemos que
Z Z µ ¶
1 1 t−u ds
f (t) = W f (u, s) √ ψ du 2 +
Cψ [0,s0 ] R s s s
Z µ ¶
1 1 t−u
Lf (u, s0 ) √ φ du, t ∈ R.
s0 Cψ R s0 s0

En la expresión anterior la segunda integral correspondería a la aproxima-


ción y la primera a los detalles.
Con la transformada wavelet continua estamos también realizando un fil-
trado de la señal. Para ello tenemos en cuenta la fórmula

\
(f ∗ g)(w) = fˆ(w)ĝ(w).

Fijando una escala s > 0, entonces

df (w) = (f\
W c̄(w).
∗ ψ̄s )(w) = fˆ(w)ψ s

Si consideramos, por ejemplo, la wavelet sombrero mejicano, la cual es simétri-


ca, entonces ψ̄ˆs es real, y la igualdad anterior se convierte en un producto de
transformadas de Fourier. Multiplicar por la transformada de la wavelet som-
brero mejicano a distintas escalas significa realizar un filtrado de frecuencias
sobre la señal. En la figura 6.3 damos los gráficos de espectros del sombrero
mejicano para diversas escalas.

−8 −6 −4 −2 0 2 4 6 8

Figura 6.3: Espectros de la wavelet sombrero mejicano a distintas escalas.


60 La transformada wavelet continua

Al multiplicar los anteriores espectros por fˆ estamos dando una descom-


posición de esta última en distintas bandas de frecuencia. Las bandas corres-
pondientes a frecuencias altas son las asociadas a escalas pequeñas. Es decir,
hay una relación inversa entre los valores de escala y los de frecuencia.
Veamos un ejemplo más que analizaremos con la wavelet de Morlet. La
wavelet de Morlet madre se define por
−t2
ψ(t) := e 2 cos(5t).

La figura 6.4 muestra su representación gráfica.

0.8

0.6

0.4

0.2

−0.2

−0.4

−0.6

−0.8

−1
−8 −6 −4 −2 0 2 4 6 8

Figura 6.4: Wavelet madre Morlet.

Tomemos la señal discreta f generada al muestrear la señal


2
(2 sen(a1 x) + cos(a2 x))e−b1 (x−c1 ) +
2
sen(a3 x)e−b3 (x−c3 ) +
2
(sen(a1 x) + 2 cos(a2 x))e−b2 (x−c2 )

en el intervalo [0, 1] con N = 2048 analógica, donde a1 = 40π, a2 = 80π,


a3 = 60π, b1 = 80π, b2 = 40π, b3 = 50π, c1 = 0.25, c2 = 0.75 y c3 = 0.5.
La figura 6.5 muestra la gráfica de la señal y debajo el escalograma (trans-
formada wavelet continua) de dicha señal tomando la wavelet de Morlet.
Podemos observar como se detectan las bandas de frecuencia que correspon-
den a a1 y a2 en la primera y tercera subseñales. Las bandas de frecuencia que
corresponden a a3 se detectan en la segunda subseñal. Es decir, en definitiva
el escalograma provee un retrato tiempo-frecuencia de la señal.
61

−2

−4
0 0.2 0.4 0.6 0.8 1

Absolute Values of Ca,b Coefficients for a = 1 1.5 2 2.5 3 ...


128
118
108
98
88
78
68
scales a

61
56
51
46
41
36
31
26
21
16
11
6
1
200 400 600 800 1000 1200 1400 1600 1800 2000
time (or space) b

Figura 6.5: Señal original y su escalograma con morl.


Apéndice A

MATLAB y la “Wavelet
Toolbox”

La “Wavelet Toolbox” es una herramienta para el tratamiento de señales e


imágenes mediante wavelets. Se ejecuta dentro del entorno MATLAB por lo que
es necesario tener instalado previamente este programa (así como la toolbox)
en nuestro ordenador. Aquellos lectores que deseen aspectos básicos sobre el
uso de MATLAB pueden consultar su manual [4]. Para el uso de la herramienta
específica de wavelets recomendamos también el manual oficial [5].

A.1 MATLAB
No pretendemos hacer aquí una descripción de los comandos y las posibilidades
que tiene el programa MATLAB, tan solo vamos a comentar aquellas órdenes
que serán utilizadas para poder analizar señales que pueden estar en formato
MATLAB, o puede ser necesario manipularlas para que MATLAB trabaje con
ellas .

A.1.1 Breve (muy breve) introducción


El programa MATLAB utiliza aritmética de doble precisión (“double”) para
todas sus operaciones, es decir, todos los números son representados interna-
mente usando 8 bytes. Esto nos obliga a preparar nuestros datos antes de poder
analizarlos en el entorno gráfico.

63
64 MATLAB y la “Wavelet Toolbox”

Cuando se comienza el programa, éste crea un espacio de trabajo llamado


“work space”. Para saber qué variables tenemos en este espacio teclee

who

Si además queremos información del tamaño de estas variables y del tipo


de datos que contienen podemos teclear

whos

Suponiendo que tengamos una variable a que contiene una matriz de n filas
por m columnas, si escribimos

a(i:j,k:l)

el programa extrae la submatriz con filas desde la i a la j y columnas desde la


k a la l. Para los vectores fila tan sólo hay que especificar la columna y para
los vectores columna sólo la fila.
Si deseamos guardar una sesión para después continuar con nuestro traba-
jo exactamente en el mismo punto debemos usar los comandos save y load
seguido del nombre del archivo. Este archivo estará en formato MATLAB y su
extensión será *.mat
Si olvidamos cómo es la sintaxis de una orden siempre se puede recurrir a
la ayuda “on line” del programa escribiendo

help comando

Alternativamente se puede usar la ayuda picando con el ratón en el botón


“Help” de la barra de menús del programa.

A.1.2 Representación de señales


Todas las señales que analicemos estarán representadas como vectores fila o
columna. Estas señales pueden proceder de aparatos de medida, representación
de funciones, etc. Naturalmente antes de analizar la señal hay que preparar
los datos y cambiarlos a un formato que sea apropiado para MATLAB. A
continuación veremos algunos casos concretos que suelen ser habituales.
A.1 MATLAB 65

Datos en un fichero ASCII


Supongamos que nos llegan los valores numéricos en ASCII de una señal que
deseamos tratar en un fichero llamado sig1.txt, es decir, el fichero sig1.txt
tiene 1024 datos ordenados en una columna y cada fila corresponde a un dato.
En la dirección URL http://www.upv.es/frechet/wavelets pueden encon-
trarse los materiales del curso, entre otros, el fichero sig1.txt Debe guardarse
en la carpeta C:\Mis Documentos. Para cargarlo en MATLAB usaremos la
orden
load ’C:\Mis Documentos\sig1.txt’ -ascii
Si inspeccionamos ahora el espacio de trabajo de MATLAB veremos que
ha creado una variable llamada sig1 con los valores del fichero. Además es un
vector columna y el formato de cada valor es de doble precisión. Si lo deseamos
ahora podemos duplicar esa variable. Por ejemplo para duplicarla con nombre
nsig1 escribiremos
nsig1 = sig1;
El punto y coma al final de la orden es importante para que el programa
suprima la respuesta de la evaluación de la orden y no escriba todos los datos
que representa la variable. A continuación salvaremos la variable en un fichero
con formato MATLAB escribiendo
save ’C:\Mis Documentos\nsig1’ nsig1

Observación A.1 Para no tener que especificar siempre la ruta para llegar
al fichero (tanto para leer como para grabar) podemos añadir esa ruta al path
del programa MATLAB. Esto se puede hacer seleccionando la ruta deseada
en el campo Current Directory. Si no aparece en la lista puede buscarse
picando en el cuadrado con tres puntos que hay a la derecha. Seleccionar la
carpeta C:\Mis Documentos.
Ahora tenemos un fichero nsig1.mat que puede ser cargado en el entorno
gráfico de la “wavelets toolbox” para el análisis de la señal. También podemos
guardar los datos en otro fichero en formato ASCII.
save ’nsig1.txt’ nsig1 -ascii

Si los datos de la señal vienen en un fichero pero escritos en una fila, el


procedimiento es el mismo aunque hay que trasponer la matriz para convertirla
en un vector columna. La orden para trasponer una matriz es
66 MATLAB y la “Wavelet Toolbox”

matriz’;

Una vez los datos son un vector fila o columna, representarlos gráficamente
es sencillo con la orden plot.
plot(nsig1);
(véase la figura A.1)

0.8

0.6

0.4

0.2

−0.2

−0.4

−0.6

−0.8

−1
0 200 400 600 800 1000 1200

Figura A.1: Un ejemplo de plot().

Datos creados a partir de una función


Algunas veces puede ser conveniente “fabricar” la señal a partir de una función
dada (para docencia, pruebas, ejemplos, simulaciones, etc). Para ello evalua-
remos la función en ciertos puntos y con el resultado construiremos la señal.
Veamos como se hace con un ejemplo práctico.

Ejemplo A.2 Generar una señal con 1024 datos evaluados con la función

g(x) = 20x2 (1 − x)4 cos(12πx)

en el intervalo [0, 1].


La forma trivial de hacerlo es con una estructura bucle for. Cuando el
número de evaluaciones es grande se recomienda construir el vector usando un
método llamado “vectorization”, el cuál es mucho más efectivo y más rápido.
Ilustraremos el segundo método por ser el más estándar. También hay que
notar que este método crea señales que son vectores fila. Pueden transponerse
si se desea para que sean vectores columna.
A.1 MATLAB 67

x = 0:1/1023:1;
signal = (20*x.^2).*((1-x).^4).*cos(12*pi*x);

La diferencia entre el operador multiplicación * y el “punto multiplicación”


.* es importante. Cuando MATLAB lee * hace una multiplicación usual de
matrices (incluido el caso de escalar por matriz); cuando utilizamos .* el pro-
grama realiza un producto de matrices o vectores componente a componente.
Esta misma regla se aplica a las potencias ^ y .^.
La representación gráfica de los vectores se puede hacer con el comando
plot. La porción del plano XY que queremos representar se fija con la orden
axis().
plot(signal);
axis([0 1024 -0.5 0.5]);
(véase la figura A.2)

0.5

0.4

0.3

0.2

0.1

−0.1

−0.2

−0.3

−0.4

−0.5
0 200 400 600 800 1000

Figura A.2: Señal creada a partir de la función g(x).

En MATLAB es usual escribir una orden por línea aunque si deseamos


escribir varios comandos en la misma línea se deben separar con ;. Por ejemplo,
los comandos para dibujar la figura A.2 también se pueden escribir
plot(signal); axis([0 1024 -0.5 0.5]);
Finalmente hay que mencionar que para eliminar las variables definidas se
debe usar el comando clear var, donde var es el nombre de la variable que se
desea eliminar. Cuando se quiere eliminar todas las variables definidas en el
entorno de trabajo se usa clear sin especificar ninguna variable. Es conveniente
usarlo antes de empezar un ejercicio que es independiente de los anteriores. De
esta manera nos evitaremos interferencias con variable usadas previamente.
68 MATLAB y la “Wavelet Toolbox”

A.2 La “Wavelet Toolbox”


La “Wavelet Toolbox” es una herramienta para el tratamiento de señales e
imágenes mediante wavelets. Se ejecuta dentro del entorno MATLAB por lo que
es necesario tener instalado previamente este programa (así como la toolbox)
en nuestro ordenador.

A.2.1 Wavelets 1-D desde la línea de comandos (primeros pa-


sos)
Supondremos que la señal está almacenada en un fichero sig.mat en un vector
columna. Obtener el fichero sig.mat de la página web del curso y guardarlo
en la carpeta Mis Documentos o crear la variable a partir de la función

g(x) = 20x2 (1 − x)4 cos(12πx)

muestreada con 2048 puntos en el intervalo [0, 1].

clear;
load ’sig’;
s = sig;
ls = length(s);

Para calcular la primera tendencia y la primera fluctuación deberemos efec-


tuar los productos escalares con las wavelets y las scaling de nivel 1.

[C,L] = wavedec(s,1,’haar’)[a b];

La función wavedec calcula los productos escalares de la señal con las wa-
velets y las scaling de nivel 1 y almacena los valores de la tendencia y la
fluctuación en un solo vector llamado C; el vector L contiene las longitudes. La
orden necesita tres argumentos, el primero es la señal, el segundo los niveles
de descomposición y el tercero es la wavelet a utilizar. Ahora debemos extraer
los coeficientes de la tendencia y la fluctuación para formar las subseñales.

cA1 = appcoef(C,L,’haar’,1);
cD1 = detcoef(C,L,1);

Para representar gráficamente los valores se usa la orden plot que ya men-
cionamos en A.1.2. Por ejemplo, para representar la tendencia y la fluctuación
escribiremos
A.2 La “Wavelet Toolbox” 69

plot(cA1);
axis([1 length(cA1) -1 1]);
plot(cD1);
axis([1 length(cD1) -0.25 0.25]);
(véase la figura A.3)

1 0.25

0.8 0.2

0.6 0.15

0.4 0.1

0.2 0.05

0 0

−0.2 −0.05

−0.4 −0.1

−0.6 −0.15

−0.8 −0.2

−1 −0.25
200 400 600 800 1000 200 400 600 800 1000

Figura A.3: Tendencia y fluctuación de la señal sig.mat.

Aunque en la figura A.3 aparecen las dos gráficas una al lado de la otra,
en realidad MATLAB las muestra de una en una en una misma ventana que
MATLAB abre para mostrar el resultado de la orden plot. Para que sean
representadas en una misma ventana se usa subplot como se muestra a con-
tinuación.

subplot(1,2,1);
plot(cA1);
title(’Tendencia’);
axis([1 length(cA1) -1 1]);
subplot(1,2,2);
plot(cD1);
title(’Fluctuación’);
axis([1 length(cD1) -0.25 0.25]);

Para construir la primera señal promedio y la primera señal de detalle del


análisis de multirresolución debemos usar estos valores como coeficientes en
las bases de wavelets y de scaling. Para esta tarea se dispone del comando
wrcoef. Acepta cinco argumentos: el primero indica si queremos aproximacio-
nes o detalles, el segundo y tercero son los coeficientes y las longitudes de las
subseñales que produjo la orden wavedec, el cuarto es la wavelet a utilizar y por
70 MATLAB y la “Wavelet Toolbox”

último el nivel de aproximación o detalle que deseamos calcular. Finalmente


representaremos las dos señales en una única ventana.

A1 = wrcoef(’a’,C,L,’haar’,1);
D1 = wrcoef(’d’,C,L,’haar’,1);
subplot(1,2,1);
plot(A1);
title(’Promedio’);
axis([1 ls -1 1]);
subplot(1,2,2);
plot(D1);
title(’Detalle’);
axis([1 ls -0.1 0.1]);
(véase la figura A.4)

Promedio Detalle
1 0.1

0.8 0.08

0.6 0.06

0.4 0.04

0.2 0.02

0 0

−0.2 −0.02

−0.4 −0.04

−0.6 −0.06

−0.8 −0.08

−1 −0.1
500 1000 1500 2000 500 1000 1500 2000

Figura A.4: Reconstrucción de las señales promedio y detalle de primer nivel


de la señal sig.mat.

Observación A.3 Cuando el número de comandos es grande y se va a utilizar


repetidamente es conveniente hacer uso de la herramienta que permite guardar
una serie de comandos en un archivo M-file. Estos archivos tienen extensión
*.m y contienen las órdenes que escribiríamos en la línea de comandos de MAT-
LAB. Para ejecutar un archivo de comandos de MATLAB debemos escribir el
nombre del archivo (no es necesario escribir la extensión) en la línea de coman-
dos del programa. En este tipo de archivos es conveniente incluir comentarios
que ayuden a recordar las acciones de algunos comandos, de esta manera será
mucho más sencillo modificarlos. Los comentarios siempre deben comenzar por
A.2 La “Wavelet Toolbox” 71

% comentario.... El programa no evaluará el texto que se escriba desde el %


hasta el final de la línea. Si la orden que pretendemos escribir es demasiado
larga y deseamos partirla en varias líneas, esto se puede hacer escribiendo ...
en el punto de la línea donde deseemos cortar la orden. También se puede ha-
cer uso de herramientas de depuración cuando nuestras órdenes no realizan la
tarea deseada aunque no entraremos en la explicación de estas herramientas.
El uso fundamental que nosotros daremos a estos ficheros es la posibilidad de
escribir un conjunto de órdenes de MATLAB en un proceso automatizado que
puede ser usado repetidas veces con posiblemente pequeñas modificaciones.
Finalmente una observación respecto de los ficheros M-file que vamos a
incluir en este texto. Como ya hemos mencionado es habitual escribir una orden
por línea e incluir comentarios para hacer el código más comprensible. Nosotros
escribiremos en algunos casos varias órdenes por línea con la idea de que los
códigos no ocupen tantas líneas y en la impresión quede excesivo espacio “en
blanco”.

Las subseñales tendencia (señales promedio) y subseñales fluctuación (se-


ñales detalle) a niveles superiores se obtienen de manera similar. Veamos el
ejemplo anterior llegando a nivel 3 y haremos uso del archivo de comandos
ana_nivel_3.m.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% File ana_nivel_3.m
%% Análisis wavelet de una señal hasta nivel 3
%% La variable s contiene la señal a analizar

w = ’haar’; % Fijamos la wavelet


n = 3; % Niveles

[C,L] = wavedec(s,n,w); % Descomposición de la señal

% Extraemos los valores de la tendencia y de


% las fluctuaciones del vector C.
cA1 = appcoef(C,L,w,1);
cA2 = appcoef(C,L,w,2);
cA3 = appcoef(C,L,w,3);
cD1 = detcoef(C,L,1);
cD2 = detcoef(C,L,2);
cD3 = detcoef(C,L,3);
72 MATLAB y la “Wavelet Toolbox”

% Representamos estos coeficientes.


figure;
subplot(3,2,1); plot(cA1); title(’Tendencia a nivel 1’);
axis([1 length(s)/2 -1.5 1.5]);
subplot(3,2,2); plot(cD1); title(’Fluctuación a nivel 1’);
axis([1 length(s)/2 -0.03 0.03]);
subplot(3,2,3); plot(cA2); title(’Tendencia a nivel 2’);
axis([1 length(s)/2 -1.5 1.5]);
subplot(3,2,4); plot(cD2); title(’Fluctuación a nivel 2’);
axis([1 length(s)/2 -0.03 0.03]);
subplot(3,2,5); plot(cA3); title(’Tendencia a nivel 3’);
axis([1 length(s)/2 -1.5 1.5]);
subplot(3,2,6); plot(cD3); title(’Fluctuación a nivel 3’);
axis([1 length(s)/2 -0.03 0.03]);

% Reconstruimos a continuación las señales promedio y detalles


A1 = wrcoef(’a’,C,L,w,1);
A2 = wrcoef(’a’,C,L,w,2);
A3 = wrcoef(’a’,C,L,w,3);
D1 = wrcoef(’d’,C,L,w,1);
D2 = wrcoef(’d’,C,L,w,2);
D3 = wrcoef(’d’,C,L,w,3);

% Representamos estas señales en una nueva ventana.


subplot(3,2,1); plot(A1); title(’Promedio a nivel 1’);
axis([1 length(s) -0.5 0.5]);
subplot(3,2,2); plot(D1); title(’Detalle a nivel 1’);
axis([1 length(s) -0.02 0.02]);
subplot(3,2,3); plot(A2); title(’Promedio a nivel 2’);
axis([1 length(s) -0.5 0.5]);
subplot(3,2,4); plot(D2); title(’Detalle a nivel 2’);
axis([1 length(s) -0.02 0.02]);
subplot(3,2,5); plot(A3); title(’Promedio a nivel 3’);
axis([1 length(s) -0.5 0.5]);
subplot(3,2,6); plot(D3); title(’Detalle a nivel 3’);
axis([1 length(s) -0.02 0.02]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cuando ejecutamos este fichero obtendremos dos ventanas con los gráficos
de la figura A.5.
A.2 La “Wavelet Toolbox” 73

Tendencia a nivel 1 Fluctuacion a nivel 1 Promedio a nivel 1 Detalle a nivel 1


0.5 0.02
1 0.02
0.01

0 0 0 0

−0.01
−1 −0.02
−0.5 −0.02
200400600 8001000 2004006008001000 500 100015002000 500 100015002000
Tendencia a nivel 2 Fluctuacion a nivel 2 Promedio a nivel 2 Detalle a nivel 2
0.5 0.02
1 0.02
0.01

0 0 0 0

−0.01
−1 −0.02
−0.5 −0.02
2004006008001000 2004006008001000 500 100015002000 500 100015002000
Tendencia a nivel 3 Fluctuacion a nivel 3 Promedio a nivel 3 Detalle a nivel 3
0.5 0.02
1 0.02
0.01

0 0 0 0

−0.01
−1 −0.02
−0.5 −0.02
2004006008001000 2004006008001000 500 100015002000 500 100015002000

Figura A.5: Análisis de tres niveles de la señal sig.mat. Las dos columnas de
la izquierda representan las subseñales tendencia y fluctuación y las dos de la
derecha las señales promedio y detalles.

Ejercicio A.4 Dadas las funciones

1. f (x) = 1

2. f (x) = x2 (1 − x)

3. f (x) = x4 (1 − x)6 cos(64πx)

4. f (x) = 1(0.2 < x < 0.3) − 3(0.4 < x < 0.5) + 2(0.5 < x < 0.8)

5. f (x) = sgn(sin(12πx))
74 MATLAB y la “Wavelet Toolbox”

realizar con cada una de ellas las siguientes tareas:

• Crear señales de longitud 2048 que representen cada función en el inter-


valo [0, 1].

• Obtener las subseñales tendencia y fluctuación utilizando la wavelet de


Haar hasta nivel cuatro. Imprimir una hoja con las ocho gráficas.

• En la señal fluctuación de nivel 1 (representado por cD1 en la notación de


los ejemplos anteriores), obtener un vector que tenga un 1 en la posición i-
ésima si la correspondiente i-ésima coordenada de cD1 es no nula (soporte
o mapa de “significancia” de la subseñal cD1).

• Para cada función contar cuantos unos hemos obtenido en el paso an-
terior. Para hacer esto basta con sumar las coordenadas del soporte o
mapa de significancia.

• Ordenar las funciones por número de elementos no nulos en la subseñal


fluctuación de nivel 1. Relacionar el orden obtenido con la naturaleza de
las señales analizadas.

Para realizar este ejercicio se puede tomar el fichero ana_nivel_3.m y mo-


dificarlo adecuadamente.

A.2.2 Wavelets 1-D desde el entorno gráfico (primeros pasos)


La “Wavelet Toolbox” también tiene un entorno gráfico que resulta potente y
sencillo de usar. Debe hacerse notar que el método explicado anteriormente
ofrece más control sobre el análisis de una señal mediante wavelets que hacer
el análisis en el entorno gráfico. En el otro lado de la balanza tenemos que el
entorno gráfico es más sencillo de utilizar. Por ejemplo, desde la herramienta
gráfica no es posible visualizar las subseñales tendencia y fluctuación.
Vamos ahora a repetir los ejercicios anteriores desde el entorno gráfico. Es
importante notar que las señales a analizar deben estar disponibles en archivos
*.mat antes de poder analizarlas desde la herramienta gráfica. Tanto si estamos
“creando” una señal a partir de una función o si nos llega en fichero *.txt u
otro formato, los datos deben ser tratados adecuadamente hasta obtener una
señal fila o columna que será guardada en un archivo *.mat. Este archivo podrá
ser leído posteriormente desde el entorno gráfico.
En primer lugar debemos cargar la herramienta gráfica.
A.3 Programando algunas funciones en MATLAB 75

wavemenu

A continuación se abrirá una ventana para seleccionar la acción que desea-


mos realizar. A partir de este momento el entorno gráfico se usa de la manera
habitual con el ratón. Por este motivo no nos excederemos de todas y cada una
de las opciones en esta breve introducción.

1. Seleccionamos Wavelet 1D.

2. Cargar la señal grabada en el fichero sig.mat con Load—signal.

3. Seleccionamos la wavelet a utilizar (haar) y los niveles (3).

4. Seleccionamos Analyze.

5. Usar los distintas maneras de visualizar las señales promedio y los detalles
(en la figura A.6 tenemos el análisis con método Full decomposition
de visualización).

6. Seleccionar Histograms y ver los histogramas de frecuencias de las dis-


tintas señales o subseñales. Notar que en este caso se pueden obtener
histogramas tanto de la señal aproximación (señal detalle) como de la
subseñal tendencia (fluctuación).

Ejercicio A.5 Con la herramienta gráfica de la “Wavelet Toolbox” tomar las


señales creadas en el ejercicio A.4 y hacer un análisis de las mismas, experi-
mentando las distintas opciones del entorno gráfico.

A.3 Programando algunas funciones en MATLAB


Cuando se pretende hacer una tarea repetidas veces es conveniente definir
una función en MATLAB que realice esta tarea y que pueda ser invocada de
una manera sencilla y rápida. Es conveniente seguir algunas recomendaciones
básicas.

• Asegurarse de que MATLAB no posee ya programada esa tarea.

• Escoger un nombre para la función que sea nemotécnico.


76 MATLAB y la “Wavelet Toolbox”

Decomposition at level 3 : s = a3 + d3 + d2 + d1 .
0.4
0.2

s 0
−0.2
−0.4
0.4
0.2
a3 0
−0.2
−0.4

0.02

d3 0

−0.02

0.01

d2 0

−0.01

0.01

d1 0

−0.01

200 400 600 800 1000 1200 1400 1600 1800 2000

Figura A.6: Análisis wavelet de la señal sig.mat con la haar y 3 niveles (Full
decomposition display mode).

• Estudiar detenidamente los argumentos de la función (“input”) y el re-


sultado (“output”) de la misma.

• Escribir las correspondientes explicaciones de ayuda.

• Utilizar el máximo número de funciones de MATLAB que el programa


original tiene.

Con estas recomendaciones y la ayuda que el programa ofrece para el co-


mando function hacer los siguientes ejercicios.

Ejercicio A.6 Programar una función llamada energy que acepte como ar-
gumento una señal y calcule, como resultado, la energía de la señal.
A.3 Programando algunas funciones en MATLAB 77

Ejercicio A.7 Programar una función llamada cumenergy que acepte como
argumento una señal y calcule, como resultado, su perfil de energía acumulada.
Esto es, el resultado será otra señal del mismo tamaño que represente el perfil
de energía acumulada (normalizada) de la señal original.

Ejercicio A.8 Programar una función llamada rms que tenga como argumen-
to dos señales y que calcule, como resultado, el error cuadrático medio (RMS)
entre las dos señales.
Como estas funciones serán de gran utilidad en el resto de los ejercicios
incluimos aquí unos archivos con la programación de las funciones. En este
tipo de archivo la primera línea será el nombre de la función que debe coincidir
con el nombre del archivo y la sintaxis de la función.

Archivo: energy.m

function [y] = energy(x)


%ENERGY Computes the energy of a signal.
% y = ENERGY(x) returns the energy of x.
% The energy computed as the sum of the
% square of the elements of x.

% See also CUMENERGY.

y = norm(x)^2;

Archivo: cumenergy.m

function [y] = cumenergy(x)


%CUMENERGY Computes the normalized cumulative energy profile.
% y = CUMENERGY(x) creates a vector y with the normalized
% cumulative energy profile of vector x.

% See also ENERGY.

y = cumsum(x.^2)/(norm(x)^2);
78 MATLAB y la “Wavelet Toolbox”

Archivo: rms.m

function [e] = rms(x,y)


%RMS Computes the RMS error of two signals.
% e = RMS(x,y) returns the RMS error between x and y.
% Signals x and y must have same size.

e = sqrt(norm(x-y)^2/length(x));
Apéndice B

Ejercicios

Los ejercicios incluidos en este apéndice complementan los capítulos dedicados


a la exposición teórica. Se han clasificado en secciones que de alguna manera
siguen el desarrollo teórico del curso. Antes de comenzar los ejercicios resultará
conveniente trabajar el apéndice A en el que se dan los conceptos básicos sobre
el uso de MATLAB y su “Wavelet Toolbox”.

B.1 Transformada de Haar de una señal


Dada una señal s, podemos calcular su transformada de Haar desde la línea
de comandos. La señal transformada queda almacenada en el vector (C) si
utilizamos la notación de los ejercicios anteriores. Esta señal puede ser dibujada
con plot. Debe notarse que no es posible dibujar la transformada desde la
herramienta gráfica. Veamos un ejemplo: supongamos que la variable s contiene
la señal del fichero sig.mat que también puede ser creada como se explicó en
la sección A.2.1.

[C,L] = wavedec(s,1,’haar’);
plot(C);
axis([0 length(s) -1 1]);
(véase la figura B.1)

Si queremos hacer dos transformadas consecutivas y observar la acumula-


ción de energía en la parte correspondiente a la tendencia haremos lo siguiente.

[C,L] = wavedec(s,2,’haar’);

79
80 Ejercicios

0.8

0.6

0.4

0.2

−0.2

−0.4

−0.6

−0.8

−1
0 500 1000 1500 2000

Figura B.1: Transformada de Haar de 1 nivel de la señal sig.mat.

subplot(2,2,1);
plot(s);
axis([0 length(s) -1 1]);
title(’Señal’);
subplot(2,2,2);
plot(cumenergy(s));
axis([0 length(s) -0.5 1.5]);
title(’Perfil energía acum.’);
subplot(2,2,3);
plot(C);
axis([0 length(s) -1 1]);
title(’Transformada nivel 2’);
subplot(2,2,4);
plot(cumenergy(C));
axis([0 length(s) -0.5 1.5]);
title(’Perfil energía acum. transf.’);
(véase la figura B.2)

Ejercicio B.1 Con las señales generadas en el ejercicio A.4 calcular transfor-
madas de Haar de diferentes niveles y construir gráficos similares al de la figura
B.2.

B.2 Compresión de señales (primeros pasos)


Veamos un ejemplo de compresión de señales siguiendo el esquema dado en el
capítulo 4. Supondremos que la variable s contiene la señal del fichero sig.mat
B.2 Compresión de señales (primeros pasos) 81

Señal Perfil energía acum.


1 1.5

0.5 1

0 0.5

−0.5 0

−1 −0.5
0 500 1000 1500 2000 0 500 1000 1500 2000

Transformada nivel 2 Perfil energía acum. transf.


1 1.5

0.5 1

0 0.5

−0.5 0

−1 −0.5
0 500 1000 1500 2000 0 500 1000 1500 2000

Figura B.2: Señal sig.mat y su transformada de Haar de nivel 2. A la derecha


tenemos sus perfiles de energía acumulada.

que puede bajarse de la página web del curso o crearse muestreando la fun-
ción dada al comienzo de la sección A.2.1 (ya se usó anteriormente). Para la
compresión usaremos el fichero compress.m que incluimos a continuación. Este
fichero puede ser fácilmente modificado para posteriores ejercicios.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero compress.m
%% Archivo de comandos para comprimir una señal
%% La variable externa s contiene la señal

%%%%%%%% Parámetros a fijar %%%%%%%%%%%%%%%%%%%%%%


ls = length(s); % Longitud de la señal
w = ’haar’; % Fijamos la wavelet
n = 10; % Niveles de descomposición
thr_met = ’h’; % Método threslholding
en_cons = 0.9999; % Porcentaje energía a conservar

[C,L] = wavedec(s,n,w); % Descomposición

% Reordenamos valores absolutos transformada (decrecientes)


82 Ejercicios

C_dec = abs(sort(-abs(C)));
% Índice hasta acumular un porcentaje prefijado de energía
% Los 1 de esta variable son los índices de los valores que sobran
ind_sobran = find(cumenergy(C_dec)>=en_cons);
% Valor correspondiente al primer índice que sobra es el umbral
umbral = C_dec(ind_sobran(1)); % Valor umbral (threshold)
% Anulamos valores de la transformada que no pasan el umbral
C_sob = wthresh(C,thr_met,umbral);
s_rec = waverec(C_sob,L,w); % Recomponemos la señal

% Gráfico de las dos señales


figure;
subplot(2,1,1); plot(s);
axis([1 ls min(s) max(s)]); title(’Original’);
subplot(2,1,2); plot(s_rec);
axis([1 ls min(s_rec) max(s_rec)]); title(’Reconstrucción’);

% Calculamos algunos datos sobre la compresión


% Error RMS entre la señal original y la reconstruida
error = rms(s,s_rec);
map = C_sob~=0; % Mapa de significancia
val_sig = sum(map); % Valores significantes
% Factor de compresión (real y en forma aproximada)
[comp,err] = sprintf(’%d:%d’,ls,val_sig);
[comp_ap,err] = sprintf(’%d:%d’,round(ls/val_sig),1);

%% Resumen de resultados
[l_long_orig,err] = sprintf(’Longitud original: %d \n’,ls);
[l_val_sig,err] = sprintf(’Valores significativos: %d \n’,val_sig);
[l_comp,err] = sprintf(’Factor compresión de %s \n’,comp);
[l_comp_ap,err] = sprintf(’\t (aproximadamente de %s) \n’,comp_ap);
[l_rms,err] = sprintf(’Error RMS: %d \n’,error);
sprintf(’%s%s%s%s%s’,...
l_long_orig,l_val_sig,l_comp,l_comp_ap,l_rms)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cuando ejecutamos este fichero obtendremos los gráficos de la figura B.3 y


además nos muestra el siguiente resumen de resultados.

Longitud original: 2048


Valores significativos: 573
B.2 Compresión de señales (primeros pasos) 83

Factor compresión de 2048:573


(aproximadamente de 4:1)
Error RMS: 1.764582e-003

original
0.4

0.2

−0.2

−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000

reconstrucción
0.4

0.2

−0.2

−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.3: En el gráfico de la izquierda tenemos la señal original sig.mat. A


la derecha se representan la reconstrucción de la señal después de comprimirla.

Ejercicio B.2 Comprimir cada una de las funciones del ejercicio A.4 conser-
vando el 99.99 % de la energía. Utilizar la wavelet de Haar y el nivel máximo de
transformadas que sea posible. Para cada señal comprimida hacer el siguiente
análisis.

1. Dibujar la señal original y la señal reconstruida a partir de la compresión.


2. Calcular el error cometido (RMS).
3. Contar el número de elementos de la transformada que son nulos, esto
es, el complementario de los que han sobrevivido al corte.
4. Calcular el factor de compresión de la señal (tomaremos como factor de
compresión número de datos que tiene la señal original y el número de da-
tos no nulos de la transformada que sobrevivieron al umbral, expresados
en formato N:M; además se suele normalizar M a 1).
84 Ejercicios

Ejercicio B.3 Repetir el ejercicio anterior utilizando la herramienta gráfica.


Con el método de “Global threshold” los resultados deben ser similares. Inten-
tar mejorar la compresión con el método de “By level thresholding”. Mejorar
en el sentido de misma energía retenida pero mayor número de ceros en la
transformada después de eliminar aquellos valores que no pasan el umbral o
umbrales fijados.

Ejercicio B.4 Construir señales de 1024 datos en el intervalo [0, 10] para cada
una de las siguientes funciones.
(a) f (x) = x
(b) f (x) = 2[2 < x < 4] − 2[5 < x < 7] + 2[8 < x < 9]
(c) f (x) = 2[2 < x < 4] − x[5 < x < 7] + 2[8 < x < 9]
(d) f (x) = x(10 − x)
1. Calcular el factor de compresión para cada señal utilizando la wavelet de
Haar y reteniendo el 99.99 % de la energía original. Calcular el error entre
la señal original y la reconstruida a partir de la transformada después de
eliminar los valores que no pasaron el umbral.
2. Calcular el factor de compresión para cada señal utilizando la wavelet
(db2) y reteniendo el 99.99 % de la energía original. Calcular el error entre
la señal original y la reconstruida a partir de la transformada después de
eliminar los valores que no pasaron el umbral.
3. Calcular el factor de compresión para cada señal utilizando la wavelet
(coif1) y reteniendo el 99.99 % de la energía original. Calcular el error
entre la señal original y la reconstruida a partir de la transformada des-
pués de eliminar los valores que no pasaron el umbral.
4. Basado en los cálculos anteriores argumentar qué wavelet es más apro-
piada para comprimir cada señal.
Ejercicio B.5 Para las funciones (b) y (c) del ejercicio B.4 tomar los 50 co-
eficientes mayores en valor absoluto de la transformada de Haar y calcular su
transformada inversa. ¿Qué señal reconstruida es la que mejor se aproxima a
la original y por qué?
Calcular el error cometido en el intervalo [2.5, 3.5] y en [5.5, 6.5]. ¿Por qué
son los dos errores similares en el intervalo [2.5, 3.5] y no en [5.5, 6.5]?
B.3 Otras wavelets ortogonales: Daubechies y Coiflets 85

B.3 Otras wavelets ortogonales: Daubechies y Coi-


flets
En esta sección pretendemos “visualizar” la mejoría que supone el uso de la
transformada wavelet con Coiflets respecto de las Daubechies. Esta mejoría hay
que entenderla en el sentido de que la tendencia “reproduzca” mejor la señal
original. Antes de ello necesitamos explicar algunas consideraciones propias del
programa MATLAB.
Tomemos una señal y calculemos transformadas de nivel 1 con las wavelets
db2 y coif1. A continuación inspeccionamos las longitudes de las subseñales
tendencia. Observaremos que estas longitudes no son la mitad de la señal
original. Esto ocurre porque MATLAB añade algunos coeficientes “extra” para
asegurar la perfecta reconstrucción de la señal original. Estos problemas tienen
relación con los valores de la señal en los bordes. Hay varios métodos para
minimizar esta perturbación aunque nosotros deseamos precisamente que el
programa no añada ningún coeficiente.
En MATLAB existe una variable global que le dice al programa qué mé-
todo debe utilizar para minimizar la distorsión producida en los bordes de
la señal. Se trata del “Discrete Wavelet Transform Extension Mode”. La
orden dwtmode, sin argumentos nos dirá qué modo de extensión está activo.
Para que MATLAB calcule tendencias y fluctuaciones de exactamente la
mitad de la señal original debemos asegurarnos en primer lugar que estamos
trabajando con señales de longitud par (en nuestro caso una potencia de 2).
También debe usarse el DWT Extension Mode llamado per. Debemos por tanto
asegurarnos de que está activo o activarlo con el siguiente comando.
dwtmode(’per’)

Ejercicio B.6 Consideremos la función

g(x) = 20x2 (1 − x)4 cos(12πx)

definida en el intervalo [0, 1].

1. Construir una señal de 214 datos muestreando g(x) en el intervalo [0, 1].
2. Extraer la subseñal tendencia de nivel 2 para la wavelet db2.
3. Construir la señal que representa la función 2g(4x) en el intervalo [0, 1]/4
con 214 /22 datos.
86 Ejercicios

4. Comparar la subseñal tendencia con esta nueva señal, tanto visualmente


como calculando el error entre ellas (error máximo y RMS).

5. Repetir los últimos tres pasos con la wavelet coif1.

6. Comparar los resultados obtenidos.

Para la realización de los ejercicios B.6, B.7 y B.8 se puede usar el archivo
de comandos daub_coif.m. Este archivo se muestra a continuación para el
ejercicio B.6. Cuando es ejecutado aparece la figura B.4 y este resumen de
resultados.

Error máximo para la db2 2.172051e-003


Error máximo para la coif1 2.302663e-008
Error rms para la db2 8.966900e-004
Error rms para la coif1 1.918157e-009

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero: daub_coif.m
%% Órdenes para ilustrar la mejoría de las coiflets
%% respectos de las daubechies en algunos casos
%%%%
%% El DWT Extension Mode debe ser ’per’
%%%%
clear;

%% Señal(t)
t1 = 0:(1-0)/(2^14-1):1;
s1 = 20*(t1.^2).*((1-t1).^4).*cos(12*pi*t1);
n = 2; % Niveles

w1 = ’db2’; % Wavelet
[C1,L1] = wavedec(s1,n,w1); % Descomposición de la señal
tend_w1 = appcoef(C1,L1,w1,n); % Tendencia

% (sqrt(2)^n)*Señal((2^n)*t) en 1/(2^n)*dominio
t2 = t1(1:(2^n):length(t1))/(2^n);
s2 = (sqrt(2)^n)*(20*((2^n*t2).^2)...
.*((1-(2^n*t2)).^4).*cos(12*pi*(2^n*t2)));

figure;
B.3 Otras wavelets ortogonales: Daubechies y Coiflets 87

subplot(3,1,1); plot(s2);
axis([1 length(s2) min(s2) max(s2)]);
[tit,err] = sprintf(’Gráfica de sqrt(2)^%d g(2^%d x)’,n,n);
title(tit);
subplot(3,1,2); plot(tend_w1);
axis([1 length(tend_w1) min(tend_w1) max(tend_w1)]);
[tit_w1,err] = sprintf(’Tendencia de g(x) a nivel %d con %s’,n,w1);
title(tit_w1);
max_error_w1 = max(abs(tend_w1-s2));
rms_error_w1 = rms(tend_w1,s2);

w2 = ’coif1’; % Wavelet
[C2,L2] = wavedec(s1,n,w2); % Descomposición de la señal
tend_w2 = appcoef(C2,L2,w2,n); % Tendencia

subplot(3,1,3); plot(tend_w2);
axis([1 length(tend_w2) min(tend_w2) max(tend_w2)]);
[tit_w2,err] = sprintf(’Tendencia de g(x) a nivel %d con %s’,n,w2);
title(tit_w2);
max_error_w2 = max(abs(tend_w2-s2));
rms_error_w2 = rms(tend_w2,s2);

%% Resultados
[l_max_err_w1,err] = sprintf(...
’Error máximo para la %s %d \n’,w1,max_error_w1);
[l_max_err_w2,err] = sprintf(...
’Error máximo para la %s %d \n’,w2,max_error_w2);
[l_rms_err_w1,err] = sprintf(...
’Error rms para la %s %d \n’,w1,rms_error_w1);
[l_rms_err_w2,err] = sprintf(...
’Error rms para la %s %d \n’,w2,rms_error_w2);
sprintf(’%s%s%s%s’,...
l_max_err_w1,l_max_err_w2,l_rms_err_w1,l_rms_err_w2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.7 Consideremos la función

g(x) = 20x2 (1 − x)2 cos(64πx) + 30x2 (1 − x)4 sen(30πx)

definida en el intervalo [0, 1].


88 Ejercicios

Gráfica de sqrt(2) 2 g(22 x)

0.5

−0.5

500 1000 1500 2000 2500 3000 3500 4000


Tendencia de g(x) a nivel 2 con db2

0.5
0
−0.5
500 1000 1500 2000 2500 3000 3500 4000
Tendencia de g(x) a nivel 2 con coif1

0.5
0
−0.5
500 1000 1500 2000 2500 3000 3500 4000

Figura B.4: De arriba a abajo tenemos la función 2g(4x), la tendencia a nivel


2 con la db2 y finalmente la tendencia al mismo nivel con la coif1

1. Construir una señal de 214 datos muestreando g(x) en el intervalo [0, 1].
2. Extraer la subseñal tendencia de nivel 3 para la wavelet db2.

3. Construir la señal que representa la función 2 2g(8x) en el intervalo
[0, 1]/8 con 214 /23 datos.
4. Comparar la subseñal tendencia con esta nueva señal, tanto visualmente
como calculando el error entre ellas.
5. Repetir los últimos tres pasos con la wavelet coif1.
6. Comparar los resultados obtenidos.

Ejercicio B.8 Repetir el ejercicio con las wavelets db3, db10. ¿Puedes ob-
servar el mismo fenómeno?

B.4 Dibujando wavelets and scaling


Nuestro propósito es dibujar de una manera sencilla las wavelets y las scaling
de los distintos niveles. Para ello se proponen una serie de ejercicios de experi-
B.4 Dibujando wavelets and scaling 89

mentación, con dimensión “pequeña”. La idea es obtener algunas conclusiones


por exploración directa sobre los resultados y, finalmente, generalizar estos re-
sultados a cualquier dimensión. Antes de comenzar necesitamos fijar le “DWT
Extension Mode” a ’per’.
dwtmode(’per’)

Ejercicio B.9 Supongamos que estamos en el espacio RN con N = 23 , es


decir, todas nuestras señales tendrán 8 coordenadas. Utilizar el fichero llamado
wave_scal.m como base para realizar las siguientes acciones.

1. Fijar la wavelet a utilizar como la de ’haar’.

2. Fijar el número de niveles de descomposición a 1.

3. Construir una señal de zeros de longitud N .

4. Calcular su transformada wavelet de Haar de nivel 1. El vector C conten-


drá los coeficientes de la transformada y L es el vector de longitudes (en
este caso con valores 22 , 22 , 23 ).

5. Cambiar el vector C de la transformada de la señal al vector de la base


canónica e1 , es decir, contiene un 1 en la posición 1 y ceros en las restantes
7 posiciones.

6. Calcular la transformada wavelet inversa de Haar de nivel 1 de la señal


C. Dibujar la señal reconstruida con la orden stem y anotar los resultados
observados.

7. Repetir los dos últimos pasos con los restantes vectores de la base canó-
nica ei , con i = 2, . . . , 8.

Cuando se ejecuta el fichero wave_sca.m se obtiene la figura B.5.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero wav_sca.m
%% Para construir scaling y wavelets
%%%%%%%%
%% El DWT Extension Mode debe ser ’per’
%%%%%%%%
clear;
90 Ejercicios

−1 −1
H1 (e1) H1 (e5)
1 1

0.5 0

0 −1
0 2 4 6 8 0 2 4 6 8
H−1(e ) H−1(e )
1 2 1 6
1 1
0.5 0
0 −1
0 2 4 6 8 0 2 4 6 8
H−1(e ) H−1(e )
1 3 1 6
1 1
0.5 0
0 −1
0 2 4 6 8 0 2 4 6 8
H−1(e ) H−1(e )
1 4 1 8
1 1
0.5 0
0 −1
0 2 4 6 8 0 2 4 6 8

Figura B.5: Valores de las señales reconstruidas utilizando la transformada


inversa de Haar con N = 23 .

k = 3; N = 2^k;
m = 1; % Niveles
w = ’haar’; % Wavelet

% Construimos L a partir de una señal de ceros


s = zeros(1,N);
[C,L] = wavedec(s,m,w);

C = zeros(size(C)); % Anulamos los valores


i = 1; C(i) = 1; s_rec = waverec(C,L,w);

figure;
subplot(4,2,1); stem(s_rec);
title(’H_1^-1(e_1)’);

C=zeros(size(C)); % Anulamos los valores


i = 2; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,3); stem(s_rec);
B.4 Dibujando wavelets and scaling 91

title(’H_1^-1(e_2)’);

C = zeros(size(C)); % Anulamos los valores


i = 3; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,5); stem(s_rec);
title(’H_1^-1(e_3)’);

C = zeros(size(C)); % Anulamos los valores


i = 4; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,7);
stem(s_rec); title(’H_1^-1(e_4)’);

C = zeros(size(C)); % Anulamos los valores


i = 5; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,2); stem(s_rec);
title(’H_1^-1(e_5)’);

C = zeros(size(C)); % Anulamos los valores


i = 6; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,4); stem(s_rec);
title(’H_1^-1(e_6)’);

C = zeros(size(C)); % Anulamos los valores


i = 7; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,6); stem(s_rec);
title(’H_1^-1(e_6)’);

C = zeros(size(C)); % Anulamos los valores


i = 8; C(i) = 1; s_rec = waverec(C,L,w);

subplot(4,2,8); stem(s_rec);
title(’H_1^-1(e_8)’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.10 Repetir el ejercicio anterior con 2 niveles de transformada, es


decir, el vector de longitudes L tiene valores 2, 2, 22 , 23 . Observar los resultados
92 Ejercicios

y buscar diferencias o similitudes con el ejercicio anterior.

Ejercicio B.11 Repetir el ejercicio anterior con 3 niveles de transformada.


Observar los resultados y buscar diferencias o similitudes con el ejercicio ante-
rior.

Ejercicio B.12 Generalizar los resultados anteriores. Esto es, supongamos


que tenemos el espacio RN , con N = 2n (tendremos n niveles de transformada
wavelet como máximo).
Si tomamos un vector cualquiera de la base canónica de RN , por ejemplo
ei (con i = 1, . . . , N ), y calculamos su transformada wavelet inversa de nivel
m (m ≤ n) ¿Qué señal obtendremos?
Para contestar el ejercicio completar el siguiente esquema


 ......... i = .........


 ......... i = .........
−1 
DW Tm ......... i = .........
ei , i = 1, . . . , N 7−→

 .. ..

 . .


......... i = .........

Ejercicio B.13 Tomar ahora N = 210 = 1024.


1 , w1 , v 2 ,
(a) Para la wavelet db2 calcular las señales scaling y wavelets v25 20 4
3 5 6
w4 , w2 , v 4 .

(b) Repetir el apartado anterior con la wavelet coif1.

B.5 Compresión de señales y cuantización


En esta sección ampliaremos las herramientas de compresión de señales in-
cluyendo el tema de la cuantización uniforme y codificación. El proceso de
cuantizar los datos puede ser programado sin dificultad en MATLAB y así lo
haremos en el ejercicio B.14. Para el proceso de codificación (al codificar tam-
bién cuantizaremos) vamos a utilizar funciones que no pertenecen a la “Wavelet
Toolbox” sino a la “Communications Toolbox” que también deberá estar dispo-
nible en nuestro entorno MATLAB. Nos aseguraremos que el “DWT Extension
Mode” se ha vuelto a fijar a su valor por defecto, es decir, a ’sym’.

dwtmode(’sym’)
B.5 Compresión de señales y cuantización 93

Ejercicio B.14 Vamos a comprimir una señal tal y como se hizo en la sección
B.2 pero experimentaremos el proceso de cuantización con distinto número de
intervalos, comparando el resultado.
Supondremos que la variable s contiene la señal del fichero sig.mat que
puede bajarse de la página web del curso o crearse muestreando la función
dada al comienzo de la sección A.2.1. Para la compresión y cuantización usa-
remos el fichero compress2.m que incluimos a continuación. Este fichero puede
ser fácilmente modificado para posteriores pruebas cambiando el número de
intervalos en la cuantización. Comprimiremos la señal conservando el 99.99 %
de la energía y usaremos para la cuantización 32, 64, 128 y 256 intervalos. Los
resultados pueden verse en la figura B.6.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero compress2.m
%% Compresión de una señal
%% Incluye el tema de la cuantización
%% pero no codificación

% Archivo de comandos para comprimir una señal


% La variable s contiene la señal

%%%%%%%% Parametros a fijar %%%%%%%%%%%%%%%%%%%%


ls = length(s); % Longitud de la señal
med = mean(mean(s)); % Media de la señal
w = ’haar’; % Fijamos la wavelet
n = 10; % niveles de descomposición
thr_met = ’h’; % método threslholding
Econs = 0.9999; % Porcentaje energía a conservar
q = 32; % Número intervalos cuantización (par)

s = s - med; % Centramos valores


[C,L] = wavedec(s,n,w); % Descomposición

% Reordenamos valores absolutos transformada (decrecientes)


C_dec = abs(sort(-abs(C)));
% Buscamos el índice hasta acumular un porcentaje alto de energía
% Los 1 de esta variable son los índices de los valores que sobran
ind_sobran = find(cumenergy(C_dec)>=Econs);
% El valor correspondiente al primer índice que sobra es el umbral
umbral = C_dec(ind_sobran(1)); % Valor umbral (threshold).
94 Ejercicios

% Anulamos valores de la transformada que no pasan el umbral


C_sob = wthresh(C,thr_met,umbral);

%% Cuantización
alpha = max(abs(C_sob)); delta = 2*alpha/q;
%% Centros intervalos en vector z
a = -alpha+delta/2:delta:-3*delta/2; b =
3*delta/2:delta:alpha-delta/2; z = [a 0 b];
%% La mitad de la longitud de cada intervalo en w
lon = [(delta/2)*ones(1,length(a)) delta
(delta/2)*ones(1,length(b))];

%% Cuantizamos la transformada
C_cuant = C_sob; for i=1:length(C_cuant),
for j=1:length(z),
if abs(C_cuant(i)-z(j))<=lon(j) C_cuant(i)=z(j);
end;
end;
end;

s_rec = waverec(C_cuant,L,w); % Recomponemos la señal


s_rec = s_rec + med; % Añadimos media

% Gráfico de las dos señales


figure; subplot(2,1,1); plot(s); axis([1 ls min(s) max(s)]);
title(’original’); subplot(2,1,2); plot(s_rec); axis([1 ls
min(s_rec) max(s_rec)]); title(’reconstrucción’);

% Calculamos algunos datos sobre la compresión


% Error RMS entre la señal original y la reconstruida
error = rms(s,s_rec);
map = C_sob~=0; % Mapa de significancia
val_sig = sum(map); % Valores significantes
% Factor de compresión y energía conservada
[comp,err] = sprintf(’%d:%d’,ls,val_sig);
[comp_aprox,err] = sprintf(’%d:%d’,round(ls/val_sig),1);

%% Resumen de resultados
[l_long_orig,err] = sprintf(’Longitud original: %d \n’,ls);
[l_val_sig,err] = sprintf(’Valores significativos: %d \n’,val_sig);
[l_comp,err] = sprintf(’Factor compresión de %s \n’,comp);
[l_comp_aprox,err] = sprintf(’\t (aprox. de %s) \n’,comp_aprox);
B.5 Compresión de señales y cuantización 95

[l_rms,err] = sprintf(’Error RMS: %d \n’,error);


sprintf(’%s%s%s%s%s’,...
l_long_orig,l_val_sig,l_comp,l_comp_aprox,l_rms)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

original
0.4
0.2
0
−0.2
−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000
reconstrucción con q=32
0.4
0.2
0
−0.2
−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000
reconstrucción con q=64
0.4
0.2
0
−0.2
−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000
reconstrucción con q=128
0.4
0.2
0
−0.2
−0.4
200 400 600 800 1000 1200 1400 1600 1800 2000
reconstrucción con q=256
0.4
0.2
0
−0.2
200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.6: De arriba abajo tenemos la señal original y la reconstruida a partir


de la compresión, reteniendo el 99.99 % de la energía y usando cuantización
con q intervalos para q = 32, 64, 128, 256.

Los ejercicios que vamos a realizar ahora se basarán en señales de audio


(ficheros *.wav) que pueden obtenerse de la página web del curso (otros ficheros
*.wav de los que disponga el lector también servirían). El método que vamos
a explicar también se puede aplicar a otras señales que no sean de audio.
96 Ejercicios

Ejercicio B.15 Pretendemos comprimir la señal de audio greasy.wav. pa-


ra ello seguiremos los siguientes pasos. El fichero comp_audio.m contiene las
órdenes y comentarios necesarios.

1. Cargar la señal de audio en MATLAB. Puede reproducirse si se desea.

2. Comprimir la señal. Usar la wavelet coif5 y 14 niveles de transformada.


Retener el 99.99 % de la energía original de la señal.

3. Cuantizar la señal al mismo número de bits que la original. Usar cuanti-


zación uniforme.

4. Manipular los coeficientes de la transformada, después de anular los va-


lores que no pasaron el umbral fijado, para obtener los bits necesarios
para transmitir el mapa de significancia y el número de coeficientes no
nulos a transmitir.

5. Calcular los bits por dato (bpp) que son necesarios para transmitir la
señal.

6. Decodificar la señal transformada y cuantizada.

7. Recomponer la señal original con la transformada wavelet inversa sobre


la decodificación de los coeficientes transmitidos. Calcular el error RMS
entre la señal reconstruida y la original. Reproducir si se desea la señal.

%%%%%%%%%%%%%%%%%%%%%
%% Fichero comp_audio.m
%% Compresión de una señal de audio
%% Incluye el tema de la cuantización
%% y también la codificación
%% Utiliza para ello algunos comandos
%% de la toolbox de comunicaciones

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% La variable file debe ser el nombre del fichero *.wav

% Significado de las variables


% s = señal de audio a comprimir
% fs = frecuencia en herzios
% nb = bits por dato
B.5 Compresión de señales y cuantización 97

clear; [s,fs,nb] = wavread(file);


ls = length(s); % Longitud señal

w = ’coif5’; % Wavelet a utilizar


n = 14; % Niveles de transformada
en_ret = 0.9999; % Energía retenida
thr_met = ’h’; % Método thresholding

[C,L] = wavedec(s,n,w); % Transformada wavelet

% Proceso de compresión
dec = abs(sort(-abs(C))); % Reordenamos
left = find(cumenergy(dec)>=en_ret); % Índices que sobran
thr = dec(left(1)); % Valor del umbral (threshold).
Cthr = wthresh(C,thr_met,thr); % Anulamos valores de la transformada

% Proceso de cuantización (codificación)


peak = max(abs(Cthr)); % Máximo (peak value)
Cquant = uencode(Cthr,nb,peak); % Cuantizamos valores transformada

% Resultados de la compresión
map = Cthr~=0; % Mapa de significancia
last_sig_val = max(find(map~=0)); % Último índice significativo
sig_val = sum(map); % Número de valores a transmitir de la transf.
bpp = (last_sig_val+sig_val*nb)/ls; % Bits por dato
[bpp_orig,err]=sprintf(’Original: %3.3f bpp \n’,nb);
[bpp_comp,err]=sprintf(’Compresión: %3.3f bpp \n’,bpp);

Cdecod = udecode(Cquant,nb,peak); % Decodificación

s_rec = waverec(Cdecod,L,w); % Reconstrucción

%% Comparación y resultados
error = rms(s,s_rec); % Entre original y reconstruida
[error_men,err]=sprintf(’Error cometido: %d \n’,error);
wavplay(s_rec,fs); % Reproducción de audio si se desea
sprintf(’%s%s%s’,bpp_orig,bpp_comp,error_men)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.16 Repetir el ejercicio B.15 pero utilizar un umbral de corte para
98 Ejercicios

retener el 96 % de la energía de la señal. Comparar los resultados.

Ejercicio B.17 Repetir el ejercicio B.15 utilizando una wavelet db15. Com-
parar los resultados.

Ejercicio B.18 Repetir el ejercicio B.15 con la señal de audio call_back.wav


u otras de las que disponga el lector.

B.6 Reducción del ruido en una señal


Esta sección está dedicada al proceso de reducción del ruido en una señal uni-
dimensional. En primer lugar haremos unos ejercicios para visualizar el com-
portamiento del ruido blanco gaussiano cuando le aplicamos una transformada
wavelet.

Observación B.19 En este caso los ejercicios se pueden realizar igual con
el “DWT Extension Mode” activo a un valor o a otro ya que no utilizaremos
las longitudes de las subseñales tendencia y fluctuación. La cuestión de que
la señal original y su transformada tengan distinta longitud no es problema
para dibujarlas conjuntamente. Sí puede ser un problema a la hora de realizar
operaciones entre ellas. Por ejemplo, para operar (sumar, restar, ...) con una
señal original y su transformada, ambas deben tener la misma longitud y ne-
cesariamente “DWT Extension Mode” debería ser fijado a ‘per’ y la longitud
de la señal original debe ser par.

B.6.1 Comportamiento del ruido blanco a través de una trans-


formada wavelet
En primer lugar vamos a ver cómo se comporta el ruido blanco cuando se
calcula su transformada wavelet.

Ejercicio B.20 Las órdenes básicas necesarias para este ejercicio pueden en-
contrarse en el fichero white_noise.m; con pequeñas modificaciones puede ser
utilizado para resolver todos los apartados.
1. Construir una señal de ruido blanco de longitud 1024.

2. Calcular su transformada haar de un nivel. Dibujar conjuntamente la


señal original y la señal transformada (véase la figura B.7).
B.6 Reducción del ruido en una señal 99

3. Calcular su transformada haar de tres niveles. Dibujar conjuntamente la


señal original y la señal transformada.

4. Calcular su transformada db2 de un nivel. Dibujar conjuntamente la señal


original y la señal transformada.

5. Calcular su transformada db2 de tres niveles. Dibujar conjuntamente la


señal original y la señal transformada.

6. Calcular su transformada coif1 de un nivel. Dibujar conjuntamente la


señal original y la señal transformada.

7. Calcular su transformada coif1 de tres niveles. Dibujar conjuntamente


la señal original y la señal transformada.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero white_noise.m
%% Generación ruido blanco gaussiano y su transformada

clear;
N = 1024; s = wgn(N,1,1);

w = ’haar’; % Wavelet
n = 1; % Niveles
[C,L] = wavedec(s,n,w);

figure;
subplot(2,1,1);
plot(s,’k.’,’markersize’,3);
title(’Ruido original’);
axis([1 length(s) -5 5]);

subplot(2,1,2);
plot(C,’k.’,’markersize’,3);
title(’Transformada Haar’);
axis([1 length(C) -5 5]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100 Ejercicios

Ruido original
5

−5
100 200 300 400 500 600 700 800 900 1000

Transformada Haar
5

−5
100 200 300 400 500 600 700 800 900 1000

Figura B.7: En la parte superior tenemos una señal formada por ruido blanco
gaussiano y debajo su transformada Haar de 1 nivel.

B.6.2 Reducción del ruido en una señal


Veamos como reducir la presencia de ruido en una señal. Supondremos que el
ruido es gaussiano de media cero (ruido blanco). Si se dispone de señales de
estas características se puede proceder a su reducción directamente; si no se
dispone de señales con ruido lo añadiremos nosotros utilizando funciones que
pertenecen a la “Communications Toolbox” de MATLAB.

Ejercicio B.21 Para este ejercicio se puede utilizar el fichero denoise.m para
la parte que concierne a la reducción de ruido en una señal contaminada. Para
crear la señal y añadirle ruido utilizamos el fichero make_noisy_signal.m.

1. Construir una señal de 211 puntos a partir de la función

f (x) = 4x2 (1 − x)3 (2 − x)2 cos(18x(1 + x))

en el intervalo [0,2].

2. Añadir ruido blanco gaussiano de 25 dBW de potencia a esta señal.


B.6 Reducción del ruido en una señal 101

3. Calcular la transformada de nivel 9 de la señal contaminada. Utilizar la


wavelet coif5.

4. Obtener la desviación típica σ de una porción de la fluctuación de primer


nivel.

5. Fijar el umbral a σ 2 log N .

6. Eliminar los valores de la transformada que no pasan el umbral. Utilizar


“hard threshold”.

7. Reconstruir la señal a partir de los valores de la transformada que sobre-


vivieron al umbral.

8. Comparar la señal reconstruida y la señal original. Calcular para ello el


error RMS, el porcentaje de energía retenida y finalmente dibujarlas.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero make_noisy_signal.m
%% Fichero para construir una señal y añadirle ruido blanco gaussiano

clear;
a = 0; % Initial value
b = 2; % End value
N = 2^11; % Total number of values
x = a:(b-a)/(N-1):b;
s = (4*(x.^2)).*((1-x).^3).*((2-x).^2).*cos((18*x).*(1+x));

s = awgn(s,25); % Añadimos ruido blanco de 25 dB


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero denoise.m
%% Eliminación del ruido de una señal
%% La variable externa s contiene la señal contaminada

w = ’coif5’; % Wavelet a utilizar


n = 9; % Niveles de transformada
thr_met = ’h’; % Método thresholding: Hard
102 Ejercicios

% Numero de veces la desviación típica en umbral


coef = sqrt(2*log(length(s)));

[C,L] = wavedec(s,n,w); % Transformada wavelet

% Cálculo del umbral (threshold)


cD1 = detcoef(C,L,1); % Extraemos la primera fluctuación
des_tip = std(cD1); % Desviación típica
thr = coef*des_tip; % Umbral (threshold)

Cthr = wthresh(C,thr_met,thr); % Umbralizamos la transformada

s_den = waverec(Cthr,L,w); % Reconstruimos

%% Resultados y representación gráfica


figure; hold on; axis([1 length(s) min(s) max(s)]); plot(s’,’y’);
plot(s_den’,’k’); hold off;
error = rms(s,s_den); % Error
[error_men,err] = sprintf(’Error: %d \n’,error);
ene_ret = 100*energy(s_den)/energy(s); % Porcentaje energía retenida
[ene_ret_men,err] = sprintf(’Energía retenida: %2.3f %% \n’,ene_ret);
sprintf(’%s%s’,error_men,ene_ret_men)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cuando ejecutamos los códigos de los ficheros make_noisy_signal.m y


denoise.m se obtiene el gráfico de la figura B.8. El error RMS entre la se-
ñal con ruido y la filtrada es 0.0567; el porcentaje de energía retenida es de
87.842 %.

Ejercicio B.22 Repetir el ejercicio B.21 utilizando “soft threshold”. Comparar


los resultados.

Ejercicio B.23 Repetir el ejercicio B.21 utilizando “hard threshold” y la wave-


let db10. Niveles de transformada a vuestra decisión. Comparar los resultados.

Ejercicio B.24 Repetir el ejercicio B.21 utilizando “soft threshold” y la wave-


let db10. Niveles de transformada a vuestra decisión. Comparar los resultados.

La eliminación del ruido blanco en una señal ha sido ampliamente inves-


tigada. Hay múltiples maneras de seleccionar el umbral, algunas basadas en
B.6 Reducción del ruido en una señal 103

0.4

0.3

0.2

0.1

−0.1

−0.2

−0.3

−0.4

200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.8: Señal original contaminada (en gris), superpuesta tenemos la señal
obtenida después de reducir el ruido (en negro).

algoritmos realmente complicados. Algunas de estas técnicas de seleccionar el


umbral han sido implementadas en la “Wavelet Toolbox”. No entraremos en
detalles, aunque sí usaremos las órdenes programadas para saber al menos que
existen y comparar resultados. Los siguientes ejercicios van encaminados en
este sentido.

Ejercicio B.25 Repetir el ejercicio B.21 utilizando el comando wden. Es útil


ver la ayuda a la selección del umbral (comando thselect y experimentar con
ella). El fichero denoise_auto.m puede ser utilizado como base.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero denoise_auto.m
%% Reducción del ruido de una señal de forma automática
%% La variable externa s contiene la señal contaminada

ls = length(s); % Longitud
w = ’coif5’; % Wavelet a utilizar
n = 9; % Niveles de transformadas

%% Eliminamos el ruido de una con la orden de la toolbox.


%% Fijamos algunos datos antes
tptr = ’rigrsure’; % Método de selección del umbral
sorh = ’h’; % Soft or hard threshold
scal = ’one’;
104 Ejercicios

[s_den,C,L] = wden(s,tptr,sorh,scal,n,w); % Reducción ruido

%% Resultados y representación gráfica


figure;
hold on;
axis([1 length(s) min(s) max(s)]);
plot(s’,’y’);
plot(s_den’,’k’);
hold off;
error = rms(s,s_den); % Error
[error_men,err] = sprintf(’Error: %d \n’,error);
ene_ret = 100*energy(s_den)/energy(s); % Porcentaje energía retenida
[ene_ret_men,err] = sprintf(’Energía retenida: %2.3f %% \n’,ene_ret);
sprintf(’%s%s’,error_men,ene_ret_men)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Cuando ejecutamos el códigos del denoise_auto.m con la misma señal del


ejercicio B.21 se obtiene el gráfico de la figura B.9. El error RMS entre la
señal con ruido y la filtrada es 0.0753; el porcentaje de energía retenida es de
76.416 %.

0.4

0.3

0.2

0.1

−0.1

−0.2

−0.3

−0.4

200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.9: Señal original contaminada (en gris), superpuesta tenemos la señal
obtenida después de reducir el ruido con la orden wden (en negro).

Ejercicio B.26 Repetir el ejercicio B.21 utilizando la herramienta gráfica.


Probar con cada uno de los métodos de selección del umbral. Si se desea se
puede ir guardando los resultados para posteriores comparaciones.
B.7 Transformada de Fourier Discreta 105

B.7 Transformada de Fourier Discreta


B.7.1 “Fast Fourier Transform”
Ejercicio B.27 Calcularemos la transformada de Fourier de una señal y a
continuación reconstruiremos la señal transformada inversa de Fourier. El fi-
chero fourier_1.m contiene las órdenes necesarias y el resultado se puede ver
en la figura B.10.

1. Crear una señal a partir de la función

h(t) = t sen 4t

en [0, 2π] con 2048 puntos de muestreo.

2. Calcular su transformada de Fourier y representarla.

3. Calcular su transformada inversa y representarla. Debido a la aritmética


finita aparecen números complejos con parte imaginaria casi nula, para
evitar este efecto tomaremos la parte real.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero fourier_1.m
%% Transformada de Fourier discreta y su inversa

clear;
a = 0; % Initial value
b = 2*pi; % End value
N = 2^11; % Total number of values
t = a:(b-a)/(N-1):b;
s = t.*sin(4*t);

figure;
subplot(3,1,1); plot(t,s);
axis([a b min(s) max(s)]); title(’Original’);

s_dft = fft(s); % Transformada Discreta de Fourier

subplot(3,1,2); plot(t,abs(fftshift(s_dft)));
title(’Transformada discreta de Fourier’);
106 Ejercicios

Original
5

−5
0 1 2 3 4 5 6
Transformada discreta de Fourier
3000
2000
1000
0
0 1 2 3 4 5 6
Reconstrucción a partir de la DFT
5

−5
0 1 2 3 4 5 6

Figura B.10: Señal original en el gráfico superior y debajo la reconstrucción


después de haber calculado la transformada discreta de Fourier y su inversa.

axis([a b -0.1*max(abs(s_dft)) 1.1*max(abs(s_dft))]);

s_rec = ifft(s_dft); % Transformada Inversa Discreta de Fourier


s_rec = real(s_rec); % Tomamos parte real, imaginarios son casi cero

subplot(3,1,3); plot(t,s_rec);
axis([a b min(s_rec) max(s_rec)]);
title(’Reconstrucción a partir de la DFT’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.28 Análisis de frecuencias de una suma de senos. El fichero de


nombre fourier_2.m contiene las órdenes necesarias y el resultado se puede
ver en la figura B.11.

1. Crear una señal a partir la función

f (t) = 2 cos(4πt) + 0.5 sen(24πt)

en el intervalo [−16, 16] muestreada con 1024 puntos.


B.7 Transformada de Fourier Discreta 107

2. Calcular su transformada de Fourier y realizar su análisis de frecuencias


relacionándolo con la función f (t) utilizada para generar la función.

Original
8
6
4
2
0
−2
−4
−6
−8
−15 −10 −5 0 5 10 15

Transformada discreta de Fourier

1000

800

600

400

200

−15 −10 −5 0 5 10 15

Figura B.11: Señal original en el gráfico superior y debajo los valores (en mó-
dulo) de la transformada discreta de Fourier.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero fourier_2.m
%% Análisis de frecuencias con la transformada discreta de Fourier

clear;
a = -16; % Initial value
b = 16; % End value
N = 2^10; % Total number of values
t = a:(b-a)/(N-1):b;
s = 2*cos(4*pi*t)+0.5*sin(24*pi*t);

figure;
subplot(2,1,1); plot(t,s);
axis([-16 16 -8 8]); title(’Original’);

s_dft = fft(s); % Transformada Discreta de Fourier


108 Ejercicios

subplot(2,1,2); plot(t,abs(fftshift(s_dft)));
title(’Transformada discreta de Fourier’);
axis([-16 16 -0.1*max(abs(s_dft)) 1.1*max(abs(s_dft))]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.29 Análisis de frecuencias de una señal.


1. Crear una señal a partir la función
1 + cos(24πt)
g(t) =
1 + 4t2
en el intervalo [−16, 16] muestreada con 1024 puntos.

2. Calcular su transformada de Fourier y realizar su análisis de frecuencias


relacionándolo con la función g(t) utilizada para generar la función.

3. ¿Puede obtenerse tanta información como en el caso anterior?

B.7.2 El espectro de señales wavelets y scaling


Ejercicio B.30 Calcular y representar gráficamente el espectro de la primera
scaling y la primera wavelet de nivel 1 de la coif2 (desplazar la transformada de
Fourier si es necesario). El fichero spectrum.m contiene las órdenes necesarias
y la figura B.12 el resultado.
Espectro de la scaling Espectro de la wavelet
3 3

2.5 2.5

2 2

1.5 1.5

1 1

0.5 0.5

0 0

−0.5 −0.5

−1 −1
−0.5 0 0.5 −0.5 0 0.5

Figura B.12: Para la coif2 a la izquierda el espectro de la scaling v11 y a la


derecha de la wavelet w11 .
B.7 Transformada de Fourier Discreta 109

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero spectrum.m
%% Para construir el gráfico de los espectros de scaling y wavelets
%%%%%%%%
%% El DWT Extension Mode debe ser ’per’
%%%%%%%%
clear;

k = 10; N = 2^k; % Longitud


n = 1; % Niveles
w = ’coif2’; % Wavelet

% Construimos L a partir de una señal de ceros


s = zeros(1,N);
[C,L] = wavedec(s,n,w);
t = -.5:1/(N-1):.5; % Para gráficos

C = zeros(1,N); % Anulamos
i = 1; C(i) = 1; v = waverec(C,L,w);
v_dft = fft(v); v_spec = abs(v_dft).^2;

figure;
subplot(1,2,1); plot(t,fftshift(v_spec));
title(’Espectro de la scaling’);
axis([-.5 .5 -1 3]);

C = zeros(1,N); % Anulamos
i = N/2+1; C(i) = 1; w = waverec(C,L,w);
w_dft = fft(w); w_spec = abs(w_dft).^2;

subplot(1,2,2); plot(t,fftshift(w_spec));
title(’Espectro de la wavelet’);
axis([-.5 .5 -1 3]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.31 Obtención y representación de espectros de wavelets y scaling


de distintos niveles.
1. Calcular y representar gráficamente los espectros de las señales scaling
primeras desde nivel 1 a 4 de la coif2.
110 Ejercicios

2. Calcular y representar gráficamente los espectros de las señales wavelet


primeras desde nivel 1 a 4 de la coif2.

B.7.3 Análisis de frecuencias y transformada wavelet


Veamos a continuación que el uso conjunto de la transformada wavelet y el
análisis de frecuencias de la transformada de Fourier discreta puede mejorar
nuestro análisis de frecuencias del ejercicio B.29.

Ejercicio B.32 Vamos a volver a realizar el análisis de frecuencia de la se-


ñal del ejercicio B.29 pero antes manipularemos la señal con la transformada
wavelet. Las órdenes se pueden encontrar en el fichero fourier_wav.m y el
resultado en la figura B.13.

1. Crear una señal que represente la función

1 + cos(24πt)
g(t) =
1 + 4t2
en el intervalo [−16, 16] con 1024 puntos.

2. Obtener su primera señal promedio A1 con la wavelet coif2.

3. Obtener su primera señal de detalle D1 con la wavelet coif2.

4. Realizar el análisis de frecuencias con la transformada discreta de Fou-


rier de la señal original y de las señales promedio y detalle. Obtener
conclusiones (desplazar la transformada si es necesario).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero fourier_wav.m
%% Análisis de frecuencias con la transformada discreta de Fourier
%% combinada con wavelets

clear;
a = -16; % Initial value
b = 16; % End value
N = 2^10; % Total number of values
t = a:(b-a)/(N-1):b;
s = (1+2*cos(24*pi*t))./(1+4*t.^2);
B.7 Transformada de Fourier Discreta 111

Original s DFT de s

5 40

0
20

−5
0
−10 0 10 −10 0 10
Aprox. A1 DFT de A1

5
40

0
20

−5
0
−10 0 10 −10 0 10
1 1
Detalle D DFT de D

5 40

0
20

−5
0
−10 0 10 −10 0 10

Figura B.13: En la columna de la izquierda tenemos la señal original, la apro-


ximación A1 y el detalle D1 . En la columna de la derecha se puede ver sus
correspondientes transformadas discretas de Fourier (valores absolutos).

w = ’coif2’; % Wavelet
n = 1; % Niveles

figure;
subplot(3,2,1); plot(t,s);
axis([a b -8 8]); title(’Original s’);

s_dft = fft(s); % Transformada Discreta de Fourier

subplot(3,2,2); plot(t,abs(fftshift(s_dft)));
title(’DFT de s’);
axis([a b -0.1*max(abs(s_dft)) 1.1*max(abs(s_dft))]);

% Descomposición wavelet
[C,L] = wavedec(s,n,w);
A1 = wrcoef(’a’,C,L,w,1);
D1 = wrcoef(’d’,C,L,w,1);

subplot(3,2,3); plot(t,A1);
112 Ejercicios

axis([a b -8 8]); title(’Aprox. A^1’);

A1_dft = fft(A1); % Transformada Discreta de Fourier de A^1

subplot(3,2,4); plot(t,abs(fftshift(A1_dft)));
title(’DFT de A^1’);
axis([a b -0.1*max(abs(A1_dft)) 1.1*max(abs(A1_dft))]);

subplot(3,2,5); plot(t,D1);
axis([a b -8 8]); title(’Detalle D^1’);

D1_dft = fft(D1); % Transformada Discreta de Fourier de D^1

subplot(3,2,6); plot(t,abs(fftshift(D1_dft)));
title(’DFT de D^1’);
axis([a b -0.1*max(abs(D1_dft)) 1.1*max(abs(D1_dft))]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

B.8 Detección de subseñales de corta duración


Veamos que a través de la correlación de señales se pueden detectar señales
de “corta duración” en señales “grandes”. Esta técnica puede ser utilizada para
detectar irregularidades o patrones en señales (por ejemplo electrocardiogra-
mas). Finalmente veremos que el tratamiento de las señales con wavelets puede
mejorar la detección.
Dadas dos señales f y g, se define la señal de correlación (f : g) cuyo
k-ésimo valor es

(f : g)k := f1 gk + f2 gk+1 + · · · + fN gk+N −1 .

Aquí hay que precisar que tomamos gj+N = gj para cada j (es decir, hacemos
g periódica). La correlación normalizada por f es

1
(f : g).
E(f )

Supongamos que f es una señal formada en los primeros puntos por una por-
ción (subseñal) de g, siendo 0 en el resto de puntos. Partimos también del
supuesto que la porción que hemos tomado de g tiene una energía superior
B.8 Detección 113

a cualquier otra porción de g de la misma longitud. A partir de la desigual-


dad de Cauchy para productos escalares se deduce que el valor máximo de la
correlación coincide justo cuando estamos al principio del soporte de la por-
ción tomada de g. Al normalizar dicho valor máximo es 1. Esta situación puede
darse, por ejemplo, cuando pretendemos localizar una anomalía cardíaca en un
electrocardiograma.
Para una detección más clara de la posición de la subseñal en la señal g,
podemos realizar previamente un filtrado mediante el MRA asociado a cierta
wavelet. A un determinado nivel m, como

g = Am + D m + · · · + D 1 ,

tomamos
g̃ = g − Am = Dm + · · · + D1 .
Hacemos lo propio con f , produciendo f˜. De esta manera hemos filtrado permi-
tiendo el paso alto y paso banda, que preserva las características de la subseñal
y reduce posibles interferencias. Finalmente evaluamos la correlación normali-
zada
1
(f˜ : g̃).
E(f˜)
El modo en que contribuye la DFT (o, más bien, la FFT) a este proceso
es de la siguiente manera. Se cumple la relación entre correlación y DFT dada
por
\
(f : g) = fˆĝ.
Para reducir el número de operaciones procedemos de este modo:
1. Computamos la DFT de f y g (mediante FFT).

2. Multiplicamos fˆ y ĝ.

3. Computamos la DFT inversa de fˆĝ y obtenemos (f : g).


Esto requiere O(N log(N )) operaciones, que hay que comparar con las
O(N 2 ) operaciones si hiciéramos la correlación directamente.

Ejercicio B.33 Programar una función para MATLAB llamada corr que
acepte como argumentos dos señales de la misma longitud como vectores fila
y como resultado calcule la correlación entre las dos señales. Un ejemplo de
cómo puede realizarse esto se muestra en el fichero corr.m.
114 Ejercicios

Archivo: corr.m

function [z] = corr(x,y)


%CORR Computes the correlation of x and y
% z = CORR(x,y) creates a vector z with the correlation
% of vectors x and y.
% Vectors x and y MUST BE vector files.

z = zeros(size(x));
for i=1:length(z),
z(i) = dot(x,circshift(y,[1 -i+1]));
end;

Ejercicio B.34 Supongamos que se tienen dos señales, una de un electrocar-


diograma real y la otra es el aislamiento de una arritmia cardíaca. Intentare-
mos detectar y localizar si el electrocardiograma tiene la arritmia. El fichero
detect.m contiene las órdenes necesarias para realizar este ejercicio. El resul-
tado gráfico se puede ver en la figura B.14.

1. Obtener la señal que simula un electrocardiograma de ecg.mat. Repre-


sentarlo.

2. Obtener la señal que simula una arritmia de arritmia.mat. Represen-


tarla.

3. Calcular la correlación entre la arritmia y el electrocardiograma para


detectar el latido “defectuoso”. Representar la correlación.

4. Para detectar mejor esta anomalía se propone normalizar la correlación,


eliminar los valores negativos y tomar el cuadrado de los valores restantes.
Representar la señal resultante.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero detect.m
%% Detección de patrones cortos en señales grandes

clear;
B.8 Detección 115

Electrocardiograma

1
0
−1

200 400 600 800 1000 1200 1400 1600 1800 2000
Arritmia

1
0
−1
200 400 600 800 1000 1200 1400 1600 1800 2000
Correlación arritmia y electrocardiograma
50
0
−50
200 400 600 800 1000 1200 1400 1600 1800 2000
Valores positivos al cuadrado
40
20
0
200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.14: De arriba a abajo tenemos una simulación de una electrocar-


diograma, una simulación de una arritmia, la correlación entre ambas y para
resultar más el efecto de detección hemos representado el cuadrado de tan sólo
los valores positivos de la correlación.

load ecg;
load arritmia;

figure;
subplot(4,1,1); plot(ecg);
axis([1 length(ecg) -2*max(ecg) 2*max(ecg)]);
title(’Electrocardiograma’);

subplot(4,1,2); plot(arritmia);
axis([1 length(arritmia) -2*max(arritmia) 2*max(arritmia)]);
title(’Arritmia’);

a_corr_e = corr(arritmia,ecg); % Correlación

subplot(4,1,3); plot(a_corr_e);
axis([1 length(a_corr_e) -2*max(a_corr_e) 2*max(a_corr_e)]);
title(’Correlación arritmia y electrocardiograma’);
116 Ejercicios

final = (max(a_corr_e,0).^2)/energy(arritmia); % Positivos y cuadrado

subplot(4,1,4); plot(final);
axis([1 length(final) -1 1.1*max(final)]);
title(’Valores positivos al cuadrado’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio B.35 Repetir el ejercicio anterior con las señales ecg_big.mat y


arritmia_big.mat. Observar que el precio computacional al calcular la corre-
lación entre señales con un número grande de datos es muy alto. Si todavía se
es escéptico en este punto se propone repetir el proceso tomando las señales
ecg_big_big.mat y arritmia_big_big.mat.
A continuación vamos a dar un método alternativo para calcular la correla-
ción entre dos señales que no sea tan computacionalmente caro. Comenzaremos
programando una función alternativa para calcular la correlación que haga uso
de transformada discreta de Fourier.

Ejercicio B.36 Repetir el ejercicio B.34 utilizando el siguiente “atajo”, en el


sentido de rapidez computacional.

1. Obtener las señales ecg_big.mat y arritmia_big.mat.

2. Calcular las transformadas discretas de Fourier de las dos señales (usar


la FFT).

3. Multiplicar término a término la señal conjugada de la transformada de


la arritmia_big con la transformada del ecg_big.

4. Calcular la transformada inversa de Fourier (usar la IFFT) del resulta-


do (es conveniente eliminar las partes imaginarias que aparecen por los
problemas de trabajar con aritmética finita).

5. Comprobar que se obtiene lo mismo que si usamos la correlación entre


la arritmia_big y el ecg_big directamente.

Ejercicio B.37 Programar una función para MATLAB llamada corrfft que
acepte como argumento dos señales de la misma longitud como vectores fila
y como resultado calcule la correlación entre las dos señales. Para calcular la
correlación la función hará uso de la relación existente entre la transformada
B.8 Detección 117

discreta de Fourier y la correlación, es decir, primero deberá calcular las trans-


formadas discretas de Fourier de las señales y después multiplicar término a
término la conjugada de la primera transformada con la segunda transformada.
Finalmente se volverá a calcular la transformada discreta inversa de Fourier del
resultado. Un ejemplo de cómo puede realizarse esto se muestra en el fichero
corrfft.m.

Archivo: corrfft.m

function [z] = corrfft(x,y)


%CORRFFT Computes the correlation of x and y
% z = CORRFFT(x,y) creates a vector z with
% the correlation of vectors x and y.
% Vectors x and y MUST BE vector files.
% This function uses FFT and IFFT to compute
% the correlation.

z = real(ifft(conj(fft(x)).*fft(y)));

Ejercicio B.38 Es importante comprobar la mejora computacional que supo-


ne calcular la correlación haciendo uso de la transformada discreta de Fourier.
En los ejercicios B.33 y B.37 hemos automatizado el cálculo de la correla-
ción programando funciones para MATLAB, ahora podemos calcular correla-
ciones por ambos métodos observando el tiempo que necesitamos para ello.
Hacer pruebas con las señales arritmia y ecg, con las señales arritmia_big
y ecg_big y finalmente con las señales arritmia_big_big y ecg_big_big. Sin
problemas se podrá observar la diferencia en el tiempo de cálculo de la corre-
lación a partir de la definición y haciendo uso de la transformada discreta de
Fourier.

Ejercicio B.39 En este ejercicio vamos a ver que los resultados de la correla-
ción entre señales también se pueden mejorar si añadimos componentes de la
transformada wavelet de señales.
1. Obtener las señales ecg.mat y arritmia.mat.

2. Con la wavelet coif5 obtener el promedio A4 de ambas señales. Restar


este promedio a cada seña, es decir, tomaremos D1 + D2 + D3 + D4 .
118 Ejercicios

3. Calcular la correlación de las señales detalle obtenidas.

4. Normalizar, eliminar negativos y elevar al cuadrado. Representar gráfi-


camente lo obtenido.

El fichero detect_wav contiene las órdenes necesarias para realizar el ejer-


cicio. El resultado que se muestra en la figura B.15, se debe comparar con lo
obtenido en el ejercicio B.34.

Detalles D1+D2+D3+D4 del electrocardiograma

1
0
−1
200 400 600 800 1000 1200 1400 1600 1800 2000
1 2 3 4
Detalles D +D +D +D de la arritmia
2
0
−2
200 400 600 800 1000 1200 1400 1600 1800 2000
Correlación detalles arritmia y electrocardiograma
40
20
0
−20
−40
200 400 600 800 1000 1200 1400 1600 1800 2000
Valores positivos al cuadrado
20
10
0
200 400 600 800 1000 1200 1400 1600 1800 2000

Figura B.15: De arriba a abajo tenemos: los detalles D1 + · · · + D4 de la


simulación de un electrocardiograma; los mismos detalles de la simulación de
una arritmia; la correlación entre ambas y, finalmente, para resaltar más el
efecto de detección hemos representado el cuadrado de tan sólo los valores
positivos de la correlación.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero detect_wav.m
%% Detección de patrones cortos en señales grandes.
%% Combina correlación con técnicas wavelets

clear;
load arritmia;
B.8 Detección 119

load ecg;

w = ’coif5’; % Wavelet
n = 4; % Niveles

% Extraemos detalles 1 a 4 de arritmia


[C_arrit,L_arrit] = wavedec(arritmia,n,w);
A4_arrit = wrcoef(’a’,C_arrit,L_arrit,w,n);
D1_4_arrit = arritmia-A4_arrit;

% Extraemos detalles 1 a 4 del electro.


[C_ecg,L_ecg] = wavedec(ecg,n,w);
A4_ecg = wrcoef(’a’,C_ecg,L_ecg,w,n);
D1_4_ecg = ecg - A4_ecg;

figure;
subplot(4,1,1); plot(D1_4_ecg);
axis([1 length(D1_4_ecg) -2*max(D1_4_ecg) 2*max(D1_4_ecg)]);
title(’Detalles D^1+D^2+D^3+D^4 del electrocardiograma’);

subplot(4,1,2); plot(D1_4_arrit);
axis([1 length(D1_4_arrit) -2*max(D1_4_arrit) 2*max(D1_4_arrit)]);
title(’Detalles D^1+D^2+D^3+D^4 de la arritmia’);

a_corr_e = corrfft(D1_4_arrit,D1_4_ecg); % Correlación (usa fft)

subplot(4,1,3); plot(a_corr_e);
axis([1 length(a_corr_e) -2*max(a_corr_e) 2*max(a_corr_e)]);
title(’Correlación detalles arritmia y electrocardiograma’);

% Positivos y cuadrado
final = (max(a_corr_e,0).^2)/energy(D1_4_arrit);

subplot(4,1,4); plot(final);
axis([1 length(final) -1 1.1*max(final)]);
title(’Valores positivos al cuadrado’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120 Ejercicios

B.9 Wavelets packets


El análisis con transformada wavelet packet lo haremos únicamente desde la
herramienta gráfica. Debemos iniciar por tanto el entorno gráfico del menú
principal con la orden wavemenu y elegir “Wavelet Packet 1-D”.

B.9.1 Analizando una señal


Cargar la señal almacenada en el fichero sumlichr.mat que proporciona la
“toolbox”. Aparecerá la señal y ahora se debe elegir la wavelet a utilizar y los
niveles de transformada. Tomar la db2 y 4 niveles. Es importante el método
de cálculo de la entropía de la señal. En función del método elegido se puede
optimizar la descomposición de la señal. Buscar en la ayuda wentropy para
más datos. De momento tomaremos la entropía threshold con parámetro 1.
Una vez seleccionadas estas opciones podemos analizar al señal.
Aparece un árbol con la descomposición de la señal. Investigar las distintas
opciones de representación y el método para representar cada subseñal.
Usualmente no es necesario llegar al último nivel en todas las ramas del
árbol. La estructura de descomposición se optimiza aplicando el método de
entropía seleccionado. La descomposición que optimiza la entropía se obtiene
con “besttree”. Observar que, con la elección de entropía tomada en este caso,
obtenemos casi la descomposición inicial.

Ejercicio B.40 Investigar las demás selecciones de entropía que ofrece la


herramienta gráfica prestando atención a los posibles cambios que puedan pro-
ducirse en el cálculo de la mejor descomposición.

B.9.2 Comprimiendo la señal


Seleccionando la opción de comprimir se pasa a la herramienta de compresión.
La “toolbox” nos ofrece un valor para el umbral; este valor puede tomarse o
cambiarse por otro. Podemos también observar la energía retenida y el número
de ceros que tendríamos en la transformada.

Ejercicio B.41 Cambiar el valor del umbral a 0.8938 y observar los resultados
de la compresión. Experimentar con otros valores.
Una vez decidido el método de “threshold” y sus valores correspondientes se
puede comprimir la señal seleccionando Compress. Al salir de la herramienta de
B.10 Transformada wavelet continua 121

compresión el programa nos pregunta si queremos actualizar la señal original


con la versión comprimida, esto es, con la reconstrucción que se hace utilizando
la señal transformada que hemos modificado.

B.9.3 Reducción de ruido


Desde la ventana de análisis de señales con “wavelets packets” cambiaremos el
método de cálculo de entropía a sure. Usando este método el umbral a poner
sería 4.2975. A continuación podemos analizar la señal.
Para reducir el ruido es conveniente seleccionar la mejor descomposición ya
que la reducción de ruido suele ser más eficiente.
Seleccionamos la herramienta de eliminación de ruido. Diferentes opciones
pueden cambiarse si las que ofrece el programa no satisfacen nuestras necesida-
des. Por ejemplo, con valor 3.331 para el “Global threshold” hemos eliminado
tanto “ruido” que perdimos parte esencial de la señal.
De nuevo, al salir de la herramienta de eliminación de ruido el programa
nos pregunta si queremos actualizar la señal original con la nueva versión que
acabamos de obtener.

B.10 Transformada wavelet continua


A continuación se describen las herramientas de la “Wavelet Toolbox” de MA-
TLAB para realizar un análisis continuo de señales unidimensionales, tanto
desde el entorno gráfico como desde la línea de comandos. Describiremos fun-
damentalmente las siguientes cuestiones.

• Realizar una transformada wavelet continua de la señal.

• Representación gráfica de los coeficientes de la transformada continua.

• Elección de las escalas a analizar.

B.10.1 Transformada wavelet continua desde la línea de co-


mandos
Para realizar la transformada wavelet continua de una señal 1D sólo se necesita
la orden cwt. Veamos su funcionamiento con un ejemplo.
122 Ejercicios

Consideremos la señal generada a partir de la función


2
f (x) = sin(40πx)e−100π(x−0.2) +
2
(sin(40πx) + 2 cos(160πx)) e−50π(x−0.5) + (B.1)
−100π(x−0.8)2
2 sin(160πx)e
en el intervalo [0, 1] realizando un muestreo con 2048 puntos. Supongamos que
la señal ha sido generada y almacenada en la variable s.
w = ’mexh’; % Fijamos Wavelet
escalas = 1:24; % Escalas
C = cwt(s,escalas,w); % Calculamos la transformada

En el argumento de cwt hay que especificar la señal a analizar, las escalas


(rango y paso) y el tipo de wavelet a utilizar. El resultado es una matriz que
contiene los coeficientes de la transformada. En este ejemplo, la señal está
formada por 2048 puntos, por lo que C es una matriz 24 × 2048, y cada fila
corresponde a los coeficientes para una escala determinada.
El comando cwt admite un argumento adicional que cuando está presente
produce una representación gráfica de los valores absolutos de los coeficientes
de la transformada wavelet continua.
C = cwt(s,escalas,w,‘plot’);
(véase la figura B.16)

Las normas para elegir las escalas son las que se indican a continuación.
Haremos notar que son casi las mismas que en el entorno gráfico que veremos
en la siguiente sección, aunque en el caso gráfico no se permite elegir la escala
en orden decreciente.

• Todas las escalas deben ser números reales positivos.


• El incremento de escala puede ser negativo o positivo (solo positivo cuan-
do estamos con la herramienta gráfica).
• La escala máxima no puede ser mayor de cierta cantidad que depende de
la señal a analizar (el entorno gráfico sí nos indica este valor máximo).

Algunos ejemplos válidos para definir las escalas pueden observarse a con-
tinuación. Es conveniente definirlos en una variable para su rápido cambio y
actualización de los cálculos.
B.10 Transformada wavelet continua 123

−1

−2

−3
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Absolute Values of Ca,b Coefficients for a = 1 2 3 4 5 ...

23
21
19
17
15
scales a

13
11
9
7
5
3
1
200 400 600 800 1000 1200 1400 1600 1800 2000
time (or space) b

Figura B.16: Señal f (x); escalograma para escalas 1 a 24 con paso de 1.

escalas = 1:64; % Escalas 1 a 64 de 1 en 1


escalas = 2:2:128; % Escalas 2 a 128 con paso 2
escalas = [2 8 16 32:2:64]; % Escalas 2, 8, 16 y de 32 a 64 con paso 2
escalas = 64:-2:2; % Escalas 64 a 2 con paso decreciente de 2

Ejercicio B.42 Cargar la señal noissin.mat que tiene ya generada la “tool-


box”.
1. Representar gráficamente la señal.

2. Calcular y representar la transformada wavelet continua de la señal para


las escalas 1, 2, . . . , 48.

3. Calcular y representar la transformada wavelet continua de la señal para


las escalas 2, 4, . . . , 128.

4. Observar como a escalas altas se destaca la periodicidad de la señal.

B.10.2 Transformada wavelet continua en el entorno gráfico


El inicio del uso de la herramienta gráfica que la “toolbox” tiene incorporada es
similar a como se explicó en la sección A.2.2 para la transformada discreta. En
124 Ejercicios

primer lugar debemos cargar el menú general de la herramienta gráfica con la


orden wavemenu. A continuación debemos elegir la opción “Continuous Wavelet
1-D”. Como ocurría con el entorno gráfico de la “Discrete Wavelet 1-D” la señal
debe estar previamente grabada en un fichero *.mat que se carga de la forma
habitual.

Ejercicio B.43 Analizar el ejemplo de la sección anterior (señal generada a


partir de la función dada en ecuación (B.1)) utilizando la herramienta gráfica.
Investigar las distintas maneras de colorear los coeficientes de la transformada
(“Coloration Mode”) y observar, por ejemplo, que con una posible opción con-
siste en asignar colores entre los valores mínimo y máximo de los coeficientes.
Otra posibilidad es hacerlo entre cero y el máximo del valor absoluto de los co-
eficientes, de este modo se obtiene una representación de los valores absolutos
de la transformada.

Ejercicio B.44 Repetir el ejercicio B.42 desde la herramienta gráfica. Prac-


ticar nuevas posibilidades y opciones de la herramienta gráfica.
Apéndice C

Ejemplos y aplicaciones

En este apéndice enumeraremos una serie de ejemplos y aplicaciones en los


que el tratamiento con wavelets es de gran utilidad. Los cálculos se pueden
hacer desde la herramienta gráfica o también desde la línea de comandos. Estos
ejemplos se encuentran planteados en la documentación de la “Wavelet Toolbox
for MATLAB” [5] donde, además, podemos encontrar otras aplicaciones.

C.1 Detección de “breakdown points”


Pretendemos encontrar cambios abruptos, cambios de forma, discontinuidades
en las derivadas (primera, segunda, . . . ), etc. Las líneas generales para hacerlo
son:

1. Para encontrar una discontinuidad en la señal usar la wavelet de haar.

2. Para encontrar una ruptura en la derivada j-ésima usar una wavelet


suficientemente regular para que se anulen al menos los primeros j mo-
mentos.

C.1.1 Un cambio en la frecuencia


Analizar la señal freqbrk.mat y obtener las conclusiones posibles en lo que a
puntos de ruptura o cambio de frecuencia se refiere.
Justificación. Veamos como el análisis wavelet aporta información sobre
el instante en que varía la frecuencia de una señal. Esta información no la
puede proporcionar la transformada de Fourier.

125
126 Ejemplos y aplicaciones

La señal pertenece al muestreo de la función


½
sin(0.03 x) 1 ≤ x ≤ 500
g(x) =
sin(0.3 x) 501 ≤ x ≤ 1000

El fichero freqbrk_analisis.m puede ser utilizado para analizar la señal.


Esta señal también se puede analizar desde la herramienta gráfica aunque in-
cluiremos aquí el fichero por si puede ser útil para posteriores usos. El gráfico
que se genera al ejecutar el fichero puede verse en la figura C.1

Original Reconstruida
1 1
0 0
−1 −1
0 500 1000 0 500 1000
Aproximación 1 Detalle 1
2 0.5
0 0
−2 −0.5
0 500 1000 0 500 1000
Aproximación 2 Detalle 2
2 0.5
0 0
−2 −0.5
0 500 1000 0 500 1000
Aproximación 3 Detalle 3
2 1
0 0
−2 −1
0 500 1000 0 500 1000
Aproximación 4 Detalle 4
2 2
0 0
−2 −2
0 500 1000 0 500 1000
Aproximación 5 Detalle 5
2 0.2
0 0
−2 −0.2
0 500 1000 0 500 1000

Figura C.1: Análisis wavelet completo de la señal freqbrk con la db5 y 5


niveles. Puede observarse que en el detalle D1 es en el que mejor se observa el
cambio de frecuencia.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero break_anal.m
%% Fichero para analizar la señal freqbrk.mat
%% Buscamos ‘‘breakdown points’’

clear;
load freqbrk.mat;
s = freqbrk;
C.1 Detección de “breakdown points” 127

ls = length(s);
w = ’db5’; % Wavelet
n = 5; % Niveles

[C,L] = wavedec(s,n,w); % Descomposición

for i = 1:n, % Iterador para automatizar


A(i,:) = wrcoef(’a’,C,L,w,i); % Aproximaciones
D(i,:) = wrcoef(’d’,C,L,w,i); % Detalles
end;

sr = waverec(C,L,w); % Reconstrucción

figure; % Gráficos
subplot(n+1,2,1); plot(s); title(’Original’);
subplot(n+1,2,2); plot(sr); title(’Reconstruida’);

for i = 1:n, % Iterador para automatizar


subplot(n+1,2,1+2*i);
plot(A(i,:));
[tit_a,err] = sprintf(’Aproximación %d’,i);
title(tit_a);
subplot(n+1,2,2+2*i);
plot(D(i,:));
[tit_d,err] = sprintf(’Detalle %d’,i);
title(tit_d);
end;

disc = find(D(1,:)==max(D(1,:))); % Índice con discontinuidad


sprintf(’Índice de la discontinuidad: %d’,disc)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Los detalles D1 y D2 muestran claramente la discontinuidad. Para localizar


el punto buscamos la posición del máximo del detalle D1 . Por medio de la orden
find obtendremos fácilmente que el máximo se alcanza en el índice 500.

disc = find(D(1,:)==max(D(1,:)));

Las señales de detalles D3 y D4 contienen el seno de menor frecuencia


mientras que el seno de mayor frecuencia queda perfectamente aislado en A5 .
128 Ejemplos y aplicaciones

C.1.2 Evolución a largo tiempo


Analizar la señal wnoislop.mat y obtener las conclusiones posibles en lo que a
puntos de ruptura se refiere y también identificar la evolución a largo tiempo
de la señal.
Justificación. La señal pertenece a una “rampa” a la que se le ha aña-
dido tanto ruido que no permite distinguir la evolución de la señal principal.
Concretamente pertenece al muestreo de la función
½ 3t
g(t) = 500 + ruido 1 ≤ t ≤ 499
3 + ruido 500 ≤ t ≤ 1000

Para analizarla se recomienda utilizar la wavelet ’db3’ y 6 niveles. El


gráfico que se genera al ejecutar el fichero evol_anal.m puede verse en la
figura C.2. Observar fundamentalmente como el ruido (frecuencias altas) queda
aislado en los detalles. Afinando un poco se puede incluso identificar el cambio
en la rampa alrededor del valor 500.

Original
4

−2
0 200 400 600 800 1000
Aproximación A6
5

−5
0 200 400 600 800 1000
Detalles D1+ . . +D6
1

−1
0 200 400 600 800 1000

Figura C.2: Análisis wavelet parcial de la señal wnoislop con la db3 y 6 niveles.
Puede observarse en la aproximación la evolución en el tiempo de la señal.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C.1 Detección de “breakdown points” 129

%% Fichero evol_anal.m
%% Fichero para analizar la señal wnoislop.m
%% Buscamos la evolución de la señal a largo tiempo

clear;
load wnoislop.mat;
s = wnoislop;
ls = length(s);
w = ’db3’; % Wavelet
n = 6; % Niveles

[C,L] = wavedec(s,n,w); % Descomposición

for i = 1:n, % Iterador para automatizar


A(i,:) = wrcoef(’a’,C,L,w,i); % Aproximaciones
D(i,:) = wrcoef(’d’,C,L,w,i); % Detalles
end;

figure; % Gráficos
subplot(3,1,1); plot(s,); title(’Original’);
subplot(3,1,2); plot(A(6,:)); title(’Aproximación A^6’);
subplot(3,1,3); plot(s-A(6,:)); title(’Detalles D^1+ . . +D^6’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

C.1.3 Discontinuidad en derivadas


Analizar la señal scddvbrk.mat y obtener las conclusiones posibles en lo que
a puntos de discontinuidad se refiere (en la señal o en sus derivadas).
Justificación. Para detectar discontinuidades en la derivada i-ésima de
una señal hay que utilizar una wavelet con al menos i momentos nulos. Utili-
zaremos una ’db4’ y varios niveles de transformada.
La señal considerada pertenece al muestreo de la función
½
exp(−4t2 ) −0.5 ≤ x ≤ 0
g(x) =
exp(−t2 ) 0 < x ≤ 0.5

que presenta una discontinuidad en su derivada segunda.


Desde la herramienta gráfica y ampliando convenientemente se observa que
los detalles tienen valores significativos en el centro de la señal y son despre-
ciables en cualquier otro lugar. Esto sugiere que hay información sobre algún
130 Ejemplos y aplicaciones

tipo de cambio. Si repetimos el cálculo con la wavelet haar o incluso con la


db2 se observa que los detalles en la discontinuidad valen cero. Esto es debido
a que el análisis debe realizarse con wavelets con al menos 2 momentos nulos.
Por comodidad para el lector incluimos el fichero disc_anal.m con el aná-
lisis de la señal y los parámetros de ampliación del gráfico necesarios para
observar la discontinuidad en la derivada segunda (figura C.3).

Original
1

0.5

100 200 300 400 500 600 700 800 900 1000
1
Detalle D
1
0
−1
100 200 300 400 500 600 700 800 900 1000
Detalle D2
1
0
−1
100 200 300 400 500 600 700 800 900 1000
−6 1
x 10 Ampliación apropiada de D
1
0
−1
100 200 300 400 500 600 700 800 900 1000
−6 2
x 10 Ampliación apropiada de D
2
0
−2
100 200 300 400 500 600 700 800 900 1000

Figura C.3: Análisis wavelet de la señal scddvbrk con la db4 y 2 niveles. Puede
observarse en la ampliación de los detalles la discontinuidad (en la segunda
derivada) de la señal.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Fichero disc_anal.m
%% Fichero para analizar la señal scddvbrk.mat
%% Buscamos discontinuidades, en la señal o sus derivadas

clear;
load scddvbrk.mat;
s = scddvbrk;
ls = length(s);
w = ’db4’; % Wavelet
n = 2; % Niveles
C.2 Identificando frecuencias puras 131

[C,L] = wavedec(s,n,w); % Descomposición

for i = 1:n, % Iterador para automatizar


A(i,:) = wrcoef(’a’,C,L,w,i); % Aproximaciones
D(i,:) = wrcoef(’d’,C,L,w,i); % Detalles
end;

figure; % Gráficos
subplot(5,1,1); plot(s);
title(’Original’);
axis([1 ls 0.2 1.1]);
subplot(5,1,2); plot(D(1,:));
title(’Detalle D^1’);
axis([1 ls -1 1]);
subplot(5,1,3); plot(D(2,:));
title(’Detalle D^2’);
axis([1 ls -1 1]);
subplot(5,1,4); plot(D(1,:));
title(’Ampliación apropiada de D^1’);
axis([1 ls -10^(-6) 10^(-6)]);
subplot(5,1,5); plot(D(2,:));
title(’Ampliación apropiada de D^2’);
axis([1 ls -.3*10^(-5) .3*10^(-5)]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

C.2 Identificando frecuencias puras


Con este ejemplo pretendemos ver cómo el análisis con wavelets nos permite
identificar lo que se conoce como una función tipo Fourier, esto es, descompo-
sición de la función como suma de sinusoides de diferentes frecuencias.
Analizar la señal sumsin.mat y obtener las conclusiones posibles en lo que
se refiere a la descomposición de la señal en suma de sinusoides de diferentes
frecuencias.
Justificación. Primero diremos que la señal ha sido generada a partir de
un muestreo de la función

s(t) = sin(3 t) + sin(0.3 t) + sin(0.003 t).

El análisis vamos a realizarlo con la wavelet db3 y 5 niveles de descomposición.


132 Ejemplos y aplicaciones

Por comodidad usaremos la herramienta gráfica (véase la figura C.4).

Signal and Approximation(s) Coefs, Signal and Detail(s)


5
2
4

s 0
3
2
cfs
1
−2
2
1
0 s
a5 0 −2

−1
0.1
1 0 d5
−0.1
a4 0
1
−1
0 d4
2
−1
a3 0
0.5

−2 0 d3
2 −0.5

0.1
a2 0
0 d2
−2
−0.1
1
1
a1 0
0 d1
−1
−1
200 400 600 800 1000 200 400 600 800 1000

Figura C.4: Análisis wavelet de la señal sumsin con la db3 y 5 niveles.

Después de analizar la señal observamos que aparecen varias sinusoides cla-


ramente identificadas. Algunas de las que mejor pueden verse las encontramos
en aproximación A4 , detalle D4 y detalle D1 . Corresponderían a sinusoides
lenta, media y rápida respectivamente.
Ampliaciones del detalle D1 nos permiten aislar un periodo y estimar que
está compuesto de unas 10 oscilaciones. Este dato puede ser usado para estimar
el periodo (respecto de los valores muestreados) con un resultado aproximado
de 2.
La señal detalle D3 (y también quizás la D4 ) está compuesta de las sinu-
soides de oscilación media. Observamos que de la aproximación A3 a la A4 ha
sido eliminada la información de la sinusoide media. Por tanto usaremos las
C.3 Análisis de un caso real 133

aproximaciones de la A1 a la A3 para obtener información del periodo de la


sinusoide de oscilación media. Ampliando A1 puede observarse que el periodo
es aproximadamente 20.
Sólo queda identificar el periodo de la sinusoide de oscilación lenta. Puede
ser estimado a partir de la aproximación A4 . Sin dificultad se observa que la
distancia entre dos máximos sucesivos es aproximadamente 200.

Ejercicio C.1 Construir (o modificar la anterior) otras señales formadas for


sumas de sinusoides e intentar identificar los periodos de las mismas.

C.3 Análisis de un caso real


En este ejemplo vamos a hacer un análisis más detallado de un caso práctico
(referencia [6] de la bibliografía). La fuente original del artículo es
Misiti, M.; Misiti, Y.; Oppenheim, G.; Poggi, J.M., Décompositio en
ondelettes et méthodes comparatives: étudy d’une courbe de charge électrique,
Revue de Statistique Appliqué vol. XLII (1994), n. 2, pp. 57–77.
Los datos pertenecen a un planta eléctrica. Consisten en los valores tomados
minuto a minuto de la carga eléctrica consumida durante un periodo de cinco
semanas. Se tiene un total de 50400 datos y en el fichero leleccum.mat hay
una porción (4320 datos) de ellos. Algunas características de los datos deben
ser comentados.

• Los datos finales se han calculado sumando cientos de valores tomados


con sensores de medida y por lo tanto se han generado errores al medir.

• En términos generales el consumo puede atribuirse en un 50 % a la in-


dustria y el otro 50 % al consumo individual.

• Hay más de 10 millones de consumidores individuales.

• Los periodos fundamentales son diarios y semanales, ligados a la activi-


dad económica.

• Los patrones de consumo diario también cambian con las horas (tempo-
rizadores de calefacción, etc.).

• Si en algún periodo los datos han “desaparecido”, éstos han sido reem-
plazados por otros.
134 Ejemplos y aplicaciones

• En algunos periodos de tiempo los sensores han fallado por encima de lo


normal y los errores de media se han incrementado (entre datos 2400 y
3400).
La wavelet que vamos a utilizar es db3 y calcularemos transformadas hasta
nivel 5 ya que 25 = 32 es cercano a un periodo de media hora. Las dos primeras
cuestiones corresponden al análisis de una parte de la señal. Las restantes al
análisis de un periodo de tres días (señal completa).

1. Analizar los datos comprendidos entre [3600 : 3700] que corresponden a


una franja horaria diurna entre las 12:00 y las 13:45 aproximadamente.
2. Analizar los datos comprendidos entre [1570 : 1720] que corresponden a
una franja horaria de dos horas y media aproximadamente al final del
periodo nocturno.
3. Observando la transformada wavelet trate de identificar donde se produjo
un fallo en los sensores de medida. Sugerencia: Examine directamente los
detalles D1 , D2 y D3 despreciando el resto.
4. Reduzca el ruido. Puede hacerlo directamente o utilizando la herramienta
gráfica correspondiente. Sugerencia: Examine las aproximaciones de dos
días sucesivos, el primero sin fallo en los aparatos de medida y el segundo
con fallo.
5. Identifique patrones en los detalles, por ejemplo, aquellos producidos por
temporizadores en los sistemas de agua caliente. Sugerencia: Examine
detalles D2 , D3 y D4 alrededor de los puntos 1350, 1383 y 1415.
6. Identifique datos (aproximadamente media hora) que han sido sustituidos
con estimaciones (calculadas con splines) en lugar de los valores reales
correspondientes. Sugerencia: Examine los datos alrededor del 2870 y
utilice las pequeñas variaciones que aparecen en D1 para detectar los
datos sustituidos.

C.4 Detección de auto-semejanza (estructura frac-


tal)
Veamos ahora una aplicación de transformada wavelet continua. El objetivo
es mostrar que el análisis con wavelets puede detectar auto-semejanza (estruc-
C.4 Detección de auto-semejanza (estructura fractal) 135

tura fractal) en señales. Desde un punto de vista intuitivo la transformada


wavelet continua es como un “índice de parecido” entre la señal y la wavelet.
Cuanto mayor es el índice mayor es el parecido y viceversa. Los índices son los
coeficientes de transformada.
Si una señal es auto-similar a diferentes escalas, entonces los coeficientes
(“índice de parecido”) también serán similares a diferentes escalas. Cuando
representamos gráficamente el escalograma de la señal con las escalas en el eje
vertical esta auto-semejanza en la señal genera un “patrón característico” de
las estructuras fractales auto-semejantes.

Ejercicio C.2 En el fichero vonkoch.mat puede encontrarse una señal cons-


truida de una manera recursiva.

1. Analizar la señal con la transformada wavelet continua del tipo coif3.


Los niveles de escalas serán desde 2 a 128 con incrementos de 2. Una vez
construido el escalograma es útil hacer uso de la herramienta de zoom.

2. Analizar la señal con otros tipos de wavelets y observar si también se


genera en el escalograma patrones propios de estructuras fractales auto
similares.

3. Si construimos el escalograma con un conjunto de escalas disjunto con el


anterior ¿Qué podemos observar?
Bibliografía

[1] E. Aboufadel and Schlicker S., Discovering Wavelets, Jonh Wiley & Sons,
1999.

[2] M. Frazier, An Introduction to Wavelets through Linear Algebra, Springer,


1999.

[3] S. Mallat, A wavelet Tour of Signal Processing, Academic Press, 1999.

[4] The MathWorks, Getting Started with MATLAB.

[5] M. Misiti, Y. Misiti, G. Oppenheim, and J.M. Poggi, Wavelet Toolbox for
use with MATLAB, The MathWorks.

[6] M. Misiti, Y. Misiti, G. Oppenheim, and J.M. Poggi, Décompositio en


ondelettes et méthodes comparatives: Étudy d’une courbe de charge élec-
trique, Revue de Statistique Appliqué 42 (1994), no. 2, 57–77.

[7] J.S. Walker, A Primer on Wavelets and their Scientific Applications,


Chapman & Hall/CRC, 1999.

[8] D.F. Walnut, An Introduction to Wavelet Analysis, Birkhäuser, 2002.

137