Filtro digital para 1 Hz

Ningún problema, helo aquí.

Lo que vas a ver son dos funciones principales:
1) [B,A]=butter(......): en base a los que definas en (....) te devuelve los coeficientes en B y A.
2) y=filter(B,A,x): toma como función de entrada 'x' y le aplica el filtro 'B,A'. Lo guarda en y. Yo hize que x sea un impulso para tener en y la respuesta al impulso del filtro.

Slds...

Mariano

PD: renombrá el archivo a '.m' para usarlo en MATLAB, no sé porqué no me dejaba adjuntarlo con esa extensión.
 

Adjuntos

  • filtro_493.txt
    951 bytes · Visitas: 23
_Eduardo_ dijo:
Macraiq, un encoder tiene dos salidas defasadas, de acuerdo a cual cambie de estado primero se conoce la direccion y con eso de decide entre cuenta ascendente o descendente.
http://en.wikipedia.org/wiki/Rotary_encoder

Ah, y todo 'buen' encoder dispone de una tercera salida como indice que da un pulso por vueelta.

Conozco como funciona el encoder, pero gracias por la información adicional ;). Es por eso que me ha sorprendido que en su post anterior me dijera que no puede determinar el maximo.

Sin embargo, gracias a la explicacion de jerkox entiendo mejor su problema. El problema no consiste en no poder determinar el maximo. Sino en que como se trata de un sistema en movimiento continuo, no sabe cual es el maximo.

Jerkox, tienes razon, no habia considerado el movimiento constante, o que la variacion puede ser tan rapida. Es un problema interesante, dejame lo consulto con la almoada y veo que se me ocurre manana.

Salu2.

PD: Una pregunta, ?un pendulo de 25 cm no estorba demasiado en la conduccion?
 
Gracias SigmaOrion, lo dicho me pondre a ello.

A macraiq, lo pienso colocar en la barra de la bicicleta y creo q no dificultara mucho, aujn no lo tengo emplazado realmente pero creo q servira.
 
He estado probando con la senal que me sale del pendulo y es inestable, te mando el programa que he hecho con una posible entrada senoidal de frecuencia 1 Hz. Tambien he estado probando con un filtro pasa alta pues puede que sea mas facil ya que creo que no habra ninguna senal debajo de 1 Hz que me moleste. Te mando el paso alto y las senales de salida. (Esta en .txt cambialo a .m)

Saludos
 

Adjuntos

  • filtropasoalto_950.txt
    217 bytes · Visitas: 68
  • amplitud_164.jpg
    amplitud_164.jpg
    30.2 KB · Visitas: 306
  • fase_775.jpg
    fase_775.jpg
    17.3 KB · Visitas: 300
Jerkox, hay varios problemas con lo que hiciste.

1) La variable "t" no estaba calibrada a la escala de tiempo real, o sea que la función "sin(2*pi*t)" no genera una señal de 1Hz, sino una de 100Hz que está completamente fuera del rango de frecuencias para esa velocidad de muestreo, entonces el contenido de "x" y de "y" carecen de sentido. Para poder hacer lo que quisiste hacer el paso de t tiene que ser de 0.01s (100Hz de muestreo).
2) La frecuencia de corte del flitro la acomodaste en 0.75Hz (50Hz*0.015) con lo que el filtro pasa alto te deja pasar tu señal supuestamente indeseada de 1Hz. En ese caso te recomiendo que uses como frecuencia de corte 1.5Hz ó mayor, digamos una frecuencia normalizada de 1.5/50=0.03 ó mayor.
3) Aunque acomodes lo que te digo en el punto 1) los gráficos carecen de utilidad porque si tu variable de entrada al filtro es simplemente un seno entonces el filtro va a actuar sólo sobre esa frecuencia ya que es la única que existe en tu señal, por lo tanto cuando transformadorrmás por fourier la variable de salida "y" sólo va a contener esta componente de frecuencia y no vas a ver el comportamiento del filtro en todo el espectro. Por eso yo hice un delta de kronequer como variable de entrada, la cual contiene todas las componentes de frecuencia, desde 0Hz (dc) hasta 50Hz (máximo para 100Hz de muestreo).

Yo no sé bien qué frecuencias querés rechazar y cuáles querés que entren a tu sistema porque no sé cuál es la finalidad. Tenés dos opciones:
1) Nos contás con detalle cuál es la finalidad práctica de tu circuito y con eso entre todos podemos determinar y ayudarte a ver si realmente necesitás un filtro o hay otra alternativa más sencilla (es lo que planteaba Macraiq si no me equivoco).
2) Me decís qué frecuencias querés rechazar y cuales querés que entren al sistema y yo te diseño el filtro, te paso la formulita que tenés que aplicar y después implementás el algoritmo. Si se complica eso lo vemos después.

