加速度计低通滤波

仍然在BigNerdRanch iOS开发书上。

在“加速度计”一章中,他们首先实现了加速度计跟踪,但相当令人费解。 然后他们build议通过改变原始码来应用低通滤波器:

- (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? 为了获得“更大”的运动? 我可以从中得出一些道理,但是带低通滤波器的第二个代码对我来说绝对没有意义。

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

在这个代码中发生的事情是,当前加速度乘以过滤因子0.1,然后将其加到最后一次更新被调用0.9的过滤加速度上。

这相当于获得了新的值,并将其作为总加速度的10%,其他90%由之前的值组成,这取决于之前的值,这取决于之前的值,等等。 由于只允许任何变化的10%通过新的加速度值,所以这会切除高频值。

0.1的KFilteringFactor使得这个滤波器全部切出高频。 你一定会想通过改变这个值来适应你的特定应用。

既然你正在通过大书呆子牧场书 – 一个好主意将是去书的讨论论坛 。

有关更多信息,请参阅有关低通滤波器的Wikepedia文章 。

而另一个例子就是过滤一下Apple的AccelerometerGraph例子

另外 – 想想如果你把kFilteringFactor设置为0.2,当前值的乘数为0.8,即1 – 0.2,新值的乘数为2.0,因为它是0.2 x 10

我认为10是给出合理值的比例因子。