Go Down

Topic: Ayuda con mi codigo y filtros paso-bajo (Read 7 times) previous topic - next topic

Cheyenne

copachino, para implementar un filtro paso banda en Arduino por ejemplo puedes poner lo siguiente, está realizado con el código para Bessel de primer orden con frecuencia de corte 1 kHz.
Code: [Select]

float v[2];
float VariableFiltrada;

void loop() {

  v[0] = v[1];
  v[1] = (2.45237275253e-1 * Variableafiltrar) + (  0.5095254495 * v[0]);
  VariableFiltrada = v[0] + v[1];

}


Ahora no sé si hay algún experto en filtros que nos pudiera resolver algunas dudas. Las que yo tengo son:

¿En qué casos está más indicado el filtro Bessel o el Chebyshev?

Si se usan los filtros paso bajo de Bessel o Chebyshev, qué ventajas o inconvenientes tienen respecto a realizar la media de los últimos x valores?

El orden de los filtros imagino que se corresponde con la mayor o menor atenuación en las frecuencias de corte. Sin embargo al ir aumentando el orden, ¿qué inconvenientes nos produce? ¿Se produce mayor retardo en la señal?

copachino

#16
Jan 22, 2012, 12:04 am Last Edit: Jan 22, 2012, 11:14 pm by copachino Reason: 1
Pues bueno de momento este es mi código "filtrado" con la ecuación de bessel de primer orden use las librerías que me pasaron para filtros.... uno no he probado el programa pero mañana espero poder hacerlo


Cheyenne

Yo hice una prueba con la librería pero no me funcionó, me sacaba unos valores en otro orden de magnitud. Tampoco lo investigué mucho, tal vez era un error de programación por conversión entre distintos tipos de variables. Por no ponerme a investigar directamente puse el algoritmo que he puesto arriba y funciona bien.

No sé si hay alguien que controle el tema de filtros y pueda responder a las preguntas de mi anterior post.

Igor R

#18
Jan 22, 2012, 02:42 pm Last Edit: Jan 22, 2012, 03:08 pm by Igor R Reason: 1
Realizar la media de los "X" últimos valores, desde un punto de vista como filtro paso bajo, es malo. Pero por otro lado, computacionalmente es muy bueno. Ya que si por ejemplo, haces que tu "X" sea un número par, para dividir puedes usar una operación de shift (cada vez que desplazas una posición, multiplicas o divides por dos, según el sentido).

Al final, uno de los factores limitantes en sistemas de tiempo real, es la computación. Puede ser un filtro cojonudo, que si no va a dar tiempo a tu Arduino, a procesar las operaciones necesarias entre la toma de una muestra y la otra, no te sirve para nada.

Por ejemplo, hacer algo como:

memoria1=memoria2;
memoria2=memoria3;
memoria3=memoria4;
memoria4=analogRead(0);

salida_filtrada=(memoria1+memoria2+memoria3+memoria4)>>2;


Pues es bastante rápido. Es decir, de esta forma no se te queda parado tomando "X" muestras para luego usarlo en lo que quieras. Lo va haciendo al "vuelo".Asi tienes más tiempo para realizar otras operaciones en tu proceso.
Si lo que vas a controlar es la temperatura de una habitación, pues te puedes permitir altos tiempos de ciclo. Es un sistema que tiene una inercia altísima. Para que suba 1 grado una habitación, pasan minutos ó horas...
Por otro lado, si estas midiendo es las revoluciones de un motor, en la cual tienes que inyectar gasolina en el cilindro cuando estés a cierto lugar del punto muerto superior, pues te estás moviendo en tiempos muy pequeños...

Me refiero, que es un factor a tener en cuenta, no sólo el filtro en sí, si no la computación que requiere implementarlo.



Cheyenne

Gracias Igor R. En el caso que ahora me llevaría creo que no sería muy crítico el tiempo de computación (claro que tampoco sé el tiempo que llevaría ejecutar un buen filtro). Se trata de la medida de los 8 canales de la emisora RC. Los datos recogidos pueden variar aproximadamente entre 1050 µs y 1870 µs siendo el centro 1460 µs. Ante un valor fijo de palanca la variación por ruido puede tomar valores entre 1448 µs y 1460 µs. Ahora lo tengo en plan sencillo promediando los últimos 6 valores pero me gustaría implementar algún filtro mejor.

Go Up