Slds...

Mariano
 
En realidad sí se puede conocer el máximo.
Al tomar una muestra en el tiempo, obtienes una porción del movimiento, o sea en un intervalo de tiempo. El máximo en un intervalo se puede conocer.

Me parece interesante el desafío....

Yo haría lo siguiente:
Tomaría las muestras en un intervalo de tiempo significativo, haciendo un promedio ponderado de estas muestras, en tiempo real.
Si haces el promedio ponderado con signo, o sea con el sentido del péndulo, la resultante estaría muy cercana al eje de la oscilación.

...y todos los caminos conducen a Roma...
Sería lo mismo que hacer un pasabajos, o poner el péndulo en aceite o un filtro digital...
 
Javier, te hago una pregunta porque no entendí bien (y el tema está bueno). Cuando hablás de ponderación, cómo las ponderarías a las muestras? digo, sería algo así como x[n] = SUMA(x[n-m]/m), o cómo? no sé, no me lo imagino, je.
Habría que ver cómo es la respuesta del sistema en cuanto a fase, me da la sensación de que eso genera un retardo muy grande (como dijo alguien en algún lugar del hilo).

Bueno, igual todo depende de las necesidades de Jerkox.

Slds...

Mariano
 
Muy buenas a todos, bien os explicare con detenimeinto lo que yo quiero realizar.
Objetivo: Medir la inclinación de una bicicleta con la ayuda de un encoder y un pendulo.
Instrumentación: poseo el encoder HEDS-9100 y una barra sujeta al rotor del encoder
Parte ralizada: poseo el codigo que cuenta las cuentas del encoder al girar de un lado al otro, es decir, los grados lo calcula. El PIC es el 16C74 y esta programado en ensamblador.
Problema: como ustedes saben el pendulo oscila, es decir no queda fijo cuando la bicicleta se inclina hacia un lado o al otro. Esta oscilación esta medida y es en torno 1 Hz de oscilación. Les adjunto una foto de una muestra tomada.
Que necesito: Eliminar esta oscilación y que solo el PIC cuente las cuentas que sean de la verdadera inclinación de la bicicleta.

Por lo tanto,creo que se podria incluso hacer un paso alto pues las frecuencias menores a 1 Hz creo que no entrarian en conflicto verdad?. Es decir mas lento no va ir el pendulo que a 1 Hz.

Tengan en cuenta que la bicicleta e sun sitema dinamico y por tanto no se si se podria llegar a conocer el centro de la oscilación. Pues pienses, el pendulo irá oscilando respecto al eje central de la bicicleta, pero a su vez existirá otra oscilación del pendulo en si mismo.

Perdonen si les estoy mareando pero sobretodo de matlab ando verde...

Un saludo y gracias
 

Adjuntos

  • pendulo0_142.jpg
    pendulo0_142.jpg
    21.9 KB · Visitas: 260
Jerkox, está clarísima la idea. Yo en tu lugar implementaría el filtro notch por distintas razones:

1) Un pasa-altos te elimina la componente de DC, entonces si la bicicleta está constantemente inclinada vos no te vas a enterar. Por otro lado no estoy de acuerdo con que el péndulo no va a producir frecuencias por debajo de 1Hz: suponete que el péndulo está oscilando pero a su vez la bicicleta si inclina muy lentamente. Lo que vas a tener es una rampa muy lenta (inclinación real de la bicicleta) con una oscilación de 1Hz montada. Con el pasa-altos estás eliminando todo eso y no lo vas a ver.
2) Implementar el pasa alto tiene la misma complejidad que implementar el notch.
3) Usaría el filtro porque es muy sencillo de implementar, no tanto como un promedio o detectar máximos y mínimos, pero con muchísimas ventajas y más precisión.

Además de eso el PIC que tenés alcanza perfectamente para sacar las cuentas, eso sí, intentá ponerle un cristal para trabajar a 20MHz.

Slds...

Mariano
 
Si, usare un cristal de 20 MHz mira te envio la respuesta usando el filtro, creo que filtra muy bien. Te adjunto una foto, en azul la señal a filtrar y en rojo despues del filtro. He usado unas frecuencias de [0.095 0.4] de fstart y fstop tambien ten en cuenta que al final he cambiado la frecuencia de muestreo (sample rate) a 10 Hz, (no necesitaba tantos puntos). Ahora ver como lo pongo en el PIC.

