Logo Studenta

Processamento Digital de Sinais - Mini Projeto 2

¡Este material tiene más páginas!

Vista previa del material en texto

StuDocu n'est pas sponsorisé ou supporté par une université ou école
Mini Proyecto 2 - Nota: 10
Procesamiento Digital De Señales (Escuela Superior Politécnica del Litoral)
StuDocu n'est pas sponsorisé ou supporté par une université ou école
Mini Proyecto 2 - Nota: 10
Procesamiento Digital De Señales (Escuela Superior Politécnica del Litoral)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
https://www.studocu.com/ec/document/escuela-superior-politecnica-del-litoral/procesamiento-digital-de-senales/dissertations/mini-proyecto-2-nota-10/5717891/view?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
https://www.studocu.com/ec/course/escuela-superior-politecnica-del-litoral/procesamiento-digital-de-senales/4194420?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
https://www.studocu.com/ec/document/escuela-superior-politecnica-del-litoral/procesamiento-digital-de-senales/dissertations/mini-proyecto-2-nota-10/5717891/view?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
https://www.studocu.com/ec/course/escuela-superior-politecnica-del-litoral/procesamiento-digital-de-senales/4194420?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
TELG1011 - Reporte de Mini-proyecto #2
Miembros del Grupo:
Alvaro Sergio Bustamante Moran, 201401205
Briones Rugel Stefano David, 201413700
Fecha: Septiembre 3, 2017
In [462]:
import numpy as np 
import scipy.signal as signal 
import matplotlib.pyplot as plt 
from scipy import special 
from matplotlib import mlab 
%matplotlib inline 
%pylab inline 
Codigos que nos seran utiles a lo largo del proyecto[1]
In [463]:
def freqs_m(b,a,wmax): 
 w = np.arange(0,500)*wmax/50. 
 w,H = signal.freqs(b,a,worN=w) 
 mag = np.abs(H) 
 eps = np.finfo(float).eps 
 db = 20*np.log10((mag+eps)/np.max(mag)) 
 phase = np.angle(H) 
 return db, mag, phase,w 
 
%pylab inline 
def plot_freq_domain(w1, dB1, phase1, fs): 
 fig,ax = subplots(2, sharex=True) 
 freq = fs*w1/(2*np.pi) # convierte frecuencias digitales a analogicas 
 ax[0].plot(freq,dB1) 
 ax[0].set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
 ymin,ymax = -80,5 
 ax[0].axis(ymin = ymin,ymax=ymax) 
 ax[0].axis(xmin = w1[0],xmax=1.0) 
 ax[0].grid() 
 ax[1].plot(freq,phase1*180/np.pi) 
 ax[1].set_xlabel("frequency $\omega / \pi$",fontsize=16) 
 ax[1].set_ylabel(r"$ Phase [deg]$",fontsize=22) 
 ax[1].grid() 
 fig.tight_layout() 
 
Populating the interactive namespace from numpy and matplotlib 
Populating the interactive namespace from numpy and matplotlib 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
Funcion para graficar en plano Z[2]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [464]:
def zplane(b,a,auto_scale=True,size=2,detect_mult=True,tol=0.001): 
 """ 
 The code module ssd.py was developed to accompany the book 
 Signals and Systems for Dummies published by Wiley Publishing. 
 
 Copyright 2012, 2013 Mark Wickert, mwickert@uccs.edu 
 
 Create an z-plane pole-zero plot. 
 
 Create an z-plane pole-zero plot using the numerator 
 and denominator z-domain system function coefficient 
 ndarrays b and a respectively. Assume descending powers of z. 
 
 Parameters 
 ---------- 
 b : ndarray of the numerator coefficients 
 a : ndarray of the denominator coefficients 
 auto_scale : bool (default True) 
 size : plot radius maximum when scale = False 
 
 Returns 
 ------- 
 (M,N) : tuple of zero and pole counts + plot window 
 
 Notes 
 ----- 
 This function tries to identify repeated poles and zeros and will 
 place the multiplicity number above and to the right of the pole or zero. 
 The difficulty is setting the tolerance for this detection. Currently it 
 is set at 1e-3 via the function signal.unique_roots. 
 
 Examples 
 -------- 
 >>> # Here the plot is generated using auto_scale 
 >>> zplane(b,a) 
 >>> # Here the plot is generated using manual scaling 
 >>> zplane(b,a,False,1.5) 
 """ 
 M = len(b) - 1 
 N = len(a) - 1 
 # Plot labels if multiplicity greater than 1 
 x_scale = 1.5*size 
 y_scale = 1.5*size 
 x_off = 0.02 
 y_off = 0.01 
 #N_roots = np.array([1.0]) 
 if M > 0: 
 N_roots = np.roots(b) 
 #D_roots = np.array([1.0]) 
 if N > 0: 
 D_roots = np.roots(a) 
 if auto_scale: 
 if M > 0 and N > 0: 
 size = max(np.max(np.abs(N_roots)),np.max(np.abs(D_roots)))+.1 
 elif M > 0: 
 size = max(np.max(np.abs(N_roots)),1.0)+.1 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
 elif N > 0: 
 size = max(1.0,np.max(np.abs(D_roots)))+.1 
 else: 
 size = 1.1 
 plt.figure(figsize=(5,5)) 
 plt.axis('equal') 
 r = np.linspace(0,2*np.pi,200) 
 plt.plot(np.cos(r),np.sin(r),'r--') 
 plt.plot([-size,size],[0,0],'k-.') 
 plt.plot([0,0],[-size,size],'k-.') 
 if M > 0: 
 if detect_mult == True: 
 N_uniq, N_mult = unique_cpx_roots(N_roots,tol=tol) 
 plt.plot(np.real(N_uniq),np.imag(N_uniq),'ko',mfc='None',ms=8) 
 idx_N_mult = mlab.find(N_mult>1) 
 for k in range(len(idx_N_mult)): 
 x_loc = np.real(N_uniq[idx_N_mult[k]]) + x_off*x_scale 
 y_loc =np.imag(N_uniq[idx_N_mult[k]]) + y_off*y_scale 
 
