2011-08-04 607 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