"Filtro de paso bajo" en contextos API de software que no son EE


12

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?


bueno, me molesta también
Sibbs Gambling

Respuestas:


11

El filtro en su ejemplo es un filtro de respuesta de impulso infinito (IIR) de primer orden . Su función de transferencia es:

H(z)=1α1αz1

que corresponde a una ecuación de diferencia de:

y[n]=αy[n1]+(1α)x[n]

x[n]y[n]

αα[0,1)α=0αα=1

α1α

α=0.8ingrese la descripción de la imagen aquí

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).


¡Gracias! Algunas preguntas de seguimiento: (1) Dijiste que tu ecuación H (z) = ... es una ecuación de diferencia; Es realmente una función de transferencia, ¿verdad? Pensé que una ecuación de diferencia es estrictamente para el dominio del tiempo. (2) En su integrador con fugas, ¿corresponde 1.0 a samples_frequency / 2 (como en Matlab)? (3) Con respecto a FIR vs IIR, ¿tengo entendido que la ecuación de diferencia de IIR se puede aplicar en O (N) pero la convolución es O (N ^ 2) u O (N lgN) con convolución basada en FFT? (4) ¿Puede recomendar un libro para programadores de software para implementar estas ideas DSP? Como lo que está haciendo el ejemplo del código de Android.
stackoverflowuser2010

π+πO(N)NN

Sé que (i) aplicar la ecuación de diferencia es O (N). Pero pensé que (ii) la operación de convolución que usa la suma sobre multiplicar y agregar (songho.ca/dsp/convolution/convolution.html) es O (N ^ 2) u O (N lgN) con una implementación basada en FFT . En todos los casos, N es el orden del filtro, donde supongo que el orden del filtro y la longitud de la señal de tiempo son del mismo orden de magnitud (por ejemplo, ambos 256). Entonces, ¿no son (i) y (ii) diferentes? Además, vi ese libro de Lyons en Amazon.com, pero esperaba algo escrito más para los programadores de software C / Java.
stackoverflowuser2010

1
O(N) NO(N2)MNO(MN)MN
Jason R

O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

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


0

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

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

Espero eso ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.