Está en la página 1de 5

Guı́a Laboratorio 3

Procesamiento Digital de Señales


Juan Camilo Vásquez, Tomás Arias, Luis David Goyes, Nicanor Garcı́a, Jhony Giraldo.
Marzo 2018

NOTAS:
Enviar el informe del laboratorio con el siguiente nombre: Lab3 PDS Apellido Nombre.ipynb
Enviar junto con el informe los archivos adicionales generados y descargados. Todo esto debe ir en un archivo
comprimido con el siguiente nombre: Lab3 PDS Apellido Nombre.zip

1. Análisis de series de tiempo


Para esta práctica trabajará con una de dos señales disponibles de acuerdo al último dı́gito de su cédula.

1.1. Análisis de señales económicas


Si el último número de su documento de identidad es par, utilizará los datos acerca de la Tasa de Cam-
bio Representativa del Mercado (TCRM) obtenidos de la Superintendencia Financiera de Colombia: https:
//www.superfinanciera.gov.co/publicacion/60819
Estos datos contienen el valor dı́a a dı́a de TCRM, es decir, la cantidad de pesos colombianos (COP) por un dólar
de los Estados Unidos (USD). Los valores van desde el primero de Diciembre de 1991.

Este es un archivo de Excel y contiene tres columnas:

1. La fecha.
2. Festivo, indicando que ese dı́a no se transó.
3. TCRM, en COP.

Para cargar este archivo a una matriz podemos utilizar el siguiente comando:

import pandas as pd
data=pd.read excel("historiatrm.xls")

La señal que nos interesa está en la columna “TCRM” mientras que las fechas nos servirán para graficar y hacer
análisis, para ello las extraemos de la siguiente manera:

senal=data['TCRM']
fechas=data['Fecha']

1.2. Análisis de señales climáticas


Si el último número de su documento de identidad es impar, se utilizará una señal que contiene la cantidad diaria
de lluvia en una región del sur del amazonas desde 1978 hasta 2011. El archivo “data precipitacion.csv” contiene 3
columnas con la siguiente información:

1. Dı́a, desde 1 hasta 365, de acuerdo al dı́a de cada año.

1
2. Año, desde 1978 hasta 2011.
3. Valor de la precipitación (en mm de precipitación).

Para cargar este archivo a una matriz podemos utilizar el siguiente comando:

import pandas as pd
data=pd.read csv('archivoslab3/data precipitacion.csv')

La señal que nos interesa está en la columna “prec” mientras que la fecha nos servirán para graficar y hacer análisis,
para ello las extraemos y generamos de la siguiente manera:

senal=data['prec']

En este caso se debe generar el vector de fechas para hacer análisis de la siguiente manera:

from datetime import datetime


fechas=pd.to datetime(np.arange(data.shape[0])+1,unit='D',origin=pd.Timestamp('1978-01-01'))

1.3. Análisis de la serie de tiempo


1. Abra el archivo con la señal en un programa externo (Excel ó editor de texto de acuerdo a la señal). Verifique
que los datos se ajustan a la descripción realizada previamente.

2. Visualice algunos de los datos usando las siguientes instrucciones en celdas separadas.

data.head()
data.tail()

3. Cuál es el periodo de muestreo para la señal? Expréselo en dı́as y luego en años.


4. Grafique la señal asignada en función del tiempo y presente un breve análisis sobre la misma.
Para mejorar la visualización considere las siguientes instrucciones (no olvide agregar las etiquetas correspon-
dientes y los tı́tulos con un tamaño de fuente apropiado).

plt.figure(figsize=(15,8))
plt.plot(fechas,senal)
plt.grid()
plt.show()

5. Realice un histograma de la señal previa, y analice el resultado de la gráfica, utilice la función:

plt.hist(senal[np.isnan(senal)!=True],50)
plt.show()

¿Qué puede decir de la distribución de la señal?


6. Indique la fecha de expedición de su cédula y el valor de la señal ese dı́a. Tip: para obtenerlo adapte el siguiente
comando:

from datetime import datetime # Para generar un objeto tipo datetime, que almacena fechas en Python
indiceD=fechas == datetime(2016,8,12)
senalD = senal[indiceD].values[0]

7. Grafique y analice brevemente el comportamiento de la señal en el año en que usted nació.


Tip: Para obtener el vector de un año adapte el siguiente comando:

2
indices2000 = fechas.dt.year == 2000
senal2000 = senal[indices2000]

2. Filtro de media móvil


En muchos casos es útil eliminar ruido aleatorio de alta frecuencia para suavizar la señal de interés y observar
el comportamiento más general de la señal. El filtro de media móvil (MA) es un filtro que permite realizar este
proceso. En este caso se utilizará para suavizar las señales.
Este filtro tiene la siguiente ecuación en diferencias:
L−1
1 X
y[n] = x[n − i] (1)
L i=0

