加速度计低通滤波

时间:2011-08-04 13:51:10

标签: iphone ios ios4 accelerometer uiaccelerometer

仍然在BigNerdRanch iOS开发书上。

在Accelerometer章节中,他们首先实现了加速度计跟踪,但它相当跳跃。然后,他们建议通过更改原始代码来应用低通滤波器:

- (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?要获得“更大”的运动?我可以从中得到一些理解,但是使用低通滤波器的第二个代码对我来说完全没有意义。

2 个答案:

答案 0 :(得分:14)

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

在此代码中发生的事情是,您将此时的加速度乘以过滤因子0.1,然后将其添加到上次更新被调用0.9时的过滤加速度。

这几乎是获得新值并将其添加为总accelX的10%,其他90%由前一个值组成,前一个值取决于之前的值,这取决于之前的值等等。这会削减高频值,因为只允许10%的任何更改进入新的accelX值。

0.1的KFilteringFactor使该滤波器切断所有高频。您肯定希望通过更改此值来进行实验,以适合您的特定应用。

答案 1 :(得分:2)

因为你正在阅读Big Nerd Ranch Book - 一个好主意是继续Book's discussion forum

有关详细信息,请查看有关低通滤镜的Wikepedia article

对于另一个过滤示例,请查看Apple的AccelerometerGraph示例

另外 - 想想你是否将kFilteringFactor设为0.2,它将当前值的乘数设为0.8,即1 - 0.2,新值的乘数为2.0,因为它是0.2 x 10

我认为10是提供合理值的缩放因子。