Hola, se que el postes un poco viejo pero las dudas siempre quedan y muchas veces varios tienen las mismas dudas asi que tratare de responder alguna de las dudas que vi aqui.
Primero, cada tipo de filtro tiene sus características, y saber cual utilizar dependerá de la aplicación en donde se utilice el mismo.
La característica de los filtros bessel son que tienen una respuesta de fase lineal, es decir, la fase de la señal varía linealmente a medida que aumenta la frecuencia. Esto es ventajoso para aplicaciones que requieran una fase invariante o para las aplicaciones en donde el retraso de grupo no sea algo critico.
Contra? pues, para poder obtener cierta atenuación a una determinada frecuencia, se requiere de un orden mayor del filtro, lo que conlleva a un coste computacional mayor (si se requiere atenuaciones abruptas)
Los filtro butterworth. su principal característica es que en la banda de paso (las frecuencias que queremos) tiene una respuesta maximamente plana. Sus aplicaciones podrian ser por ejemplo en procesos en donde la magnitud de la señal es fundamental y cambios mínimos en la misma no pueden ser tolerados. en bioseñales por ejemplo en donde las amplitudes no llegan a mas de unos cuantos miliVoltios.
Contra? Fase no lineal
Los filtros chebychev. Su principal característica es que para una atenuacion a una determinada frecuencia, requiere un orden de filtro menor en comparación con butterworth y bessel. Aplicaciones podrían ser en las que la magnitud y fase no son críticos, si no por ejemplo el coste computacional, (que se este trabajando con algun micro con poca memoria por ejemplo o baja velocidad) y se requiera de una garantía de supresión de ciertas frecuencias a una determinada atenuación.
Contra? Fase no lineal y riple en la banda de paso (variación en la magnitud de la nada de paso)
Este riple puede variar dependiendo del cálculo que se haga del filtro.
Un filtro de media móvil o filtro promediador es un filtro con características de tipo "pasa bajo" y se utiliza principalmente para "suavizar" la señal y tratar de eliminar los cambios abruptos que puedan ocurrir en la señal. Mientras mayor sea el número de muestras con que se realiza el promedio, mayor será el "suavizado", pero si se utilizan muchas muestras, este tipo de filtro puede llegar a distorsionar la señal real.
Bueno, estos son los principales filtros digitales y mas comunes. Existen otros mas complejos y me extendería mucho si nos ponemos a explicar en detalle cada uno de ellos.
Ahora, el orden del filtro: Mientras mayor sea el orden del filtro, mayor es la "caida" o la pendiente o el roll-off del filtro, hacia la banda de rechazo (la que queremos filtrar). Pero esto a su vez requiere un coste computacional mayor para su implementacion.
Frecuencia de corte: esta es la frecuencia en la que el filtro debería atenuar la señal por lo menos a la mitad de la potencia. Si se trata de un filtro pasa bajo, es la máxima frecuencia que quieres dejar "pasar" por el filtro; si es u filtro paso alto es la mínima frecuencia que quieres dejar pasar. Si se trata de un filtro pasa banda, se trata del rango de frecuencia en la que se encuentra tu señal, o que quieres dejar pasar, o de interés (Fminima - Fmáxima; desde 10 Hz hasta 200 Hz, etc); y si es rechaza banda o "Notch" o de ranura, es la frecuencia que deseas eliminar, o el rango de frecuencia que deseas eliminar (ej: eliminar 60 Hz o 50 Hz, que es la frecuencia de la línea eléctrica dependiendo del país, eliminar desde 500 Hz hasta 1500 Hz, etc).
Para poder diseñar un filtro, es necesario al menos estas 2 características (orden del filtro y frecuencia de corte) además del tipo de filtro (paso bajo/alto/banda, etc).
Se podría diseñar alguna librería en la que introduzcas estos valores y te regrese los valores del filtro pero creo que esto no es lo que quieres y además sería un poco complicado.
Para poder darte algun filtro necesitaría saber la aplicación para el mismo, o al menos la frecuencia de corte. MatLab tiene algunas funciones interesantes que te podrían ayudar a realizar este cálculo sin saber mucho de filtros si quieres probar.
Se me olvidaba, los filtros tambien se pueden clasificar segun su respuesta al impulso, pueden ser de tipo IIR (respuesta al impulso infinita) o FIR (respuesta al impulso finita). No vamos a entrar en detalle con esto ya que puede ser tedioso pero explico de la manera más basica para tratar que se entienda lo mejor posible:
Los filtros IIR necesitan un orden menor que los FIR para lograr la misma atenuacion a cierta frecuencia, pero estos no siempre pueden llegar a ser estables y además, la respuesta de la fase no es lineal. Otra característica explicada de forma simple es que para implementarlos, necesitarías guardar en memoria no sólo algunos valores de la entrada, si no tambien algunos de la salida (si, depende de salidas anteriores o pasadas).
Los filtros FIR siempre son estables y la mayoria tienen una respuesta de fase lineal pero necesitarían un orden mayor que los IIR para lograr la misma atenuación a cierta frecuencia. Estos sólo dependen de valores pasados de la entrada. no dependen de valores pasaos de la salida.
Los filtros butterworth y Chebychev son filtros de tipo IIR
Los filtros de Bessel y de media movil son filtros de tipo FIR
Los filtros digitales dependen tambien de la frecuencia de muestreo que estes utilizando, o en otras palabras, el tiempo de muestreo o periodo de muestreo (cada cuánto tiempo vuelves a tomar una muestra). Dependiendo de la frecuencia de muestreo, se calculan los coeficientes del filtro.
Por lo que "decirte un filtro" así como así puede que no te sirva para las especificaciones que tu necesitas.
Si lo que necesitas es un filtro para reducir un poco el ruido para un sensor de temperatura, o creo que leí el de distancia, un filtro de media movil podría servir perfectamente.
Te podría dar un ejemple de un filtro de media móvil de 5 muestras por ejemplo:
float x[5] = 0; // Las 5 muestras para su posterior procesado
float y = 0; // La salida del filtro
/* Los filtros de media movil pueden utilizarse con valores "futuros" a la muestra central y valores "pasados".
Puede utilizarse solo futuros, solo pasados o una combinacion de los dos. en este caso utilizaremos solo valores pasados*/
void setup{
serial.begin(9600);
//podemos inicialmente recoger 5 valores y despues ir actualizando los valores
for (int i=0; i<5; i++){
x[i] = analogread(PIN); //lee el pin del sensor, etc.
y = y + x[i]; // sumo los valores de las muestras
}
y = y/5; // Finalmente calculamos el promedio
x[4] = x[3]; // Actualizamos los valores de las muestras
x[3] = x[2];
x[2] = x[1];
x[1] = x[0];
}
void loop{
// Ahora podemos empezar a tomar muestras indefinidamente
x[0] = analogread(PIN; // Empezamos a leer los valores
// Implementamos el filtro
y = (x[0] + x[1] + x[2] + x[3] + x[4])/5;
serial.prinln(y); // Imprimimos en monitor serial
x[4] = x[3]; // Actualizamos los valores de las muestras
x[3] = x[2];
x[2] = x[1];
x[1] = x[0];
}