donde L es el número de puntos usados (orden del filtro), x[n] es la señal de entrada y y[n] es la señal de salida.
Para generar los coeficientes de un filtro de media móvil con L variable en Python, se puede utilizar el siguiente
código:

coefs=np.ones(L)/float(L)

Este filtro tiene función de transferencia:


L−1
1 X −i 1 1 − z −L 1 zL − 1
H(z) = z = · = · (2)
L i=0 L 1 − z −1 L z L−1 (z − 1)
Para representar el denominador, el numerador y la respuesta natural de esta función de transferencia en Python
se puede utilizar el siguiente código:

num=np.zeros(L)
num[0]=1.0/L
num[-1]=-1.0/L
den=np.zeros(L)
den[0]=1
den[1]=-1

Los ceros están determinados por las raı́ces de la ecuación z L − 1 = 0, es decir, z L = 1. Las raı́ces se pueden
encontrar con base en que ej2πk = 1 para cualquier k entero. Las raı́ces serán:

zk = ej2πk/L (3)

2.1. Procedimiento
1. Diseñe un filtro de media móvil con diferentes valores de L, calcule la respuesta de la señal ante dicho filtro
y grafique la señal resultante (se puede utilizar el vector de tiempos generado anteriormente). ¿Con cual
considera que se visualiza y se podrı́a analizar mejor la información?
Tip: Para calcular la salida se usa la convolución:

senal smooth=np.convolve(senal, coefs, mode='same')

donde senal es el vector con la señal.


¿Por qué se debe usar mode=’same’ ?
2. Diseñe y calcule la señal de salida para filtros de un mes (L = 30), un trimestre (L = 90) y un año (L = 365).
Grafique las señales resultantes. ¿Con cual considera que se visualiza y se podrı́a analizar mejor la información?
3. Importe las funciones del archivo ztrans.py incluido con esta guı́a (asegúrese de ubicarlo en la misma carpeta
del Notebook), las cuales calculan la respuesta en frecuencia, respuesta al escalón, y al impulso
Tip: Para hacerlo utilice el siguiente comando:

3
from ztrans import *

4. Utilice la función impz para graficar y analizar la respuesta al impulso y al escalón del filtro de media móvil.
¿Qué me indica la respuesta al impulso? Hágalo para L = 7 y L = 30. Tip: para usarla utilice el siguiente
comando:

impz(num,den)

5. Utilice la función mfreqz para graficar y analizar la respuesta en frecuencia del filtro de media móvil. ¿Qué
tipo de filtro es? ¿Cómo es su respuesta en fase? Compare los resultados con L = 7 y L = 30.
Tip: para usarla utilice el siguiente comando:

mfreqz(num,den)

3. Filtro de primera diferencia


En muchos casos es útil analizar la tasa a la que cambia alguna variable. Para una señal continua se utiliza la
derivada. En el caso de señales en tiempo discreto se utiliza el filtro de primera diferencia, el cual tiene como
ecuación en diferencias:

y[n] = x[n] − x[n − 1] (4)


Los coeficientes de este filtro se pueden generar con la siguiente instrucción:

difcoefs=[1, -1]

Y su función de transferencia es:


z−1
H(z) = 1 − z −1 = (5)
z
Para representar el denominador y el numerador de esta función de transferencia en Python se puede utilizar el
siguiente código:

num=[1, -1]
den=[1, 0]

1. Mediante la función de convolución utilizada anteriormente, calcule la derivada de la señal con el filtro de
primera diferencia, grafique y analice brevemente la señal resultante. ¿Qué me indica esta señal?

2. Utilice la función impz para graficar y analizar la respuesta al impulso y al escalón del filtro de primera
diferencia. ¿Qué me indica la respuesta al impulso?
3. Utilice la función mfreqz para graficar y analizar la respuesta en frecuencia del filtro de primera diferencia.
¿Qué tipo de filtro es? ¿Cómo es la respuesta de fase?

4. Conclusiones
Realice conclusiones generales sobre la práctica.

4
5. Bonus
Implemente una interfaz gráfica en el Notebook que permita seleccionar un rango de fechas a analizar, si se quiere
aplicar un filtro, el tipo de filtro a aplicar y el orden en el caso del filtro de media.
Tip: puede ayudarse con la siguiente páginas

http://jupyter.org/widgets
https://blog.dominodatalab.com/interactive-dashboards-in-jupyter/
http://ipywidgets.readthedocs.io/en/latest/examples/Using%20Interact.html

También podría gustarte