2011-08-04 30 views
8

Aún en el libro de desarrollo BigNerdRanch para iOS.Filtro de paso bajo del acelerómetro

En el capítulo Acelerómetro, primero implementan el seguimiento del acelerómetro, pero es bastante nervioso. A continuación, sugieren aplicar un filtro de paso bajo para que al cambiar 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: pregunta

- (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]; 
} 

bastante simple: ¿de dónde sacan estos valores? He estado buscando a través de la documentación y he encontrado algo acerca de los filtros 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, intentó por primera vez con ese código y me dio un error (mediante el análisis de mi aplicación) diciendo 'el valor de la izquierda de' * 'es un valor de basura'. El seguimiento de mi acelerómetro tampoco funcionaba.

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 obtener un movimiento 'más grande'? Podría darle sentido a eso, pero el segundo código con filtro de paso bajo no tiene ningún sentido para mí.

+1

Creo que la razón para multiplicar por 10 es que UIAcceleration te devuelve valores en G que 1G es 9.81 metros por segundo por segundo. 10 es una aproximación de 9.81. – SDJMcHattie

Respuesta

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

Qué está sucediendo en este código está multiplicando la aceleración en el momento por el factor de filtrado de 0,1 y después de añadir a la aceleración filtrada de la última vez que una actualización fue llamado por 0,9.

Esto es más o menos conseguir el nuevo valor y añadiendo que el 10% de la AccelX total que el otro 90% está compuesto por el valor anterior, que depende del valor antes de eso, lo que depende del valor antes de eso y por lo en. Esto corta los valores de alta frecuencia, ya que solo permite que el 10% de cualquier cambio pase al nuevo valor de accelX.

El KFilteringFactor de 0.1 hace que este filtro corte todas las frecuencias altas. Definitivamente querrá experimentar cambiando este valor para adaptarse a su aplicación particular.

+0

Muchas gracias por la explicación –

+0

cuál es el significado de la frecuencia de corte en este caso –

2

Dado que está trabajando en el libro Big Nerd Ranch, una buena idea sería continuar al Book's discussion forum.

Para obtener más información, eche un vistazo a Wikepedia article sobre los filtros de paso bajo.

Y para otro ejemplo de filtrado echar un vistazo a AccelerometerGraph ejemplo de Apple

también - creo que si se toma kFilteringFactor a ser de 0,2 que da a los multiplicadores para el valor actual de 0,8 que es 1 - 0,2, y el 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.

+0

Gracias. Revisé el foro pero no encontré nada sobre el filtro de paso bajo. El artículo de la wiki es demasiado avanzado para mí, no entiendo nada de eso ... Veré el ejemplo de Apple, quizás aclare las cosas. Gracias de nuevo. – cabaret

Cuestiones relacionadas