Filtrado digital

Contenido

Introducción

Ventajas

Aplicaciones

Clasificación de los filtros digitales

Filtro de valor medio

Diseño de un filtro recursivo

Implementación en código C

Introducción

Es un sistema diseñado para la atenuación o eliminación de determinadas componentes de frecuencia del espectro de la señal de entrada. Y se puede hacer digitalmente en vez de con componentes activos o pasivos externos.

Ventajas:

  • Características imposibles de conseguir en analógicos, como la fase lineal y la no variación con la temperatura
  • Bajo coste, al implementarse en un procesador que ya está
  • Fácil de modificar
  • Inmunidad alta al ruido
  • Alta precisión, limitada por los errores de la aritmética que se emplee

Aplicaciones:

  • Mejora de las señales de tensiones/corrientes obtenidas por sensores
  • Control digital de motores
  • Procesado de señales digitales
  • Sistemas de comunicaciones
  • Procesamiento del habla
  • Ingeniería biomédica

El filtro digital se basa en la implementación de las ecuaciones matemáticas correspondientes a la función de transferencia del filtro, mediante la ecuación en diferencias

Es muy importante tener en cuenta el teorema de Nyquist y limitar la entrada al ADC a señales con frecuencias menores a la frecuencia de muestreo dividida por 2, añadiendo un filtro analógico paso bajo llamado filtro anti-aliasing.

Clasificación de los filtros digitales:

  • Recursivos: se obtiene a partir de la discretización de la FDT de los filtros en continuo, reutiliza las salidas del propio filtro como entradas, lo que suele dar lugar a respuestas de duración ilimitada a una señal impulso. De ahí sale el nombre de filtro IIR (infinite impulse response).
  • No recursivos: se obtiene a partir de la aproximación de filtros recursivos discretos, por división polinómica, de los filtros en continuo. Dicho de forma simple, únicamente usa la entrada (o un histórico de entradas) para el cálculo de la salida. En este caso la repuesta ante un impulso es limitada, por lo que se llaman filtros FIR (finite impulse response).

Filtro de valor medio

Opera con un número determinado de muestras de la señal de entrada que producen la señal de salida. Se basa en hacer la media, por lo que es útil para señales de continua con ruido pero no logra separar frecuencias.

La media se hace sobre un número fijo de muestras (ventana), de la siguiente  forma:

  • Inicialmente hay un vector donde se almacena un número de muestras, pongamos 30.
  • Cada vez que se toma una muestra, se elimina la primera del vector, se desplaza hacia la izquierda y la muestra nueva se almacena en el último espacio, por eso se le llama filtro de desplazamiento (de la ventana).
  • Se realiza la media cada vez que entra una muestra nueva

Esto se puede optimizar por ejemplo haciendo la media cada 10 muestras nuevas en un vector de 1000, de forma que hay más tiempo para otros procesos.

Diseño de un filtro recursivo

Hay unos pasos a seguir:

  1. Elección de frecuencia de corte y muestreo
  2. Elección del tipo y orden del filtro digital
  3. Obtener la FDT discreta y pasarla a ecuación en diferencias
  4. Simular para asegurar que funciona e implementar

Las FDT continuas ya las conocemos, vamos a ver cómo se discretiza.

Hay que realizar una transformación de la variable s, puede ser bilineal, trapezoidal u otras, y depende de la frecuencia de muestreo (Fs) que origina un desplazamiento de la frecuencia de corte en el plano continuo:

fd1

A este cambio se le conoce como ajuste “PreWarping”

La discretización cambia según el método, por ejemplo en el bilineal bilin

Se sustituye la frecuencia de corte del filtro en la FDT continua por la frecuencia con el ajuste PreWarping que hemos calculado antes, y la s por la expresión que le corresponda. Por ejemplo: un filtro paso bajo con frecuencia de corte 100 rad/s, Fs 1000 Hz, tiene una expresión típica en continuo así:

fd2

Y al discretizar con los datos dados queda así:

fd3

Por último se debe pasar esta FDT a una ecuación en diferencias que tenga en cuenta la salida que vamos a obtener, la entrada y/o las entradas y salidas anteriores que debemos guardar en memoria, de la siguiente forma:

fd4

Pasando la entrada a la derecha y despejando la salida:

fd5

Esto se traduce a lo siguiente:

fd6

En palabras: la salida actual va a ser igual a 1/21 por la entrada actual, más la entrada anterior, más 19 veces la salida anterior.

Implementación en código C

Hay que tener en cuenta la resolución requerida para la implementación, y por lo tanto el tipo de variables que se van a usar:

  • En coma flotante, sólo útil en procesadores con FPU, ya que un procesador de coma fija tardaría demasiado en procesar la operación mediante librerías.
  • Variables enteras, se usaría el redondeo
  • Formato IQ, que se puede utilizar en procesadores de coma fija con la librería matemática IQMath en un tiempo pequeño.

Para simplificar, suponiendo que disponemos de un procesador con FPU, la implementación se llevaría a cabo de la siguiente forma:

  • Declaración de las variables

Float Xk = 0, Xk_1 = 0, Yk = 0, Yk_1 = 0;

  • Configuración e inicialización de dispositivos: ADC, timer que hace saltar una interrupción cada Ts segundos, otros GPIO…
  • Rutina de interrupción del timer: lee la entrada del ADC y se la asigna a Xk
  • Bucle del main: tras la interrupción y por lo tanto la obtención del valor Xk, se realiza la operación con la ecuación en diferencias literalmente, después se reasignan los valores para tener el valor anterior cuando realicemos un nuevo muestreo:
while(1){

     if(interrupt==1){

          Yk = (1/21)*Xk+Xk_1+19*Yk_1;

          Yk_1 = Yk;

          Xk_1 = Xk;

          interrupt = 0;

       }

     … //Se hace con la información lo que sea necesario

    }

} //Fin del main

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *