Filtrado de paso bajo del acelerómetro

Aún en el libro de Desarrollo de iOS de BigNerdRanch.

En el capítulo Acelerómetro, primero implementan el seguimiento del acelerómetro, pero está bastante nervioso. Luego sugieren aplicarle un filter de paso bajo cambiando el código original:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { HypnosisView *hv = (HypnosisView *)[self view]; [hv setXShift:10.0 * [acceleration x]]; [hv setYShift:10.0 * [acceleration y]]; [hv setNeedsDisplay]; } 

a esto:

 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { HypnosisView *hv = (HypnosisView *)[self view]; float xShift = [hv xShift] * 0.8 + [accel x] * 2.0; float yShift = [hv yShift] * 0.8 + [accel y] * 2.0; [hv setXShift:xShift]; [hv setYShift:yShift]; [hv setNeedsDisplay]; } 

Pregunta bastante simple: ¿de dónde obtienen estos valores? He estado buscando en la documentation y encontré algo sobre los filters de paso bajo, lo que sugiere el siguiente código:

  #define kFilteringFactor 0.1 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { // Use a basic low-pass filter to keep only the gravity component of each axis. accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)); accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)); // Use the acceleration data. } 

Sin embargo, primero probé con ese código y obtuve un error (al analizar mi aplicación) que decía 'el valor de la izquierda de' * 'es un valor de basura'. Mi seguimiento del acelerómetro tampoco funcionó.

Estoy bastante confundido en cuanto a lo que significan estos valores. Por ejemplo, en la primera parte del código, ¿por qué multiplican los valores de aceleración por 10? ¿Para get un movimiento "más grande"? Podría tener un poco de sentido de eso, pero el segundo código con el filter de paso bajo no tiene ningún sentido para mí.

     accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); 

    Lo que está sucediendo en este código está multiplicando la aceleración en este momento por el factor de filtrado 0.1 y luego agregándolo a la aceleración filtrada de la última vez que una actualización fue invocada por 0.9.

    Esto es más o less get el nuevo valor y agregarlo como el 10% del total de acelX, el otro 90% está formado por el valor anterior que depende del valor anterior, que depende del valor anterior y así sucesivamente. Esto recorta los valores de alta frecuencia, ya que solo permite que el 10% de cualquier cambio pase al nuevo valor de acelX.

    KFilteringFactor de 0.1 hace que este filter recorte todas las frecuencias altas. Definitivamente querrás experimentar cambiando este valor para adaptarlo a tu aplicación particular.

    Ya que está trabajando en el libro Big Nerd Ranch, una buena idea sería ir al foro de discusión del Libro .

    Para get más información, consulte el artículo de Wikepedia sobre filters de paso bajo.

    Y para otro ejemplo de filtrado, eche un vistazo al ejemplo de AccelerometerGraph de Apple.

    Además, piense si toma kFilteringFactor para ser 0.2, lo que da a los multiplicadores el valor actual de 0.8, que es 1 a 0.2, y el multiplicador para el nuevo valor es 2.0 porque es 0.2 x 10

    Supongo que 10 es el factor de escala para dar valores razonables.