2011-08-04 256 views
8

仍然在BigNerdRanch iOS開發手冊上。加速度傳感器低通濾波

在加速度計章節中,他們首先實現了加速度計跟蹤功能,但它相當不穩定。然後,他們建議通過改變原始代碼到一個低通濾波器,適用於它:

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

這樣:

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

相當簡單的問題:他們在哪裏,從獲取這些值?我一直在尋找通過的文件,我發現一些關於低通濾波器,這說明下面的代碼:

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

不過,我第一次與該代碼試過,我得到了一個錯誤(通過分析我的應用程序)說''*'的左邊值是垃圾值'。我的加速度計跟蹤也不起作用。

我對這些數值意味着什麼很困惑。例如,在代碼的第一部分,爲什麼他們將加速度值乘以10?爲了獲得更大的運動?我可以理解,但第二代低通濾波器對我來說絕對沒有意義。

+1

我認爲乘以10的原因是UIAcceleration在G中給出了返回值,其中1G是每秒9.81米/秒。 10是9.81的近似值。 – SDJMcHattie

回答

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

什麼在此代碼發生的事情你乘上由濾波係數0.1的瞬間加速,然後將它添加到的最後一次更新被稱爲0.9濾波加速度。

這幾乎可以獲得新值並將其作爲總加速度的10%,其他90%由前一個值組成,這取決於之前的值,這取決於之前的值,所以上。由於只允許任何變化的10%通過新的accelX值,因此可以刪除高頻值。

0.1的KFilteringFactor使這個濾波器切出所有高頻。你一定會想通過改變這個值來適應你的特定應用。

+0

非常感謝您的解釋 –

+0

在這種情況下,截止頻率的含義是什麼 –

2

既然你正在通過大書呆子牧場書 - 一個好主意將是去Book's discussion forum

欲瞭解更多信息,看看有關低通濾波器的Wikepedia article

而用於過濾的另一個例子看看蘋果的AccelerometerGraph例如

而且 - 如果你把kFilteringFactor爲0.2這給乘數的當前值是0.8這是1認爲 - 0.2,新值的倍數爲2.0,因爲它是0.2 x 10

我想10是給出合理值的縮放因子。

+0

謝謝。我檢查了論壇,但沒有關於低通濾波器。這篇wiki文章對我來說太過先進了,我不明白其中的任何內容。我會看看蘋果的例子,或許它清理了一些東西。再次感謝。 – cabaret