plt.text(x_loc,y_loc,str(N_mult[idx_N_mult[k]]),ha='center',va='bottom',fontsize=10) 
 else: 
 plt.plot(np.real(N_roots),np.imag(N_roots),'ko',mfc='None',ms=8) 
 
 if N > 0: 
 if detect_mult == True: 
 D_uniq, D_mult=unique_cpx_roots(D_roots,tol=tol) 
 plt.plot(np.real(D_uniq),np.imag(D_uniq),'kx',ms=8) 
 idx_D_mult = mlab.find(D_mult>1) 
 for k in range(len(idx_D_mult)): 
 x_loc = np.real(D_uniq[idx_D_mult[k]]) + x_off*x_scale 
 y_loc =np.imag(D_uniq[idx_D_mult[k]]) + y_off*y_scale 
 
plt.text(x_loc,y_loc,str(D_mult[idx_D_mult[k]]),ha='center',va='bottom',fontsize=10) 
 
 else: 
 plt.plot(np.real(D_roots),np.imag(D_roots),'kx',ms=8) 
 if M - N < 0: 
 plt.plot(0.0,0.0,'bo',mfc='None',ms=8) 
 elif M - N > 0: 
 plt.plot(0.0,0.0,'kx',ms=8) 
 if abs(M - N) > 1: 
 plt.text(x_off*x_scale,y_off*y_scale,str(abs(M-N)),ha='center',va='bottom',font
size=10) 
 plt.xlabel('Real Part') 
 plt.ylabel('Imaginary Part') 
 plt.title('Pole-Zero Plot') 
 #plt.grid() 
 plt.axis([-size,size,-size,size]) 
 return M,N 
 
def unique_cpx_roots(rlist,tol = 0.001): 
 """ 
 
 The average of the root values is used when multiplicity 
 is greater than one. 
 
 Mark Wickert October 2016 
 """ 
 uniq = [rlist[0]] 
 mult = [1] 
 for k in range(1,len(rlist)): 
 N_uniq = len(uniq) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
 N_uniq = len(uniq) 
 for m in range(N_uniq): 
 if abs(rlist[k]-uniq[m])<= tol: 
 mult[m] += 1 
 uniq[m] = (uniq[m]*(mult[m]-1) + rlist[k])/float(mult[m]) 
 break 
 uniq = np.hstack((uniq,rlist[k])) 
 mult = np.hstack((mult,[1])) 
 return np.array(uniq), np.array(mult) 
