2015 2 Taller4 Filtros Digitales (1)

Embed Size (px)

DESCRIPTION

taller

Citation preview

  • TALLER #4. Implementacin de Sistemas LTI en Tiempo Discreto

    El tipo de sistemas ms comunes y ms utilizados en la prctica son los sistemas lineales e invariantes en el tiempo,

    tambin llamados sistemas LTI. Esto se debe a que dichos sistemas poseen ciertas propiedades en el dominio del tiempo

    y el dominio de la frecuencia que los hacen nicos y especiales para el diseo de aplicaciones y/o anlisis. La estructura

    de la ecuacin diferencial o diferencias de un sistema LTI es muy simple, pues dichos sistemas incluyen exclusivamente la

    combinacin lineal de las entradas y salidas usando coecientes constantes independientes del tiempo.

    En clases pasadas vimos como implementar en diagramas de bloques ecuaciones diferenciales (para sistemas en tiempo

    continuo) y ecuaciones en diferencia (para sistemas en tiempo discreto), pero no se ha mostrado cmo determinar la

    ecuacin en diferencial y/o en diferencia para una aplicacin en particular. Este aspecto, para sistemas en tiempo discreto,

    ser tratado en este taller.

    Los sistemas LTI se denominaban "ltros" en los cursos de circuitos. Por consiguiente, todos los ltros son sistemas

    LTI. Los sistemas LTI en tiempo continuo se implementan usando las tcnicas que ya conoce para diseo e implementacin

    de ltros que ha estudiado en los cursos de circuitos. Por lo tanto, a partir de un anlisis circuital puede obtener la ecuacin

    diferencial que rige un sistema LTI.

    En cuanto a los sistemas LTI en tiempo discreto o ltros digitales, hemos visto como elaborar el diagrama de bloques

    a partir de la ecuacin en diferencias. El diagrama de bloques resulta til como ayuda para una implementacn pues

    bastaba con reemplazar los elementos de retardo z1 por registros de datos, las ganancias por multiplicadores digitales,y nodos de suma por sumadores digitales, conducindonos a un sistema digital completo que se puede implementar sobre

    hardware digital especializado como lo es una FPGA. Sin embargo, esta no es la nica forma de implementar ltros

    digitales, en este taller aprender como montar un ltro digital sobre un microprocesador haciendo uso de un programa

    escrito en lenguaje C. Aunque en esta prctica el ltro digital correr sobre el PC, el mismo cdigo en C puede ser portado

    a cualquier arquitectura digital que haga uso de un sistema basado en procesador (un microcontrolador, como Arduino, o

    un DSP, como lo har para el mini-proyecto #1).

    Los ltros digitales se describen por medio de una ecuacin en diferencias con coecientes constantes:

    a0y[n]+a1y[n1]+a2y[n2]+a3y[n3]+ ...+aP y[nP ] = b0x[n]+ b1x[n1]+ b2x[n2]+ b3x[n3]+ ...+ bQx[nQ]Note que los coecientes ak estn asociados a la salida y los coecientes bk a la entrada. En esta ecuacin, cada uno delos trminos tiene un signicado. Suponga que para implementar el sistema se tiene un conversor anlogo-digital (ADC),

    un microprocesador y un conversor digital-anlogo (DAC) (Figura 1). En cierto instante de tiempo, el microprocesador

    lee una muestra de la seal continua desde el ADC. Esta muestra es la que se representa por medio del trmino x[n] en laecuacin en diferencias y la denominaremos entrada actual. De esta forma, el trmino x[n 1] ser la muestra que se leydel ADC en el instante de tiempo inmediatamente anterior, por lo cual x[n 1] se denomina entrada anterior. De estaforma, x[n2] es la muestra que se ley hace dos instantes de tiempo, o muestra anterior a la anterior, y as sucesivamente.Los trminos y[n] tienen un signicado equivalente, y[n] ser la salida actual, es decir, la salida que necesitamos calculary escribir en el DAC despus de realizar todos los clculos; el trmino y[n 1] ser entonces la muestra que se escribi alDAC en el instante de tiempo anterior, a la que denominaremos salida anterior. De esta forma, y[n 2] ser la salida quese escribi al DAC hace dos instantes de tiempo, y as sucesivamente.

    Es claro entonces, que si estamos interesados en calcular la salida que se debe escribir al DAC (salida actual), es

    necesario despejar y[n] de la ecuacin anterior. Esto se logra dividiendo toda la ecuacin por a0 y despejando y[n], lo que

    m bits~

    ConversorA/D

    x [n]q

    Senal Digitalm bits~

    y [n]qConversor

    D/Ay(t)

    AnalogaSalida

    Sistema Digital deProcesamiento

    Entrada

    x(t)Analoga

    Senal de Disparo~cada Ts

    Senal Digital

    Microprocesador o

    Memoria

    ASIC o FPGA

    Figura 1:

    1

  • nos conduce a

    y[n] =

    Qk=0

    bkx[n k]Pk=1

    aky[n k]

    donde en la ecuacin anterior se ha supuesto que los ak y bk ya estn divididos por a0.Es posible calcular los coecientes de un ltro digital empleando modelos a partir de ltros anlogos. Si bien este tema

    no se aborda en este curso, si vamos a hacer uso de dichos modelos, los cuales estn disponibles en Matlab. Una forma de

    calcular los coecientes de un ltro digital es emplear un modelo basado en un ltro anlogo Butterworth haciendo uso de

    la funcin butter de esta forma:

    [bk ak] = butter(N, Wn, tipo);

    donde ak y bk son los coecientes de la ecuacin en diferencias, N es el orden del ltro, Wn es la frecuencia de corte

    del ltro dividida por la mitad de la frecuencia de muestreo, y tipo toma los valores 'highpass', 'bandpass', 'stop',

    respectivamente. Si el ltro es pasa-bajo el parmetro tipo se puede omitir. Wn, para el caso de pasa-banda o rechaza-banda,

    es un vector que contiene las dos frecuencias de corte del ltro dividas por la mitad de la frecuencia de muestreo. butter

    calcula los coecientes de ltros digitales tipo Butterworth, pero existen otras formas calcular los coecientes, por ejemplo,

    existen familias de ltros Chebyshev (cheby1 y cheby2) y elpticos (ellip).

    Reto #1. Realice el ltrado de la seal de audio que se encuentra en la pgina del curso usando un ltro digital pasa-banda

    de frecuencias de corte 2kHz y 4kHz. Emplee Simulink para realizar el montaje del sistema. En la paleta de Simulink DSP

    System Toolbox podr encontrar diferentes sources y sinks para acceder a seales de audio.

    Hay dos tipos de ltros digitales dependiendo de los trminos que aparecen en la ecuacin en diferencias. Si el ltro

    digital depende de entradas y salidas, como es el caso de la ecuacin en diferencias antes mostrada, el ltro se denomina

    ltro de respuesta innita al impulso o ltro IIR (por sus siglas en ingls Innite Impulse Response); y si el ltro depende

    exclusivamente de salidas, es decir,

    y[n] =

    Qk=0

    bkx[n k]

    el ltro se denomina ltro de respuesta nita al impulso o ltro FIR (por sus siglas en ingls Finite Impulse Response).

    Los nombres vienen de la forma de su respuesta al impulso, de longitud innita para los IIR y de longitud nita para los

    FIR (es decir, despus de cierto instante de tiempo todas las muestras son cero). Cada tipo de ltro tiene sus ventajas y

    desventajas que se muestran en la siguiente tabla:

    IIR FIR

    Ecuacin en diferencias Depende de entradas y salidas Depende exclusivamente de entradas

    Longitud de h[n] Innita FinitaEstabilidad Pueden ser inestables Siempre son estables

    Implementacin Requieren pocos coecientes ak y bk Requieren muchsimos coecientes bkRespuesta en fase No lineal Puede ser lineal

    En el Reto #1 calcul los coecientes de un ltro IIR. A continuacin veremos como calcular los coecientes de un

    ltro FIR. La ecuacin para el ltro FIR guarda una relacin estrecha con la sumatoria de convolucin. Si compara la

    ecuacin del FIR con la sumatoria de convolucin

    y[n] = x[n] ? h[n] =

    k=

    x[k]h[n k]

    y recordando que la convolucin es conmutativa,

    y[n] = h[n] ? x[n] =

    k=

    h[k]x[n k]

    2

  • se puede apreciar que las ecuaciones dieren nicamente en los lmites de la sumatoria, de hecho, la forma de transformar

    la sumatoria de convolucin en la ecuacin del FIR es asumiendo que la respuesta al impulso h[k] est denida en el rango0...Q, es decir, la respuesta al impulso tienen longitud nita, de ah el nombre FIR. En este sentido, para un ltro FIR, loscoecientes bk corresponden a la respuesta al impulso h[k]. As que para el clculo de los coecientes en un ltro digitalFIR se calcula la respuesta al impulso en lugar de emplear butter o alguna funcin equivalente. Nota: butter y las

    otras funciones antes indicadas solamente son para disear ltro IIR.

    En la siguiente tabla se muestran algunas ecuaciones de respuestas al impulso para ltros digitales FIR. La forma como

    se derivan estas ecuaciones se mostrar cuando se estudie el anlisis en frecuencia de sistemas en tiempo discreto.

    Filtro h[n]

    Pasa-bajo de frecuencia de corte ccpi sinc

    (cpi n)Pasa-alto de frecuencia de corte c

    (pic)pi sinc

    (picpi n

    )(1)nPasa-banda de frecuencia central 0 y ancho de banda BW

    BWpi sinc

    (BW

    2pi n)cos(0n)

    Ntese que en las ecuaciones anteriores las frecuencias se describen a travs de frecuencias normalizadas, no frecuencias

    en Hertz, es decir, = 2pi ffs .Un ltro digital FIR se puede implementar en Simulink usando el mismo principio del Reto #1. Sin embargo, a

    continuacin vamos a mostrar como implementar un ltro digital FIR usando un programa escrito en lenguaje C. La

    forma de escribir un programa en C para un ltro FIR es ms sencilla que un IIR. El programa para un IIR se hace en

    forma equivalente a como se mostrar en este documento y se deja a manera de reto.

    1. En Matlab se crear la respuesta al impulso (un ltro pasabajo en este ejemplo) y se crear un archivo de cabecera

    (.h) que contendr los coecientes,

    oc = pi/2;

    n = -20:20;

    hn = (oc/pi) * sinc( (oc/pi) * n);

    figure(1); stem(hn);

    Lo anterior crea un ltro pasabajo de 41 coecientes y una frecuencia de corte c = pi/2. Ntese que la ecuacin deh[n] debe evaluarse para n negativos y positivos, eso es porque hay que volver la respuesta al impulso causal. Si sequiere gracar la respuesta en frecuencia para vericar que el ltro es en efecto un pasabajo, escriba en Matlab:

    figure(2); freqz(hn);

    Ahora, vamos a exportar los coecientes a un archivo .h para poder ser usados en lenguaje C, para ello escriba en

    Matlab (es preferible que haga un script en lugar de escribir todos los comandos cada vez):

    fid = fopen('coeficientes.h','wt');

    fprintf(fid, 'const int Q = %d;\n', length(hn));

    fprintf(fid, 'const float hn[] = {\n');

    fprintf(fid, '\t %f, \n', hn);

    fprintf(fid, '};\n');

    fclose(fid);

    Lo anterior crea un archivo llamado coeficientes.h que contiene los coecientes almacenados en hn y escritos en

    un formato que los puede usar C. Si abre el archivo coeficientes.h puede ver que se ha declarado hn como un

    arreglo con datos inicializados.

    2. Ahora crearemos el programa en C para correr el ltro

    a) Descargue el archivo GNUsimdsp.zip de la pgina del curso y descomprimirlo en la carpeta raz tal como se

    muestra en la gura. Este archivo contiene una librera para simular un sistema basado en DSP, incluyendo

    funciones para simular la adquisicin de seales por medio de un ADC y escribir las seales en el DAC.

    3

  • b) Cargue CodeBlocks y abra el archivo \gnusimdsp\ejemplos\simdsp.cbp (Ver gura anterior). Compile y corra

    el programa. Este ejemplo simula un circuito derivador. Cambie las diferentes formas de onda para vericar su

    resultado.

    c) En Codeblocks expanda la estructura de directorios para abrir el archivo ejemplo1.c, que es el archivo que

    tiene la implementacin del derivador.

    d) Note que el programa anterior ha reemplazado el main por otra denicin dsp_main. Al inicio se emplea

    una funcin que inicializa el sistema a la frecuencia de muestreo de 8kHz llamada dsp_fijarfs. La funcindsp_leerADC lee una muestra del ADC (entrada actual) y la funcin dsp_escribirDAC escribe la salida actual.

    Como el derivador es un sistema que implementa la ecuacin en diferencias y[n] = x[n] x[n 1] , el programaanterior almacena la entrada actual, x[n], en la variable x, y la variable xant se supone almacena la entradaanterior, x[n 1], luego la ecuacin en diferencias se implementa mediante la siguiente lnea en C y=x-xant.Ntese que despus la entrada actual tiene que pasar a ser la entrada anterior, pues se supone que cuando el

    programa vuelva a leer una nueva muestra con dsp_leerADC, el valor entregado por esta funcin ser x[n], yla muestra anteiormente leida debe ser x[n 1]. Ese movimiento de datos se ha hecho mediante la lnea xant= x;

    e) Cuando se tiene que implementar un ltro FIR, la ecuacin en diferencias a implementar ser y[n] = b0x[n] +

    b1x[n 1] + b2x[n 2] + b3x[n 3] + ... + bQx[n Q] =Qk=0 bkx[n k], luego, se tienen que tener muchas

    4

  • variables para almacenar las entradas anteriores, y se debe hacer el movimiento de datos Q veces. En el ejemploque nos compete, h[n], o equivalente bk, es un vector de 41 elementos, luego para escribir el programa en Ctendramos que escribir una lnea con 41 trminos y poner 41 lneas para mover los datos del tipo xant = x!.

    En C, se puede abreviar toda esa escritura por medio de ciclos for. Para ello, se declaran las entradas anterior

    por medio de un arreglo de 41 elementos, al que llamaremos x, as que el truco es decir que el primer elemento

    del arreglo x en C es la entrada actual x[n], el segundo elemento, x[n 1], y as sucesivamente. De esta forma,el programa tendr la forma:

    #include

    #include

    #include

    #include "coeficientes.h"

    void dsp_main() {

    short x[Q];

    float y;

    int k;

    dsp_fijarfs(8000);

    while (1) {

    x[0] = dsp_leerADC();

    y = 0;

    for(k = 0; k0; k--) {

    x[k] = x[k-1];

    }

    dsp_escribirDAC(y);

    }

    }

    f ) Ntese que la sumatoria se implementa por medio de un ciclo for, y el segundo ciclo for es para mover los

    datos, es decir, para que la muestra actual pase a ser la muestra anterior, la anterior, la anterior a la anterior,

    y as sucesivamente. Para que el programa corra, es necesario que copie el archivo coeficientes.h generado

    en Matlab a la carpeta ejemplos, pues este archivo es incluido con la directiva #include coeficientes.h, y

    es quien declara las variables Q y hn que se requieren en el programa.

    Preguntas:

    1. Cul es la frecuencia de corte en Hz del ltro implementado? Cmo la puede demostrar tericamente?

    2. Qu pasara si el segundo ciclo for no se inicia desde el ltimo elemento sino desde el primero, es decir, si se cambia

    el for por for(k = 0; k