2011-08-04 11 views
8

Nadal w książce rozwojowej BigOberdRanch iOS.Akcelerometr z dolnoprzepustowym filtrem

W rozdziale Przyspieszeniomierz najpierw wprowadzają śledzenie przyspieszeniomierza, ale jest ono dość niespokojne. Następnie proponuję zastosować filtr dolnoprzepustowy do niego poprzez zmianę oryginalnego kodu:

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

do tego:

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

dość proste pytanie: Skąd biorą te wartości od? Szukałem poprzez dokumentacji i znalazłem coś o filtry dolnoprzepustowe, co sugeruje następujący kod:

#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. 
} 

Jednak najpierw próbował z tym kodem i mam błąd (analizując mój app) mówiąc: "lewa wartość" * "to wartość śmieci". Moje śledzenie przyspieszeniomierza również nie działa.

Jestem dość zdezorientowany, co oznaczają te wartości. Na przykład, w pierwszej części kodu, dlaczego mnożą wartości przyspieszenia przez 10? Aby uzyskać "większy" ruch? Mógłbym to zrozumieć, ale drugi kod z filtrem dolnoprzepustowym nie ma dla mnie żadnego sensu.

+1

Myślę, że powodem pomnożenia przez 10 jest to, że UIAcceleration daje wartości z powrotem w G, którego 1G wynosi 9,81 metra na sekundę na sekundę. 10 to przybliżenie 9,81. – SDJMcHattie

Odpowiedz

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

Co się dzieje w tym kodzie mnożą przyspieszenie w tej chwili przez czynnik filtrujący 0,1 a następnie dodanie go do przefiltrowanego przyspieszenia czasu ostatniej aktualizacji została wywołana przez 0,9.

Dosłownie pobiera nową wartość i dodaje ją jako 10% całkowitego accelX, pozostałe 90% składa się z poprzedniej wartości, która zależy od wcześniejszej wartości, która zależy od wcześniejszej wartości. na. Wyklucza to wartości o wysokiej częstotliwości, ponieważ tylko 10% każdej zmiany może przejść do nowej wartości accelX.

KFilteringFactor równy 0,1 powoduje, że filtr wycina wszystkie wysokie częstotliwości. Na pewno będziesz chciał eksperymentować, zmieniając tę ​​wartość, aby dopasować ją do konkretnego zastosowania.

+0

Bardzo dziękuję za wyjaśnienia –

+0

jakie jest znaczenie odcięcia częstotliwości w tym przypadku –

2

Od czasu, gdy pracujesz nad książką o ranczarzu Big Nerd - dobrym pomysłem byłoby przejście na numer Book's discussion forum.

Aby uzyskać więcej informacji, zapoznaj się z informacjami na temat filtrów dolnoprzepustowych pod numerem Wikepedia article.

I kolejny przykład filtrowanie spojrzeć AccelerometerGraph przykład Apple

także - że jeśli wziąć kFilteringFactor do 0.2, co daje mnożników dla aktualnej wartości do 0,8, który wynosi 1 - 0,2, a mnożnik dla nowej wartości to 2,0, ponieważ jest to 0,2 x 10

Przypuszczam, że 10 to współczynnik skalujący, który daje rozsądne wartości.

+0

Dzięki. Sprawdziłem forum, ale nic o filtrze dolnoprzepustowym. Artykuł wiki jest dla mnie zbyt zaawansowany, nie rozumiem żadnego z nich. Sprawdzę przykład Apple'a, być może to wyjaśni. Dzięki jeszcze raz. – cabaret

Powiązane problemy