In [465]:
matplotlib.rcParams['figure.figsize'] = (15, 5) 
Primera Parte: Diseño de Filtros FIR CON FUNCIONES
VENTANA
El método de la ventana para diseñar filtros FIR comienza con una aproximación según el criterio de error
cuadrático mínimo. Si el filtro deseado tiene una respuesta paso bajo básica, la respuesta al impulso del
filtro óptimo ideal pasobajo es :
La versión truncada y desplazada es :
donde .Las 4 ventanas coseno generalizadas vienen dadas por :
Los nombres de las ventanas y sus parámetros son :
Ventana Nombre en PYTHON SCIPY a b c
Retangular boxcar 1 0 0
Hann hanning 0.5 -0.5 0
Hamming hamming 0.54 -0.46 0
Blackman blackman 0.42 -0.5 0.08
Otra ventana conocida es la de Kaiser que se la analizara a profundidad mas adelante.
Subtarea 1.1:Diseño de un Filtro paso bajo empleando
ventanas
Antes de contruir el filtro paso banda, es necesario primero contruir un filtro paso bajo ideal que es lo que
procederemos a continuacion :
(n) =h
d
sin( n)ω
0
πn
h(n) = {
;
sin( (n−M)ω
0
π(n−M)
0;
0 ≤ n ≤ L − 1
otros
M =
L−1
2
h(n) = {
a − bcos( ) + ccos( );
2πn
L−1
4πn
L−1
0;
0 ≤ n ≤ L − 1
otros
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
Para esto tomaremos como referencia los codigos usados anteriormente visto en clases.
In [466]:
#filtro ideal paso bajo 
def ideal_lpf(wc, M): 
 'wc: es la frecuencia de corte \\ 
 M: es la longtud del filtro' 
 alpha = (M-1)/2 
 n = np.arange(0,M) 
 m = n - alpha 
 fc = wc / np.pi 
 h = fc * np.sinc(fc*m) 
 return h 
 
#Obtiene respuesta de magnitud , la fase y el retardo de grupo. 
def freqz_mod(b,a): 
 [w, H] = signal.freqz(b,a,1000,'True') # mil frecuencias espaciadas equidistantemen
te 
 H = np.transpose(H[0:501]) 
 w = np.transpose(w[0:501]) 
 magH = np.abs(H) 
 dB = 20 * np.log10(magH/magH.max()) 
 phase = np.angle(H) 
 grpdelay = signal.group_delay((b,a)) 
 return dB, phase, grpdelay, w 
El valor passband es igual al stopband entonces tenemos que es igual a .
In [467]:
wp = 0.3*np.pi # PassBand 
ws = 0.4*np.pi # StopBand 
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
In [468]:
# Usamos la longitud de ventana propuesta en el ejercicio 
N=23 
a) Rectangular
Creamos nuestra ventana rectangular de longitud 23,
0.4π
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [469]:
N = 23 
window = signal.boxcar(N) 
plot(window) 
In [470]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
In [471]:
# Aplicar la ventana al filtro ideal 
h = window * hd 
Aplicando la ventana al filtro ideal y gráficamos la respuesta al impulso
In [472]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
Ahora graficamos su magnitud,
Out[469]:
[<matplotlib.lines.Line2D at 0x25aaa5c0>]
Out[472]:
<matplotlib.text.Text at 0x24893f98>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [473]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
In [474]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Los ceros se muestran a continuacion:
In [475]:
# coeficientes: 
w0=0.3*np.pi 
dw= 0.05 
r = 1 - dw/2 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [476]:
zplane(b,a) 
Cabe recalcar que estos se encuentran dentro del circulo unitario, esto nos quiere decir que es un sistema
estable.
b) Triangular o Barlett
Realizamos la ventana triangular,
In [477]:
window = signal.bartlett(N) 
plot(window) 
Out[476]:
(2, 2)
Out[477]:
[<matplotlib.lines.Line2D at 0x23c47400>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [478]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [479]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
Obtenemos su magnitud,
In [480]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Out[479]:
<matplotlib.text.Text at 0x2580e8d0>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [481]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [482]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Obtenemos sus ceros,
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [483]:
zplane(b,a) 
c) Hanning
Realizamos primero la ventana Hanning
In [484]:
window = signal.hann(N) 
plot(window) 
Out[483]:
(2, 2)
Out[484]:
[<matplotlib.lines.Line2D at 0x26d8c160>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [485]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [486]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
Obtenemos su magnitud,
In [487]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Out[486]:
<matplotlib.text.Text at 0x27c0e048>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [488]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18)ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [489]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Obtenemos nuevamente los ceros,
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [490]:
zplane(b,a) 
d) Hamming
Creamos la ventana Hamming,
In [491]:
window = signal.hamming(N) 
plot(window) 
Out[490]:
(2, 2)
Out[491]:
[<matplotlib.lines.Line2D at 0x280fa358>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [492]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
Graficamos la respuesta al impulso,
In [493]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [494]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Ahora su magnitud,
Out[493]:
<matplotlib.text.Text at 0x28380780>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [495]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [496]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Obtenemos los ceros,
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [497]:
zplane(b,a) 
e) Blackman
Creamos la ventana Blackman,
In [498]:
window = signal.blackman(N) 
plot(window) 
Out[497]:
(2, 2)
Out[498]:
[<matplotlib.lines.Line2D at 0x2895bc50>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [499]:
window = signal.blackman(N) 
plot(window) 
Ahora obtenemos su respuesta al impulso,
In [500]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [501]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Y obtenemos su magnitud,
Out[499]:
[<matplotlib.lines.Line2D at 0x28a28358>]
Out[500]:
<matplotlib.text.Text at 0x294da7f0>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [502]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Respuesta a la Frecuencia Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [503]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
# Graficar el plano-zPor ultimo, obtenemos sus ceros,
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [504]:
zplane(b,a) 
SUBTAREA 1.2: Diseño de un iltro paso banda empleando
ventanas
se diseñara un filtro paso banda con las siguientes caracteristicas:
Banda de rechazo inferior es : 
Banda de paso es: 
Banda de rechazo superior es : 
In [505]:
wp = 0.1*np.pi # PassBand 
ws = 0.3*np.pi # StopBand 
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
Usamos una longitud de transicion de banda igual a 31,
In [506]:
N = 31 
Tomamos de referencia a la ventana rectangular creada
anteriormente,
0 ≤ ω ≤ 0.08π
0.1π ≤ ω ≤ 0.3π
0.4π ≤ ω ≤ π
Out[504]:
(2, 2)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [507]:
window = signal.boxcar(N) 
plot(window) 
In [508]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [509]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [510]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Obtenemos su magnitud,
Out[507]:
[<matplotlib.lines.Line2D at 0x28a0d6d8>]
Out[509]:
<matplotlib.text.Text at 0x284ef668>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [511]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Ahora usamos la ventana Triangular o Barllet,
In [512]:
window = signal.bartlett(N) 
plot(window) 
Out[512]:
[<matplotlib.lines.Line2D at 0x27f12208>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [513]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [514]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [515]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Out[514]:
<matplotlib.text.Text at 0x26b05e48>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [516]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3))ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Ahora usamos la ventana Hanning,
In [517]:
window = signal.hann(N) 
plot(window) 
Out[517]:
[<matplotlib.lines.Line2D at 0x25b682e8>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [518]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [519]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [520]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Obtenemos ahora su magnitud,
Out[519]:
<matplotlib.text.Text at 0x22b77550>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [521]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Por ultimo usamos la ventana Hamming,
In [522]:
window = signal.hamming(N) 
plot(window) 
Out[522]:
[<matplotlib.lines.Line2D at 0x1ed96c88>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [523]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [524]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [525]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Y encontramos su magnitud,
Out[524]:
<matplotlib.text.Text at 0x256578d0>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [526]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Usando la Ventana Blackman
In [527]:
window = signal.blackman(N) 
plot(window) 
Out[527]:
[<matplotlib.lines.Line2D at 0x25bede48>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [528]:
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
 
# Aplicar la ventana al filtro ideal 
h = window * hd 
In [529]:
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Impulse Response", size=18) 
In [530]:
# Obtener la respuesta de frecuencia 
[dB, phase, grpdelay, w] = freqz_mod(h,1) 
Y hallamos su magnitud,
Out[529]:
<matplotlib.text.Text at 0x1b621438>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [531]:
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Hemos llegado a la conclusion que al momento de escoger que tipo de filtro se quiere usar podria ser el
triangular ya que este carece de ripple que son esas pequeñas oscilaciones, mientras que las ventanas de
Hanning y Hamming si tienen ripple. Por otro lado, la ventana Blackman pierde fuerza en su magnitud con el
tiempo, es decir que se va atenuando conforme transcurre el tiempo.
SUBTAREA 1.3: Uso de la ventana de Kaiser
a. Dibuje la relación (3-5) para ver el rango normal de valores de . ¿Por qué
es cuando ?
β
β = 0 A < 21
β =
⎧
⎩
⎨
0.1102(A − 8.7)  para 50 < A
0.5842(A − 21 + 0.07886(A − 21)  para 21 < A < 50)
0.4
0  para A < 21
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [532]:
A = np.arange(0, 100, 1) 
B = np.zeros(len(A)) 
B[0:21] = 0 
B[21:50] = (0.5842*((A[21:50]-21)**(0.4))) + (0.07886*(A[21:50]-21)) 
B[50: 100] = 0.1102*(A[50:100]-8.7) 
plot(A, B) 
title("beta vs Atenuacion", fontsize=18) 
En esta ecuacion en funcion de se puede ver que para A < 21 si Beta toma un valor diferente de 0
entonces cae en el rango de A > 21.
b. Diseñe un filtro de longitud 23 con las mismas especificaciones del
Subtarea 1.1. pero empleando una ventana de Kaiser con = 4, 6 y 9. Dibuje la
respuesta al impulso. la función de amplitud y la posición de los ceros para
los tres filtros. Compárelos entre sí y con los resultados del Subtarea 1.1.
¿Cómo varía con el compromiso entre la anchura de la banda de transición y
las sobre-oscilaciones?
Con = 4
In [533]:
wp = 0.3*np.pi 
Rp = 0.25 
ws = 0.4*np.pi 
beta = 4 
N=23 
β
β
Out[532]:
<matplotlib.text.Text at 0x27e76da0>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [534]:
window = signal.kaiser(N,beta) 
plot(window) 
In [535]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
Out[534]:
[<matplotlib.lines.Line2D at 0x28040048>]
Out[535]:
<matplotlib.text.Text at 0x26c477b8>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [536]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [537]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Téléchargé par Mariadel Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [538]:
zplane(b,a) 
Con = 6
In [539]:
wp = 0.3*np.pi 
Rp = 0.25 
ws = 0.4*np.pi 
beta = 6 
N=23 
In [540]:
window = signal.kaiser(N,beta) 
plot(window) 
β
Out[538]:
(2, 2)
Out[540]:
[<matplotlib.lines.Line2D at 0x29ce47b8>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [541]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
In [542]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Out[541]:
<matplotlib.text.Text at 0x29ffd710>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [543]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
In [544]:
zplane(b,a) 
Con = 9
In [545]:
wp = 0.3*np.pi 
Rp = 0.25 
ws = 0.4*np.pi 
beta = 9 
N=23 
β
Out[544]:
(2, 2)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [546]:
window = signal.kaiser(N,beta) 
plot(window) 
In [547]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
Out[546]:
[<matplotlib.lines.Line2D at 0x2b701278>]
Out[547]:
<matplotlib.text.Text at 0x2b997240>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [548]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [549]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [550]:
zplane(b,a) 
Notamos claramente que mientras el valor de Beta aumenta, la atenuacion de la stopband aumenta tambien
causando una mayor transicion en la misma, variando el valor de Beta se podria obtener un filtro similar al
de ventana visto anteriormente.
SUBTAREA 1.4: Diseño de filtros paso banda con ventana
Kaiser
Aplique la ventana de Kaiser con los tres valores de dados en el Subtarea 1.3 a un filtro paso banda como el
del Subtarea 1.2. Analice la función de amplitud y compárela con los resultados del Subtarea 1.2.
In [551]:
wp = 0.1*np.pi # PassBand 
ws = 0.3*np.pi # StopBand 
N=31 
aplicando Kaiser con = 4
In [552]:
Rp = 0.25 
beta = 4 
β
Out[550]:
(2, 2)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [553]:
window = signal.kaiser(N,beta) 
plot(window) 
In [554]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
Out[553]:
[<matplotlib.lines.Line2D at 0x2beb4f60>]
Out[554]:
<matplotlib.text.Text at 0x2c229358>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [555]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
aplicando Kaiser con = 6
In [556]:
Rp = 0.25 
beta = 6 
In [557]:
window = signal.kaiser(N,beta) 
plot(window) 
β
Out[557]:
[<matplotlib.lines.Line2D at 0x2bfda828>]
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [558]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
In [559]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Out[558]:
<matplotlib.text.Text at 0x2ce8c208>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
aplicando Kaiser con = 9
In [560]:
Rp = 0.25 
beta = 9 
In [561]:
window = signal.kaiser(N,beta) 
plot(window) 
In [562]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
β
Out[561]:
[<matplotlib.lines.Line2D at 0x2d095da0>]
Out[562]:
<matplotlib.text.Text at 0x2cbb64e0>
Téléchargé par Maria delSol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [563]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
Notamos que conforme el valor de beta aumenta, el ancho de la banda de transicion, el ripple, y la
atenuacion tambien lo hace. Lo ideal sera disminuir el valor de dependiendo el uso del filtro.
SUBTAREA 1.5: Error de Chebyshev en la ventana de
Kaiser
a) Las especificaciones de un filtro FIR paso bajo de longitud 23 son una
banda de paso en el rango de :
Banda de paso es: 
Banda eliminada es : 
Diseñe un conjunto de filtros empleando la ventana Kaiser.
In [564]:
wp = 0.2*np.pi 
Rp = 0.35 
ws = 0.3*np.pi 
beta = 4 
β
0 ≤ ω ≤ 0.3π
0.35π ≤ ω ≤ π
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
Con = 4
In [565]:
window = signal.kaiser(N,beta) 
plot(window) 
In [566]:
transition = ws - wp # banda transicion 
wc = (ws + wp) / 2 # frecuencia de corte 
# Crear el filtro ideal de acuerdo a las especificaciones 
hd = ideal_lpf(wc,N) 
# Aplicar la ventana al filtro ideal 
h = window * hd 
# la respuesta al impulso (coeficientes FIR) 
stem(h) 
title(r"Filtro Ideal Paso Bajo", size=18) 
β
Out[565]:
[<matplotlib.lines.Line2D at 0x2bcdcdd8>]
Out[566]:
<matplotlib.text.Text at 0x2b4b0a58>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [567]:
#Para graficarlo de otra forma 
fig,ax = subplots() 
ax.plot(w/np.pi,dB) 
title(r"Respuesta a la Frecuencia Magnitud", size=18) 
ax.set_xlabel("frequency $\omega / \pi$",fontsize=16) 
ax.set_ylabel(r"$ |H(\omega)| [dB]$",fontsize=22) 
ymin,ymax = -80,5 
ax.axis(ymin = ymin,ymax=ymax) 
ax.add_patch(Rectangle((0,ymin),width=wp/np.pi,height=ymax-ymin,color='g',alpha=0.3)) 
ax.add_patch(Rectangle((wp/np.pi,ymin),width=transition/np.pi,height=ymax-
ymin,color='r',alpha=0.3)) 
ax.add_patch(Rectangle((ws/pi,ymin),width=1.0-ws/np.pi,height=ymax-
ymin,color='y',alpha=0.3)) 
ax.axhline(y=-50, color='k') 
ax.grid() 
In [568]:
# coeficientes: 
w0=0.3*np.pi 
b0 = np.abs(np.exp(2j*w0) - 2*r*np.cos(w0)*np.exp(1j*w0)+r**2) / 
np.abs(np.exp(2j*w0)-1) 
 
# Creando los coeficientes numerador y denominador usando funcion transferencia H(z) 
 
b = b0* np.array([1.0, 0, -1.0]) 
a = np.array([1, -2*r*np.cos(w0), r**2]) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [569]:
zplane(b,a) 
Segunda Parte: Diseño de Filtros IIR PASO ALTO, PASO BAJO Y
BANDA ELIMINADA
Introduccion Filtros IIR
Los filtros IIR son sistemas cuya salida depende además de salidas anteriores y que, estando en reposo, al
ser estimulados con una entrada impulsional su salida no vuelve al reposo, de ahí el calificativo de filtros de
respuesta impulsional infinita (IIR). La ecuación en diferencias general es de la forma:
La funcion de transferencia de dichos filtros puede ser expresada mediante la siguiente forma:
Subtarea 2.1: Filtro de Butterworth paso bajo
Introduccion FILTROS PASO BAJO
y(n) = x(n) + x(n − 1)+. . + x(n −M) − y(n − 1) − y(n − 2) − y(n −M)b
0
b
1
b
M
a
1
a
2
a
N
y(n) = ∗ x(n − k) ⋅ − ∗ y(n − k)∑
k=0
M
b
k
∑
k=1
N
a
k
H(z) =
∗∑
M
k=0
b
k
z
−k
∗∑
N
k=1
a
k
z
−k
Out[569]:
(2, 2)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
Un filtro paso bajo es un filtro que permite las señales situadas por debajo de una frecuencia de corte
(conocida como banda de paso) y atenúa las señales situadas por encima de la frecuencia de corte
(conocida como banda de atenuación).
En esta seccion se diseñara un filtro BUTTERWORTH paso bajo de orden 5 mediante el uso de la libreria
scipy signal de python con la funcion butter.
Las caracteristicas del filtro a diseñar son las siguientes:
Frecuencia de Muestreo:
Limite de la Banda de Paso:
In [570]:
def butter_lowpass(cutoff, fs, order,analog): 
 if analog==True: 
 normal_cutoff = cutoff*np.pi 
 b, a = signal.butter(order, normal_cutoff, btype='low', analog=True) 
 else: 
 nyq = 0.5 * fs 
 normal_cutoff = cutoff / nyq 
 b, a = signal.butter(order, normal_cutoff, btype='low', analog=False) 
 return b, a 
La funcion presentada en la celda anterior nos retornara un filtro BUTTERWORTH[3] paso bajo, para este
caso nos retornara los coeficientes b,a de dicho filtro. Cabe recalcar que la libreria scipy nos permite crear
filtros tanto digital como analogicos, para efecto de estudio mostraremos ambos filtros y un breve ejemplo de
su aplicacion graficamente.
In [571]:
# Requerimientos del Filtro 
order = 5 
fs = 2. # frecuencia de muestreo, Hz 
cutoff = 0.7 # frecuencia de corte deseada de nuestro filtro, Hz 
 
# ahora se procede a obtener los coeficientes de dicho filtro. 
b, a = butter_lowpass(cutoff, fs, order,True) 
Mediante la funcion[] definida con anterioridad procedemos a calcular y graficar la respuesta en frecuencia
tanto de la magnitud en dB y la fase de dicho filtro
fs = 2Hz
fstop = 0.7Hz
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [572]:
(dB, mag, phase, w) = freqs_m(b,a,0.5*np.pi) 
plot_freq_domain(w,dB,phase,fs=1) 
Como podemos observar el filtro cumple con los requerimientos dados.
Para tener una idea de la comparacion entre un filtro analogico y uno digital se usara la misma funcion
definida la inicio del ejericicio para diseñar el mismo filtro paso bajo pero digital, se graficara tanto la
magnitud como la fase.
In [573]:
b, a = butter_lowpass(cutoff, fs, order,False) 
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
W, H = signal.freqz(b, a, worN=8000) 
In [574]:
plt.subplot(2, 1, 1) 
plt.plot(0.5*fs*W/np.pi, np.abs(H), 'b') 
plt.plot(cutoff, 0.5*np.sqrt(2), 'ko') 
plt.axvline(cutoff, color='k') 
plt.xlim(0, 0.5*fs) 
plt.title("Respuesta en Frecuencia Filtro Paso Bajo") 
plt.xlabel('Frecuencia [Hz]') 
plt.grid() 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [575]:
plt.subplot(2, 1, 2) 
plt.plot(0.5*fs*W/np.pi,np.angle(H)*180/np.pi, "b") 
plt.xlim(0, 0.5*fs) 
plt.xlabel("Frecuencia [Hz]",fontsize=16) 
plt.ylabel(r"$ Phase [deg]$",fontsize=16) 
plt.grid() 
Ahora se proceder a graficar en el plano Z los polos y ceros de la funcion H(z) del filtro previamente
diseñado
In [576]:
# Dibujamos el diagrama de polos y ceros. 
zplane(b,a) 
Y por ultimo veremos graficamente la respuesta al impulso que tenemos a la salida de dicho filtro.
Out[576]:
(5, 5)
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [577]:
x = np.zeros(67) 
x[30]=1 
y = signal.filtfilt(b,a,x) 
stem(y) 
Subtarea 2.2: Filtro de Butterworth paso alto
Introduccion FILTROS PASO ALTO
Un filtro paso alto (HPF) es un tipo de filtro electrónico en cuya respuesta en frecuencia se atenúan las
componentes de baja frecuencia pero no las de alta frecuencia, éstas incluso pueden amplificarse en los
filtros activos.En esta seccion se diseñara un filtro BUTTERWORTH paso alto de orden 5 mediante el uso de la libreria
scipy signal de python con la funcion butter.
Las caracteristicas del filtro a diseñar son las siguientes:
Frecuencia de Muestreo:
Banda de Paso:
In [578]:
def butter_highpass(cutoff, fs, order,analog): 
 if analog==True: 
 normal_cutoff = cutoff*np.pi 
 b, a = signal.butter(order, normal_cutoff, btype='high', analog=True) 
 else: 
 nyq = 0.5 * fs 
 normal_cutoff = cutoff / nyq 
 b, a = signal.butter(order, normal_cutoff, btype='high', analog=False) 
 return b, a 
fs = 2Hz
fpass = 0.7Hz
Out[577]:
<Container object of 3 artists>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
La funcion presentada en la celda anterior nos retornara un filtro BUTTERWORTH paso alto, para este caso
nos retornara los coeficientes b,a de dicho filtro. Cabe recalcar que la libreria scipy nos permite crear filtros
tanto digital como analogicos, para efecto de estudio mostraremos ambos filtros y un breve ejemplo de su
aplicacion graficamente.
In [579]:
# Requerimientos del Filtro 
order = 5 
fs = 2. # frecuencia de muestreo, Hz 
cutoff = 0.7 # frecuencia de corte deseada de nuestro filtro, Hz 
 
# ahora se procede a obtener los coeficientes de dicho filtro. 
b, a = butter_highpass(cutoff, fs, order,True) 
Mediante la funcion definida con anterioridad procedemos a calcular y graficar la respuesta en frecuencia
tanto de la magnitud en dB y la fase de dicho filtro.
In [580]:
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
(dB, mag, phase, w) = freqs_m(b,a,0.5*np.pi) 
plot_freq_domain(w,dB,phase,fs=1) 
Como podemos observar el filtro cumple con los requerimientos dados.
Para tener una idea de la comparacion entre un filtro analogico y uno digital se usara la misma funcion
definida la inicio del ejericicio para diseñar el mismo filtro paso bajo pero digital, se graficara tanto la
magnitud como la fase.
In [581]:
b, a = butter_highpass(cutoff, fs, order,False) 
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
W, H = signal.freqz(b, a, worN=8000) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [582]:
plt.subplot(2, 1, 1) 
plt.plot(0.5*fs*W/np.pi, np.abs(H), 'b') 
plt.plot(cutoff, 0.5*np.sqrt(2), 'ko') 
plt.axvline(cutoff, color='k') 
plt.xlim(0, 0.5*fs) 
plt.title("Respuesta en Frecuencia Filtro Paso Bajo") 
plt.xlabel('Frecuencia [Hz]') 
plt.grid() 
In [583]:
plt.subplot(2, 1, 2) 
plt.plot(0.5*fs*W/np.pi,np.angle(H)*180/np.pi, "b") 
plt.xlim(0, 0.5*fs) 
plt.xlabel("Frecuencia [Hz]",fontsize=16) 
plt.ylabel(r"$ Phase [deg]$",fontsize=16) 
plt.grid() 
Ahora se proceder a graficar en el plano Z los polos y ceros de la funcion H(z) del filtro previamente
diseñado
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [584]:
# Dibujamos el diagrama de polos y ceros. 
zplane(b,a) 
Y por ultimo veremos graficamente la respuesta al impulso que tenemos a la salida de dicho filtro.
In [585]:
y = signal.filtfilt(b,a,x) 
stem(y) 
Comparemos y analicemos!
Out[584]:
(5, 5)
Out[585]:
<Container object of 3 artists>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
Los dos filtros que acabamos de diseñar son un filtro paso bajo y paso alto BUTTERWORTH, es decir un
filtro nos dejara pasar frecuencias altas y el otro frecuencias bajas, su nombre lo indica claramente.
Observando la grafica de magnitud la diferencia claramente se ve que una grafica es la inversa de la otra,
relacion que tiene sentido verdad?. Asi mismo en el grafico de polos y ceros vemos que los polos se
encuentran la misma ubicacion a diferencia de los ceros(lugares donde la funcion de transferencia es 0),
diferencia que radica principalmente por el tipo de frecuencia que trabajan.
Con la respuesta al impulso se puede observar que el paso bajo las frecuencias estan mas ajustadas que la
de paso alto, diferencia que nos ayudaria a diferenciar el tipo de filtro BUTTERWORTH empleado para caso
o para cada sistema.
Subtarea 2.3: Filtro de CHEBYSHEV paso alto
En esta seccion se diseñara un filtro CHEBYSHEV paso alto de orden 5 mediante el uso de la libreria scipy
signal de python con la funcion cheby1.
Las caracteristicas del filtro a diseñar son las siguientes:
Frecuencia de Muestreo:
Banda de Paso:
Rizado:
In [586]:
def cheby_highpass(cutoff, fs, order, rp,analog): 
 if analog==True: 
 normal_cutoff = cutoff*np.pi 
 b, a = signal.cheby1(order, rp, normal_cutoff, btype='high', analog=True) 
 else: 
 nyq = 0.5 * fs 
 normal_cutoff = cutoff / nyq 
 b, a = signal.cheby1(order, rp, normal_cutoff, btype='high', analog=False) 
 return b, a 
La funcion presentada en la celda anterior nos retornara un filtro CHEBYSHEV[4] paso alto, para este caso
nos retornara los coeficientes b,a de dicho filtro. Cabe recalcar que la libreria scipy nos permite crear filtros
tanto digital como analogicos, para efecto de estudio mostraremos ambos filtros y un breve ejemplo de su
aplicacion graficamente.
fs = 2Hz
fpass = 0.7Hz
= 1dBR
p
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [587]:
# Requerimientos del Filtro 
order = 5 
fs = 2. # frecuencia de muestreo, Hz 
cutoff = 0.7 # frecuencia de corte deseada de nuestro filtro, Hz 
rp = 1 # rizado(ripple) de la banda de paso. 
 
# ahora se procede a obtener los coeficientes de dicho filtro. 
b, a = cheby_highpass(cutoff, fs, order, rp,True) 
Mediante la funcion definida con anterioridad procedemos a calcular y graficar la respuesta en frecuencia
tanto de la magnitud en dB y la fase de dicho filtro
In [588]:
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
(dB, mag, phase, w) = freqs_m(b,a,0.5*np.pi) 
plot_freq_domain(w,dB,phase,fs=1) 
Como podemos observar el filtro cumple con los requerimientos dados.
Para tener una idea de la comparacion entre un filtro analogico y uno digital se usara la misma funcion
definida la inicio del ejericicio para diseñar el mismo filtro paso bajo pero digital, se graficara tanto la
magnitud como la fase.
In [589]:
b, a = cheby_highpass(cutoff, fs, order, rp, False) 
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
W, H = signal.freqz(b, a, worN=8000) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [590]:
plt.subplot(2, 1, 1) 
plt.plot(0.5*fs*W/np.pi, np.abs(H), 'b') 
plt.plot(cutoff, 0.5*np.sqrt(2), 'ko') 
plt.axvline(cutoff, color='k') 
plt.xlim(0, 0.5*fs) 
plt.title("Respuesta en Frecuencia Filtro Paso Bajo") 
plt.xlabel('Frecuencia [Hz]') 
plt.grid() 
In [591]:
plt.subplot(2, 1, 2) 
plt.plot(0.5*fs*W/np.pi,np.angle(H)*180/np.pi, "b") 
plt.xlim(0, 0.5*fs) 
plt.xlabel("Frecuencia [Hz]",fontsize=16) 
plt.ylabel(r"$ Phase [deg]$",fontsize=16) 
plt.grid() 
Ahora se proceder a graficar en el plano Z los polos y ceros de la funcion H(z) del filtro previamente
diseñado
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [592]:
# Dibujamos el diagrama de polos y ceros. 
zplane(b,a) 
Y por ultimo veremos graficamente la respuesta al impulso que tenemos a la salida de dicho filtro.
In [593]:
y = signal.filtfilt(b,a,x) 
stem(y) 
Analicemos!
Out[592]:
(5, 5)
Out[593]:
<Container object of 3 artists>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10Quizas ya se dio cuenta que una de las caracteristicas de este filtro CHEBYSHEV es q presenta una
fluctuacion en la banda de paso o tambien llamado riple.
Con los filtros de Chebyshev se consigue una caída de la respuesta en frecuencia más pronunciada en
frecuencias bajas debido a que permiten rizado en alguna de sus bandas (paso o rechazo). A diferencia del
Filtro de Butterworth donde los polos se distribuyen sobre una circunferencia, los polos del filtro Chebyshev
lo hacen sobre una elipse; sus ceros se encuentran en el eje imaginario.
Es decir podemos mediante cualquier grafica poder determinar las otras o simplemente saber el tipo de filtro
que estamos comparando o diseñando
Ahota diseñaremos un filtro eliptico
En esta seccion se diseñara un filtro ELLIP paso alto de orden 5 mediante el uso de la libreria scipy signal
de python con la funcion butter.
Las caracteristicas del filtro a diseñar son las siguientes:
Frecuencia de Muestreo:
Banda de Paso:
Banda Eliminada :
Rizado:
In [594]:
def ellip_highpass(cuterase, cutoff, fs, order, rs,analog): 
 if analog==True: 
 normal_cuterase = cuterase*np.pi 
 normal_cutoff = cutoff*np.pi 
 citrical_freq=[normal_cuterase,normal_cutoff] 
 b, a = signal.ellip(order, 1, rs, normal_cutoff, btype='high', analog=True) 
 else: 
 nyq= 0.5*fs 
 normal_cuterase = cuterase / nyq 
 normal_cutoff = cutoff / nyq 
 citrical_freq=[normal_cuterase,normal_cutoff] 
 b, a = signal.ellip(order, 1, rs, normal_cutoff, btype='high', analog=False) 
 return b,a 
La funcion presentada en la celda anterior nos retornara un filtro ELLIP[5] paso bajo, para este caso nos
retornara los coeficientes b,a de dicho filtro. Cabe recalcar que la libreria scipy nos permite crear filtros tanto
digital como analogicos, para efecto de estudio mostraremos ambos filtros y un breve ejemplo de su
apliacion graficamente.
fs = 2Hz
fpass = 0.7Hz
0.25Hz
= −40dBR
s
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [595]:
# Requerimientos del Filtro 
order = 5 
fs = 2. # frecuencia de muestreo, Hz 
cutoff = 0.3 # frecuencia de corte deseada de nuestro filtro, Hz 
cuterase = 0.25 # frecuencia de banda eliminada de nuestro filtro, Hz 
rp = 1 # rizado(ripple) de la banda de paso. 
rs = -40 # attenuacion de la badna eliminada 
 
 
# ahora se procede a obtener los coeficientes de dicho filtro. 
 
b, a = ellip_highpass(cuterase, cutoff, fs, order, np.abs(rs),True) 
Mediante la funcion definida con anterioridad procedemos a calcular y graficar la respuesta en frecuencia
tanto de la magnitud en dB y la fase de dicho filtro
In [596]:
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
(dB, mag, phase, w) = freqs_m(b,a,0.5*np.pi) 
plot_freq_domain(w,dB,phase,fs=1) 
Como podemos observar el filtro cumple con los requerimientos dados.
Para tener una idea de la comparacion entre un filtro analogico y uno digital se usara la misma funcion
definida la inicio del ejericicio para diseñar el mismo filtro paso bajo pero digital, se graficara tanto la
magnitud como la fase.
In [597]:
b, a = ellip_highpass(cuterase, cutoff, fs, order, np.abs(rs),False) 
# Se procedera graficar su magnitud y fase de la repuesta en frecuencia 
W, H = signal.freqz(b, a, worN=8000) 
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
In [598]:
plt.subplot(2, 1, 1) 
plt.plot(0.5*fs*W/np.pi, np.abs(H), 'b') 
plt.plot(cutoff, 0.5*np.sqrt(2), 'ko') 
plt.axvline(cutoff, color='k') 
plt.xlim(0, 0.5*fs) 
plt.title("Respuesta en Frecuencia Filtro Paso Bajo") 
plt.xlabel('Frecuencia [Hz]') 
plt.grid() 
In [599]:
plt.subplot(2, 1, 2) 
plt.plot(0.5*fs*W/np.pi,np.angle(H)*180/np.pi, "b") 
plt.xlim(0, 0.5*fs) 
plt.xlabel("Frecuencia [Hz]",fontsize=16) 
plt.ylabel(r"$ Phase [deg]$",fontsize=16) 
plt.grid() 
Ahora se proceder a graficar en el plano Z los polos y ceros de la funcion H(z) del filtro previamente
diseñado
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
In [600]:
# Dibujamos el diagrama de polos y ceros. 
zplane(b,a) 
Y por ultimo veremos graficamente la respuesta al impulso que tenemos a la salida de dicho filtro.
In [601]:
y = signal.filtfilt(b,a,x) 
stem(y) 
Analicemos!
Out[600]:
(5, 5)
Out[601]:
<Container object of 3 artists>
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718
https://www.studocu.com/ec?utm_campaign=shared-document&utm_source=studocu-document&utm_medium=social_sharing&utm_content=mini-proyecto-2-nota-10
Si bien se puede decir que las graficas de magnitud y fase son similares en filtros CHEBYSHEV como en el
filtro ELLIP una de la gran diferencia es que el filtro eliptico estrecha la zona de transicion de la banda
eliminada y la banda de paso. Dicha zona podemos verla claramente en ambas graficas. Además, acotando
el rizado en esas bandas. La diferencia con el filtro de Chevyshev es que este sólo lo hace en una de las
bandas.
Estos filtros suelen ser más eficientes debido a que al minimizar la zona de transición, ante unas mismas
restricciones consiguen un menor orden. Por el contrario son los que presentan una fase menos lineal.
Subtarea 2.4: Transformacion Paso Banda
La transformación[6] paso de baja a paso de banda se usa para encontrar una aproximación a unas
especificaciones paso de banda calculando primero una aproximación a unas especificaciones paso de baja
"equivalentes". Por tanto, la transformación LP→BP se aplica a la función de transferencia del filtro paso de
baja prototipo para obtener la función de transferencia del filtro paso de banda. El punto de partida son unas
ciertas especificaciones para el filtro paso de banda. El primer paso es encontrar las especificaciones para el
filtro paso de baja prototipo. Este paso dependerá de las propiedades de la transformación LP→BP por lo
que nos ocupamos de ellas en primer lugar.
Subtarea 2.5: Diseño Filtro Paso Banda
Introduccion Filtros Paso Banda
Un filtro paso banda es un tipo de filtro electrónico que deja pasar un determinado rango de frecuencias de
una señal y atenúa el paso del resto.
Otra forma de construir un filtro paso banda puede ser usar un filtro paso bajo en serie con un filtro paso alto
entre los que hay un rango de frecuencias que ambos dejan pasar. Para ello, es importante tener en cuenta
que la frecuencia de corte del paso bajo sea mayor que la del paso alto, a fin de que la respuesta global sea
paso banda (esto es, que haya solapamiento entre ambas respuestas en frecuencia).
Ahora se procedera al diseño e implementacion de un filtro paso banda, para ellos se empleara la funcion
cheby1 para obtener los coeficientes de dicho filtro.
Téléchargé par Maria del Sol (mariadelsol.sa@gmail.com)
lOMoARcPSD|5461718

Continuar navegando