Descarga la aplicación para disfrutar aún más
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
Compartir