Soy un ingeniero de software experimentado y estoy trabajando en sensores de teléfonos inteligentes. He tomado clases fundamentales de EE en DSP y estoy tratando de aplicar mis conocimientos. Creo que entiendo la convolución, las funciones de transferencia, la transformación z, etc. Sé un poco sobre los filtros FIR y IIR.
Ahora, al leer las API y la documentación del software, veo que las personas están aplicando un LPF a los datos del sensor en el dominio del tiempo. Sé que lo hace a través del uso de ecuaciones de diferencia (por ejemplo, y [i] = y [i-1] + 2 * x [i]), pero aprendí en mi clase de EE que los LPF generalmente se aplican a través de la operación de convolución donde convoluciona la señal de tiempo con los coeficientes de una onda sinc (por ejemplo) y con una frecuencia de corte específica. Entonces, el uso coloquial del "filtro de paso bajo" no es lo suficientemente exacto para mí.
Por ejemplo, la API de Google Android tiene esta documentación: http://developer.android.com/reference/android/hardware/SensorEvent.html#values
public void onSensorChanged(SensorEvent event)
{
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final float alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
¿Cómo interpreto ese filtro de paso bajo? ¿Cuál es la frecuencia de corte? ¿Cuál es el ancho de banda de transición? ¿Están usando este LPF únicamente para hacer promedios?
fuente
Respuestas:
El filtro en su ejemplo es un filtro de respuesta de impulso infinito (IIR) de primer orden . Su función de transferencia es:
que corresponde a una ecuación de diferencia de:
A partir del ejemplo, supongo que este filtro se está utilizando para suavizar el ruido de alta frecuencia de una serie temporal de mediciones de un sensor, tratando de detectar una señal de interés de frecuencia relativamente baja. Esta sería una aplicación muy típica para este tipo de filtro.
En su otra subpregunta, tiene razón en que el filtrado a menudo se implementa a través de la convolución de la señal de entrada con la respuesta de impulso del filtro. En la mayoría de los casos, esto solo se hace con filtros de respuesta de impulso finito (FIR) . Los filtros IIR como este generalmente se implementan utilizando la ecuación de diferencia del filtro; Como la respuesta de impulso de un sistema IIR es infinitamente larga, debe truncarla a una longitud finita para hacer que la convolución sea manejable, en cuyo punto el filtro ya no es IIR. El formato de ecuación de diferencia es casi siempre más barato de implementar computacionalmente, aunque la retroalimentación inherente a esa estructura puede conducir a problemas numéricos que deben abordarse (como el desbordamiento interno y la acumulación de errores de redondeo).
fuente
Para resumir, los filtros IIR basados en modelos físicos idealizados simples, como un filtro RC, tienen una pequeña cantidad de polos y ceros y, por lo tanto, generalmente se implementan como una ecuación de diferencia, ya que una pequeña cantidad de polos o ceros implica muy pocas operaciones aritméticas. por muestra usando una ecuación de diferencia.
Como un IIR implica una respuesta de impulso de longitud infinita, la convolución requeriría una computación para siempre, o el uso de una aproximación.
Los filtros FIR generalmente se implementan por convolución con la respuesta de impulso de longitud finita (o por convolución rápida FFT si el filtro es lo suficientemente largo para que sea computacionalmente eficiente). Este tipo de filtros se utilizan con mayor frecuencia cuando se puede aproximar una especificación de respuesta de frecuencia deseada con una respuesta de impulso de longitud finita, en lugar de saber dónde podrían ubicarse los polos y ceros del plano Z.
Sin embargo, dado que un filtro con una especificación nítida implica una larga convolución FIR, la implementación de los filtros FIR puede ser mucho más lenta, y la configuración puede involucrar muchas más líneas de código, lo que puede ser la razón por la cual los filtros FIR no se pueden usar con tanta frecuencia en software simple ejemplos
fuente
Me encuentro volviendo a esta publicación una y otra vez. Gracias por hacer la pregunta. Aquí hay una excelente implementación computacionalmente amigable del integrador con fugas en C (destinado a un microcontrolador).
Primero, algunos reordenamientos: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last
si restringimos α a aproximadamente 12%, 25%, 50%, (1/8, 1/4, 1/2, ...). Podemos aprovechar algunos cambios de bits eficientes. Tomando el caso de 1/8, 8 => 2 ^ 3 => (cambio descendente 3 veces)
= (x - y_last) / 8 + y_last
Espero eso ayude.
fuente