Está en la página 1de 9

PRÁCTICAS DE LABORATORIO PARA PROCESAMIENTO DIGITAL DE SEÑAL

Por

EDUARDO AVENDAÑO FERNÁNDEZ

UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA


ESCUELA DE INGENIERÍA ELECTRÓNICA
FACULTAD SECCIONAL SOGAMOSO
2019
1. Introducción

Los filtros de respuesta al impulso finita (FIR) son usados comúnmente en aplicaciones DSP en
tiempo real debido al número de propiedades deseables tal como su estabilidad y respuesta
lineal en fase. Un filtro particularmente simple es el filtro FIR, también conocido como filtro de
promedio móvil. Sin embargo, varios tipos de filtros FIR sofisticados pueden ser diseñados e
implementados. Esta sesión de laboratorio permite el estudio de las características del filtro
FIR, las técnicas de diseño, y aspectos prácticos relacionados con su implementación.

2. Filtro de promedio móvil

El filtro de promedio móvil es ampliamente usando en DSP y es uno de todos los filtros más
simple de entender. La salida del filtro de promedio móvil es la media aritmética, o promedio,
de las muestras pasadas. Por lo tanto, la señal de salida es una versión “suavizada” de la señal
de entrada. El filtro promedio de N puntos puede representarse por la ecuación en diferencias

N 1
1
y[n] 
N
 x[n  k ]
k 0

El programa average intr.c mostrado en la figura 1 implementa un filtro de promedio móvil


(N=5). Un experimento simple usando la señal de prueba contenida en el archivo mefsin.wav
demuestra que el filtro de promedio móvil atenua algunas componentes de frecuencia de una
señal más que otras componentes. Escuche con cuidado la señal de prueba utilizando algún
reproductor de audio, la muestra contiene algo de voz degradada por la suma de un tono
sinusoidal.

Observe esta señal de prueba conectando la salida del auricular de su tarjeta de sonido de PC a
un osciloscopio. Observe la forma de onda en el dominio del tiempo y ajuste el nivel de
volumen en su PC de manera que la señal no sea mayor a 500 mV pico a pico. Use el analizador
de espectro para observar la señal en el dominio de la frecuencia. Ahora conecte la salida de la
tarjeta de sonido de la PC al socket Line in en la board FM4. Ajuste el volumen del PC de la
configuración previamente determinada. Ejecute el programa average_intr.c en la board FM4 y
use los auriculares para escuchar la salida de la board. El programa aplica un filtro a uno de los
canales de audio. Debería encontrar que el tono sinusoidal ha sido atenuado significativamente
y que el sonido del habla tiene menos brillo que el canal de audio filtrado. Las dos
observaciones son consistentes con el filtro de promedio móvil que tiene una respuesta paso
bajo. Los siguientes ejercicios introducen un número de métodos diferentes y cuantitativos de
evaluar la respuesta en frecuencia del filtro.

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 2


// average_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
const int N = 5;
const float32_t b[N] = {0.2 , 0.2 , 0.2 , 0.2 , 0.2};
static float32_t x[N];
int16_t audio_chR =0; // 16 bits audio data channel right
int16_t audio_chL =0; // 16 bits audio data channel left
float32_t yn = 0.0;
int16_t k = 0;

audio_IN = i2s_rx ();


audio_chL = audio_IN & 0 x0000FFFF ; // separate 16 bits channel left
audio_chR = ( audio_IN > >16) & 0 x0000FFFF ; // separate 16 bits channel right

x [0] = ( float32_t ) audio_chL ; // new sample is element 0 in array


