Laboratorio de Procesado Digital de Señal (Curso 2005/2006) PRÁCTICA 5 Filtros FIR A. Entorno MATLAB 1. Pretendemos aproximar un filtro paso bajo ideal de frecuencia de corte ωc=π/3 mediante el método de ventanas. Sabemos que la respuesta impulsiva de fase lineal de este filtro viene dada por: ⎛ M ⎞⎞ ⎛ sin ⎜⎜ ω c ⋅ ⎜ n − ⎟ ⎟⎟ 2 ⎠⎠ ⎝ ⎝ h[n ] = M⎞ ⎛ π ⋅⎜n − ⎟ 2⎠ ⎝ La siguiente función de MATLAB (.m) devuelve en un vector (h) la respuesta impulsiva buscada, pasándole como argumento el número de puntos (M+1) y la frecuencia de corte (ωc): function h = calcula_h(wc,NP) h=zeros(NP,1); M=NP-1; for k=0:M if k==M/2 % Evita la división por cero en k=M/2, % lo que sucede si M es par h(k+1)=wc/pi; else h(k+1)=(sin(wc*(k-M/2))/(pi*(k-M/2))); end end Obtenga en tres vectores diferentes h10, h25, h100 de 10, 25 y 100 puntos respectivamente tres aproximaciones diferentes al mismo filtro ideal descrito más arriba. 2. Visualice y compare dichas respuestas impulsivas haciendo uso de la función stem. 3. Haciendo uso de la función fvtool (fvtool(h10), etc.), compare la respuesta en frecuencia obtenida en cada caso. Compruebe que en los tres casos, en la frecuencia de corte la amplitud ha caído 3 dB (1/2 en valores absolutos). ¿Cómo influye el número de puntos de la respuesta impulsiva en la aproximación a la respuesta deseada? 4. Por estar usando ventanas de duración finita, estamos usando ventana rectangular. Veamos ahora el efecto de multiplicar el vector h25 anterior por ventanas de diferente tipo (Hamming, Hanning, Kaiser, etc). Para ello, calcula el vector de 25 puntos con la forma de cada ventana (teclee help window para ver cómo), y recuerde multiplicarla por h25 elemento a elemento haciendo uso de “.*”. Ejemplo: >> h25_hamming = h25.*window(@hamming,25); Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P5.1 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) 5. Para visualizar este proceso, represéntalo gráficamente (maximiza la ventana para verlo mejor). Ejemplo: >> subplot(311),stem(h25); >> subplot(312),stem(window(@hamming,25)); >> subplot(313),stem(h25_hamming) 6. Compare ahora, para el mismo número de puntos de la ventana (por ejemplo, 25), la respuesta en frecuencia obtenida con los diferentes tipos de ventana haciendo uso nuevamente de la herramienta fvtool. 7. Vamos a filtrar dos señales diferentes de audio. Para ello cargue con wavread la señal v1.wav (fs = 8kHz) en el vector x1 y la señal guitar_mono.wav (fs = 16 kHz) en x2. 8. Para comprobar el efecto de los distintos filtros, puede hacer uso de la función filter pasándole como vector “b” las diferentes respuestas que acabas de calcular, a=1 (por ser FIR), y como señal x las anteriores x1 y x2. Haciendo uso del mismo filtro (el que quieras), filtre y escuche las dos. ¿Es igual la frecuencia de corte del filtro a pesar de que el filtro es el mismo? ¿Por qué? Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P5.2 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) B. Entorno Tarjeta EZ-KIT Lite En esta segunda parte de la práctica vamos a implementar un filtro FIR en la tarjeta EZ-KIT Lite ADSP-2181, para ver su funcionamiento en tiempo real. Utilizamos como código base el mismo que en las prácticas anteriores, es decir, el algoritmo THRU.DSP. Se deben realizar todas las modificaciones necesarias para convertirlo en un filtro FIR. Un filtrado FIR, implementado según una estructura transversal, utiliza dos buffers (arrays) de registros de memoria. En uno de ellos se almacenan los M+1 datos de entrada (zona de memoria de datos -DM-) y en el otro los M+1 coeficientes del filtro (zona de memoria de programa -PM). Con estos dos arrays se implementa una convolución lineal (filtrado FIR), según la expresión: M y ( n) = ∑ h( k ) * x ( n − k ) k =0 Como ya se explicó en una práctica anterior, para acceder a los datos de un buffer (buffer circular) se necesitan tres registros (de los 8 juegos posibles): un registro puntero (I), un registro modificador (M) que incrementa el puntero y un registro que define la longitud del buffer (L). En nuestro caso, vamos a utilizar los registros i2, m2 y l2 para acceder a los datos del buffer de entrada y los registros i4, m4 y l4 para acceder a los coeficientes del filtro. Por tanto, antes de implementar propiamente el algoritmo es necesario inicializar los parámetros de estos dos buffers (después de la macro begin.dsp y antes de las instrucciones wait: idle; jump wait;). El buffer de coeficientes del filtro FIR se carga a través de un fichero de texto donde están los valores de los mismos (por ejemplo: \Mi PC\Documentos compartidos\Laboratorio PDS-TDS\ Ficheros de la tarjeta EZ-Kit Lite\FIR.HEX). En este caso concreto, el fichero contiene 206 coeficientes de un filtro paso bajo (formato hexadecimal). El resto del código, suficientemente explicado, se muestra a continuación. Impleméntelo y pruebe su funcionamiento con una señal de ruido blanco generada con el editor de audio Cool Edit Pro y con una señal musical de audio (una de las usadas en prácticas anteriores). Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P5.3 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P5.4 -