Diseño de Filtros
La nota de aplicación AN2099 entrega un completo procedimiento y teoría respecto de los filtros digitales, desarrollados en Asembler, pero al intentar obtener los mismos resultados mediante lenguaje C, se complica un poco el entendimiento.
En este ejemplo vermos que no hay por que complicarse debido a que es muy simple desarrollar filtros digitales.
Al utilizar un conversor análogo digital del tipo delsig11 para el muestreo de una señal cada 30 ms a aproximadamente 35 Hertz el desempeño de los filtros análogos LP, BP, HP no entrega buenos resultados siendo seguro solo a frecuencias mayores de 300 Hz, por lo cual se debe utilizar un filtro IIIR debido a que los filtros en bloques SC no se desempeñan bien a bajas frecuencias y se calientas, aumentando asi el ruido de la señal.
Primero de debe definir que ancho de banda queremos para nuestro filtro y que es lo que deseamos filtrar, en este ejemplo se diseñara filtro pasa banda, que permita el paso de un señal de 35Hz.
OK, Vamos:
1.- Primero se debe calcular la función de transferencia (eq.2)
2.- Se debe escoger la velocidad de Muestreo, para este ejemplo escogeremos el máximo para un ADC Delsig11 es decir 7812 Ks
3-. Escoja la frecuencia para este filtro.
Aquí diseñaremos un filtro LP de 45 Hz y un HP de 35 Hz, creando un filtro pasa banda (BP)
Se calcula el valor de “a”, para cada uno de ellos.
De lo cual obtenemos:
Para el filtro pasa bajo de polo simple de 45 Hz se obtuvo: a = 27,6
Para el filtro pasa alto de 25 Hz se obtuvo: a = 49,7
4.- Luego implementarlo y definirlo en el programa de desarrollo en lenguaje C. Para esto debemos definir las variables necesarias, es decir una variable que reciba el valor del ADC (iData), la variable que recibe el valor para el filtro LP (flowpass), de igual forma para el filtro HP (fhighpass).
5.- Declarar las variables en el inicio del programa para cada valor de “a”.
#define a VALUE 27.6
#define bVALUE 49.7
Aplicación.
Aquí se utilizó para obtener el máximo valor de un proceso y se almaceno en la variable “mayor” y luego de la etapa de filtro poder utilizarlo en otro proceso.
#include “m8c.h”
#include “iifilters.h”
••••••••••••
float current_calculation (void)
{
float volt;
iData=DELSIG11_iGetdataClearFlag();
iData=(iData + (DELSIG11_iGetDataClearFlag()))/2;
DELSIG11 StopAD();
fLowPass += ((iData-fLowPass)/aVALUE);
fhigPass += ((fLowPass-fhigPass)/VALUE);
if(mayor < fhigPass)
mayor=fhigPass;
else mayor = mayor;
}
Respecto al orden del filtro, éste se puede variar de acuerdo a los resultados obtenidos.
Obviamente se debe considerar que se respetan los criterios de Nyquist y otros para el procesado digital de señales, como asi también los 3 ciclos necesarios para obtener un dato correcto desde un ADC Delsig11.
Conclusión:
Se ha presentado una manera muy fácil y simple de diseñar filtros recursivos en C, solo deben probar….
Por: Juan Tapia Farias
Ing. Electrónico en Telecomunicaciones
www.psoc-chile.es.tl