Un saludo y muchas gracias SigmaOrion
 

Adjuntos

  • filtro_570.jpg
    filtro_570.jpg
    85.1 KB · Visitas: 17
Buenísimo Jerkox, se ve muy bien. Si querés probá el filtro también montando la señal de 1Hz sobre otra señal de 0.2Hz ó algo por el estilo para ver si a la salida del filtro realmente desaparece la de 1Hz y la otra permanece. Respecto de las frecuencias a mi me da la sensación de que fstop=0.4 es un poquito alta y que con 0.2 alcanzaba, pero bueno, eso es cuestión de ir probando y de las necesidades, total una vez que está implementado cambiar los coeficientes es cosa de 5 minutos.

Slds...
 
Saliendo un poco del tema específico y yendo al objetivo de medir la inclinación de la bicicleta... es un buen método para medirla?. Lo digo porque imagino que los ángulos medidos van a ser pequeños. Es cierto que usando engranajes se puede solucionar...

En fin, quería proponer otro método, a ver que les parece. El dibujo que sigue lo hizo mi sobrino de 6 años apurado, no yo, jaja:


Bueno, ese circulo es la rueda, rayos no había ganas de dibujar más de 8, el soporte de la rueda es lo que está delimitado por las dos líneas que salen del círculo interior.

La barra iría colgada de donde se agarra la rueda, se le podría poner un peso para que haya menos oscilaciones y no la mueva el viento.
Lo que quise simbolizar con los cuadraditos es un par de sensores de efecto Hall, que se activarían a detectar el paso de imanes puestos en algunos de los rayos.

Entonces habría dos sensores de efecto Hall, uno fijo al extremo de la barra, y otro al sostén de la rueda (en la parte de arriba).
La idea sería medir el tiempo en que cada imán pasa por los sensores de efecto Hall. Y en base a ese tiempo sacar el ángulo entre los sensores de efecto Hall.
Claro, para eso hace falta conocer la velocidad a que gira la rueda, que se puede sacar de esos mismos sensores de efecto Hall.

w=velocidad angular = angulo/tiempo

angulo = w x tiempo = (velocidad tangencial / radio) x tiempo

suponemos que velocidad tangencial la medimos:

angulo sensor efecto Hall soporte - angulo efecto Hall barra = (velocidad tangencial / radio) x (tiempo efecto Hall soporte - tiempo efecto Hall barra).

Si la bici no estuviera inclinada ese ángulo es.... iba a decir 180º pero eso depende de la construcción de la bici, digamos que es igual a ángulo_fábrica.

Entonces sería:

inclinación = (angulo sensor efecto Hall soporte - ángulo efecto Hall barra)_medido - ángulo_fábrica.

Bueno, eso sería, ojalá se entienda. También pondría más de un imán en los rayos, para que la medición de velocidad y ángulo no se estropee a baja velocidad

Dije sensores de efecto Hall e imanes porque fué lo primero en lo que pensé, podrían ser leds y fotoreceptor y espejos en los rayos (servirá un CD para reflejar?).

Lo bueno es que nos ahorramos un encoder y terminamos midiendo tiempo, que se puede medir con muy buena resolución (los pics pueden usar una entrada capture para medir ese tiempo, y pueden medir desde unos cientos de nanosegundos hasta el tiempo que uno quiera usando la interrupción de desordamiento del temporizador asociado, el tipo va a tener que pedalear muy rápido para que se pierda resolución midiendo el tiempo).

Que es justo lo que me preocupaba del método de barra ligada a encoder, que no se usa toda la resolución del encoder porque se mide en un rango de posiciones del eje limitado (cierto, el reductor... pero ya es más engorroso no?).

A ver que opinan....
 

Adjuntos

  • bici_142.gif
    bici_142.gif
    19.9 KB · Visitas: 35
Ardogan, la idea parece muy buena porque es sencilla, pero... todo tiene un pero, me cacho! lo que ahí vas a medir es el ángulo que forma (ummm, cómo decirlo?) el vector que une el eje de una rueda con el de la otra (horizontal, ha no ser que hagamos wili, güili o como sea, o que "colguemos la bici" como dicen otros) con respecto al plano de la tierra (del nivel de agua).
Bueno, después de tanto decir, creo que lo que quiere medir nuestro complañero Jerkox es otro ángulo, o sea, con el eje de giro justamente en la dirección en que se avanza. Sería algo así como el ladeo de la bicicleta cuando uno dobla, o algo por el estilo.

