¿Cómo filtrar DSP una señal que tiene una base de tiempo variable?

0

Estoy midiendo la frecuencia en un microcontrolador midiendo el tiempo entre pulsos en una entrada.

la teoría del filtro DSP requiere que la base de tiempo de una señal de entrada sea regular, por ejemplo, Filtros IIR y FIR. Pero la base de tiempo de esto es irregular por su naturaleza (si tengo una señal de 1kHz, obtengo 1k puntos de datos por segundo, si estoy corriendo a 20Hz, obtengo 20 puntos de datos por segundo). He considerado varios métodos no lineales en los que, dependiendo de la frecuencia, cambia la técnica de filtrado, pero no estoy enamorado de esta idea. ¿Existe una familia de algoritmos de filtro para resolver este tipo de problema? Si es así, ¿cómo se llaman?

    
pregunta Bob

2 respuestas

2

Piense en lo que significa cada pulso de entrada. Es una vez el ciclo de su forma de onda de entrada. Pero no solo eso, es toda la información que tiene disponible.

Cree un reloj regular, un pulso de muestreo regular en su DSP para ejecutar su filtro. Esto debe ser más rápido que la frecuencia más alta que muestrea. Si 1kHz es la frecuencia más alta que mide, entonces 2kHz sería una tasa de muestreo razonable.

En cada intervalo de muestreo, ha tenido un ciclo de entrada, por lo que la frecuencia para ese intervalo es 1, eso es un ciclo por intervalo, o no, una frecuencia de cero.

Por ejemplo, si tuviera una señal de entrada de 500Hz con un reloj de muestreo interno de 2kHz, sus datos se verían como 0, 1, 0, 0, 0, 1, 0 ...

La densidad de 1s es la frecuencia, pero en este momento es muy ruidosa y debe filtrarse en paso bajo. Una vez que haya filtrado el paso bajo lo suficientemente bien, obtendría 0.25, 0.25, 0.25, lo que indica que la frecuencia de entrada es 0.25 de su tasa de muestreo.

Como necesitará una constante de tiempo relativamente larga, un filtro IIR parece ser una buena apuesta. También puede probar un filtro CIC (Hogenhaur) si quisiera usar un FIR implementado recursivamente.

Como ha usado toda la información en la señal de entrada, esto es tan bueno como se obtiene con un filtro lineal. Todo lo que puede hacer es cambiar entre un filtro de muy baja frecuencia con un largo retraso o un filtro de banda más ancha con menos retraso.

Sin embargo, es posible que pueda mejorar un poco las cosas subjetivamente con una etapa de preprocesamiento no lineal antes de su filtro de paso bajo.

Podría hacer una retención de primer orden en los datos del borde. En lugar de cambiar 1s y 0s en su filtro, puede cambiar en 1 / Ns, donde N es el número de pulsos de muestreo que han transcurrido desde el último borde de entrada. Esto introducirá una respuesta de frecuencia, pero sospecho que no importará en su aplicación bruta.

Por ejemplo, si la frecuencia fuera de 1kHz y luego cambiara repentinamente a 500Hz, la entrada a su filtro sería 0.5, 0.5, 0.25, 0.25, 0.25, 0.25. Observe que dos ciclos de 0.5 y cuatro ciclos de 0.25 suman ambos a 1 borde de reloj de entrada. Ahora el filtro está comenzando con una señal "más agradable".

Este método podría producir errores bastante graves si la frecuencia cambia repentinamente hacia abajo. Por ejemplo, después de dos impulsos separados por 1 ms, por lo que al generar 0.5 en el filtro, el siguiente impulso tarda 1 segundo en llegar. Para todo ese segundo, la estimación de frecuencia es demasiado alta. Esto podría ser mitigado por a) una vez que haya emitido el valor de un ciclo completo de datos de frecuencia y el siguiente pulso no haya llegado, cambie a cero o b) una vez que el retraso exceda 1 / the_output, cambie a salida 1 / retraso desde el último pulso . Esto tampoco es correcto, pero tiene menos latencia que no hacerlo y es más suave que (a).

Depende de las cualidades que desee en su salida final filtrada, desea que se vea bonita o desea que sea "correcta" en algún sentido del procesamiento de la señal. Mágicamente no puede crear información de la nada, y las llegadas de su pulso han limitado severamente la información disponible para usted. Solo puedes hacer con estos datos lo mejor que puedas.

    
respondido por el Neil_UK
0

Está muestreando una serie de períodos de tiempo y luego calcula la frecuencia como 1 / período. ¿Qué tal si se toma un promedio móvil de los últimos N períodos de tiempo ponderados y luego se calcula 1 / promedio?

Esto tiene la ventaja de no incluir suposiciones sobre la frecuencia subyacente y también es fácil de calcular. Todavía tiene la desventaja de "retrasar" la entrada. Para evitarlo, creo que tienes que introducir muestras "virtuales": un temporizador que dice "Esperaba un pulso por ahora pero no tengo uno, ¿cuál sería la frecuencia si recibiera un pulso ahora?"

    
respondido por el pjc50

Lea otras preguntas en las etiquetas