for (k = 0; k<N; k ++)
{
yn += b[k]*x[k]; // calculate filter output
}
for (k = N -1; k >0; k --) // shift sample stack down for next call to ISR
{
x[k] = x[k -1];
}
audio_chL = ( int16_t ) yn;
audio_OUT = ( audio_chR <<16 & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF ); // put 2 ch together
i2s_tx ( audio_OUT );
}
int main ( void )
{
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Figure 1: Código fuente del programa average_intr.c

3. Visualización de respuesta en frecuencia usando una entrada sinusoidal

La respuesta en frecuencia de un filtro dice cómo el filtro cambia la amplitud y fase de


diferentes frecuencias que pasan a través del filtro. Por lo tanto, una forma de evaluar la
respuesta en frecuencia de un filtro es aplicar unas señales de entrada sinusoidales y observar
los cambios de amplitud y fase resultantes en la señal de salida relativos a la señal de entrada.
Repitiendo esta observación a un número de diferentes frecuencias revela las características
del filtro como una función de la frecuencia.

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 3


Conecte la salida de un generador de onda, configurado para entregar una señal sinusoidal, al
canal izquierdo del socket Line In en la board FM4 y al canal 1 del osciloscopio. Conecte el canal
de la izquierda del socket Headphone Out al canal 2 del osciloscopio. Ejecute el programa
average_intr.c y varíe la frecuencia sinusoidal entre 100 Hz y 5000 Hz. Mantenga constante la
amplitud de la señal de entrada sinusoidal a aproximadamente 500 mV pico a pico.
Probablemente encontrará que es mejor disparar el osciloscopio desde el canal 1. Observe que
como la frecuencia de la señal de entrada es variada, la amplitud y fase de la señal de salida
cambia. La ganancia del filtro es mayor a bajas frecuencias que a altas frecuencias y hay algunas
frecuencias a las cuales la ganancia es casi cero. (Ayuda: Ajuste la frecuencia de entrada a 1.6
kHz y observe la salida). En general, el filtro de promedio móvil tiene una característica paso
bajo.

4. Respuesta en frecuencia teórica usando Matlab

Matlab contiene varias herramientas convenientes para calcular y visualizar las características
de los filtros digitales. La función freqz(), permite calcular y graficar la respuesta en frecuencia
de un filtro de promedio móvil de 5 puntos.

Una forma particular de representar filtros digitales es en términos de la función de


transferencia generalizada

b1  b2 z 2  ...  bn 1 z  n
H ( z) 
a1  a2 z 2  ...  an 1 z  n

Por tanto, la función freqz calcula al respuesta en frecuencia a partir de los coeficientes del
numerador y denominador, b y a, respectivamente.

Un filtro móvil de 5 puntos tiene la ecuación en diferencia

1
y[n]   x[n]  x[n  1]  x[n  2]  x[n  3]  x[n  4]
5

Y por lo tanto, la función de transferencia generalizada está dada por

1
H ( z) 
5
1  z 1  z 2  z 3  z 4 

El script en Matlab mostrado en la figura 2 muestra la respuesta en magnitud y fase para el


filtro promedio móvil de 5 puntos. De los resultados obtenidos se observa la respuesta en
frecuencia y se confirma las características paso bajo y que además a algunas frecuencias tiene
una ganancia cero. La gráfica de respuesta de fase muestra una respuesta lineal (observe que la
UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 4
fase está envuelta - wrapped). Una respuesta de fase lineal es un requerimiento importante en
varias aplicaciones prácticas y asegura que todas las componentes en frecuencia de una señal
de entrada son retrasadas en tiempo por alguna cantidad.

clear all
close all

fs = 8000; % la tasa de muestreo es 8000 muestras/s


%% ajusta los vectores de coeficientes a y b

a = 1;
b = [1/5 1/5 1/5 1/5 1/5];
%% Grafica curvas de respuesta en frecuencia usando 10000 puntos de muestra
freqz(b,a,1e4,fs);
Figura 2. Código para determinar la respuesta en frecuencia

-50

-100

-150

-200

-250

-300

-350
0 500 1000 1500 2000 2500 3000 3500 4000
Frecuencia (Hz)

100

50

-50

-100

-150

0 500 1000 1500 2000 2500 3000 3500 4000


Frecuencia (Hz)

Figura 3: Respuesta en frecuencia para el filtro de promedio móvil de 5 puntos calculado


usando freqz().

Se va a revisar el filtro con dos preguntas en mente:

1. Qué sucedería si el promedio móvil fuera calculado sobre un número diferente de muestras
previas?
2. Que podría suceder si los valores de coeficientes del filtro h[n] fueran cambiados?

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 5


Pregunta 1: Considre un filtro de promedio móvil de 5 y 11 puntos. Escriba un script en Matlab
que genere gráficas de la respueta en frecuencia (ambos magnitud y fase) para los dos filtros.
Compare las respuestas en magnitud de los dos filtros y muéstrelos (en dB) en la misma figura.
Escale el eje de magnitud para mostrar un rango razonable de valores (por ejemplo, desde -80
dB a 0 dB). Puede encontrar útil usar la función ylim. Compare las respuestas en fase
mostrándolas en la misma figura. Comente las similaridades y diferencias entre los dos filtros.

Pregunta 2: Considere un filtro de promedio móvil modificado con 5 puntos y respuesta al


impulso dada por

h[n]  0.0833, 0.2500, 0.3333, 0.2500, 0.0833

Escriba un script en Matlab que compare la respuesta en frecuencia (magnitud y fase) de este
filtro con el filtro de promedio móvil de 5 puntos usado en la pregunta previa. Incluya su código
en Matlab y figuras. Comente similaridades y diferencias.

Debería haber observado esos cambios a los coeficientes (no inesperados) que han modificado
la respuesta en frecuencia del filtro. En la siguiene sección, se investigará los métodos para
cualcular los coeficientes que resultan de filtros FIR que encuentran un conjunto de
especificiaciones de diseño.

5. Diseño de filtros FIR pasobajo usando el método de Ventana

Revise en las presentaciones el diseño de filtros FIR usando el método de ventaneo, y aplíquelo
para diseñar filtros paso bajo (LPF).

Pregunta 3: Use el método de ventaneo para diseñar los siguientes filtros:

Longitud 11 (orden 10) LPF con frecuencia de corte 2 kHz, ventana rectangular.
Longitud 11 (orden 10) LPF con frecuencia de corte 2 kHz, ventana Hamming.
Longitud 31 (orden 30) LPF con frecuencia de corte 2 kHz, ventana rectangular.
Longitud 31 (orden 30) LPF con frecuencia de corte 2 kHz, ventana Hamming.

Use una frecuencia de muestreo de 48 kHz para sus diseños. Escriba un script en Matlab que
calcule los coeficientes para cada filtro y genere las gráficas de respuesta en frecuencia
(magnitud y fase) para comparar los filtros.

Pregunta 4: Inspeccione cuidadosamente la respuesta en magnitud de los filtros. Discuta el


impacto del orden del filtro y las funciones ventana.

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 6


Pregunta 5: Inspeccione cuidadosamente la respuesta en fase de los filtros. Discuta el impacto
del orden del filtro en la pendiente de la respuesta en fase.

6. Implementación en tiempo real

El programa fir_intr.c mostrado en la figura 4 puede ser usado para implementar un filtro FIR.
Require los coeficientes del filtro y la longitud del filtro, los cuales se especifican en el
encabezado del header del archivo c. Como se observa en el código, la línea 4 utiliza el
encabezado ma_5pt.h para especificar un filtro de promedio móvil de 5 puntos. Este archivo de
header puede ser reemplazado con cualquier conjunto de coeficientes FIR, y la función Matlab
escribe fir_coeffs que puede ser usada para generar un archivo de coeficientes compatibles.

Como ejemplo, ma_5pt.h fue creado usando los comandos Matlab:

h = [0.2 0.2 0.2 0.2 0.2];


write_fir_coeffs(h,’ma_5pt.h’);

Ubique los archivos de los coeficientes en el directorio de drivers.

Pregunta 6: Implemente en la board FM4 uno de los filtros de longitud 11 que diseñó en la
pregunta 3. Mida su respuesta en frecuencia usando un analizador de red. Cree gráficas que
comparen la respuesta en frecuencia teórica (generada usando Matlab) y la respuesta en
frecuencia medida usando la misma gráfica. La opción exportar (export) en Formas de onda
(waveforms) permitirá acceder fácilmente a los datos en bruto de la medición en bruto del
analizador de red. Ayuda: copie y pegue los datos en bruto usando la opción “copy to
clipboard”.

Pregunta 7: Inspeccione cuidadosamente las comparaciones de las gráficas de respuesta en


frecuencia medidas y teóricas. Lo que obsera se parece?. Asegúrese de comentar las respuestas
en magnitud y fase.

/ fir_intr .c

# include " audio .h"


# include " ma_5pt .h" // from " write_fir_coeffs .m"

void I2S_HANDLER ( void ) {


int16_t audio_chR =0;
int16_t audio_chL =0;
static float32_t x[N];
float32_t yn = 0.0;
int k;

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 7


gpio_set (P10 , HIGH ); // write GPIO high to mark start of ISR

audio_IN = i2s_rx ();


audio_chL = ( audio_IN & 0 x0000FFFF );
audio_chR = (( audio_IN > >16)& 0 x0000FFFF );

x [0] = ( float32_t ) audio_chL ; // new sample is element 0 in array

for (k = 0; k<N; k ++) // calculate filter output


{
yn += h[k]*x[k];
}

for (k = N -1; k >0; k --) // shift sample stack down for next call to ISR
{
x[k] = x[k -1];
}

audio_chL = ( int16_t ) yn; // filter output to left channel


audio_OUT = (( audio_chR <<16 & 0 xFFFF0000 )) + ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
gpio_set (P10 , LOW ); // write GPIO low to mark end of ISR
}

int main ( void )


{
gpio_set_mode (P10 , Output ); // configure GPIO for output
audio_init ( hz48000 , line_in , intr , I2S_HANDLER );
while (1){}
}

Figura 4: Programa implementado para filtrado FIR, fir_intr.c

7. Medición del tiempo de ejecución para rutina de servicio de interrupción (ISR)

Observe que fir_intr.c alterna a un pin GPIO durante el ISR. Esto fue incluido en el programa
para dar cuenta del tiempo que toma calcular el valor de cada muestra. Para operación en
tiempo real, este tiempo no debe exceder 1/fs.

Pregunta 8: Mientras el tiempo de ejecución del filtro de longitud 11, conecte un oscilocopio al
pin GPIO y observe la forma de onda. Cuanto le toma la ejecución del ISR?

Nota: para boards FM4, especifique y use el pin P10. Para boards azules, especifique el pin P15.
Las ubicaciones de los pines son marcada en el lado inferior de las tarjetas FM4.

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 8


Pregunta 9: Implemente uno de los filtros de longitud 31 y mida el tiempo de ejecución ISR.

Referencias

[1] Mathworks, http://www.mathworks.com/.


[2] Gnu Octave, https://www.gnu.org/software/octave/.
[3] ARM University Worldwide Education Program. ARM-based Digital Signal Processing Lab-in-
a-Box, 2014.

UPTC Ingeniería Electrónica  Eduardo Avendaño Fernández 9

También podría gustarte