Ummm, qué matete, jaja, Jerkox, si el ángulo que vas a medir es el que dice Ardogan entonces yo voto por sacar el encoder también!

Slds...
 
Aaaah bien, claro, lo que yo decía es para medir la pendiente del terreno, y no el ángulo entre el plano de la bici y el terreno.
Interpreté mal, sorry
 
No no el angulo es la bici con respecto al terreno, es decir como tu bien dices SigmaOrion el "ladeo" de la bicicleta. Aun asi muchas gracias Ardogan.
Sigo trabajando con el filtro voy a probar metiendo dos señales aver si es verdad que la elimina, y despues queda una aprte engorrosa...el programarlo en el PIC en ensamblador.


PD. Probe el ponerlo a 0.2 SigmaOrion pero no me filtra nada (vease dibujo), el 1Hz se queda fuera del filtraje.La verdad que usando [0.095 0.2] elimino bastante banda, existe alguna forma de poder afinarlo mejor? puede que usando el filtro de mayor rango no? pero esto significa mas coeficientes, mas carga computacional etc..

Saludos.
 

Adjuntos

  • filtro2_550.jpg
    filtro2_550.jpg
    79 KB · Visitas: 10
Mariano (SigmaOrion), un ejemplo de promedio ponderado:

Código:
X[n] = X[n]+ (X[n-1]/2) + (X[n-2]/4) + (X[n-3]/8) + ...

y puedes seguir pero mas de 4 niveles no tiene sentido porque son despreciables.

Asi logras una muestra, mas la mitad anterior, mas la mitad de la mitad de la anterior...and so on...
 
Gracias Javier por la aclaración. Se podría hacer una simulación en MATLAB o algo, eso sería un filtro FIR, no? voy a ver si puedo simularlo, el único inconveniente que creo que podría tener es que es pasabajos y para eliminar la señal de 1Hz va a tener mucho retardo (eso ya lo dijo Eduardo por la primera o segunda página).

Volviendo al filtro notch, disculpame, 0.2 corresponde justamente a 1Hz, quise decir 0.3 que es 1.5Hz. Acá te adjunto el resultado de filtrar la señal:

x = sin(2*pi*1*t) + sin(2*pi*0.2*t)

con dos filtros notch centrados en 1Hz pero con distintos anchos de banda. Usando 10Hz de frecuencia de muestreo como dijiste arriba.

1) filtro [0.133 .3].jpg es el filtro con cortes en 0.665Hz y 1.5Hz
2) filtro [0.167 .24].jpg es el filtro con cortes en 0.835Hz y 1.2Hz

Fijate que los resultados de los dos son muy bueno, la línea roja es la filtrada. Se ve que la de 1Hz se rechazó bien y la de 0.2Hz pasó perfectamente.

Slds...
 

Adjuntos

  • filtro_0133_03_460.jpg
    filtro_0133_03_460.jpg
    49.6 KB · Visitas: 293
  • filtro_0167_024_542.jpg
    filtro_0167_024_542.jpg
    50.7 KB · Visitas: 292
Se ve fenomeno SigmaOrion, probaré con el pendulo si realmente lo rechaza en la practica. En cuanto tenga algo nuevo os lo digo.

Saludos y muchas gracias.
 
SigmaOrion dijo:
Ningún problema, helo aquí.

Lo que vas a ver son dos funciones principales:
1) [B,A]=butter(......): en base a los que definas en (....) te devuelve los coeficientes en B y A.
2) y=filter(B,A,x): toma como función de entrada 'x' y le aplica el filtro 'B,A'. Lo guarda en y. Yo hize que x sea un impulso para tener en y la respuesta al impulso del filtro.

Slds...

Mariano

PD: renombrá el archivo a '.m' para usarlo en MATLAB, no sé porqué no me dejaba adjuntarlo con esa extensión.

Te hago una consulta... estoy implementando tambien un filtro digital en un PIC16F877 a 20mhz.
Es un filtro de butterworth pasa bajos, de orden 5 con frecuencia de sampleo de 10Hz y frecuencia de corte de 0,5Hz...
Como hace 2 dias que uso el matlab mucho no caso, pero mi pregunta es la siguiente:
no deberias aplicar la instruccion bilinear para que te de los coeficientes de acuerdo a la frecuencia digital? por ejemplo en mi caso [C,D]=bilinear(A,B,10) ?

Muchas Gracias.
 
Atrás
Arriba