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

4

2 回答 2

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

在这段代码中发生了什么,您将此刻的加速度乘以过滤因子 0.1,然后将其添加到上次调用更新时的过滤加速度 0.9。

这几乎是获取新值并将其添加为总 accelX 的 10%,另外 90% 由先前的值组成,这取决于之前的值,这取决于之前的值等等。这会消除高频值,因为仅允许 10% 的任何更改通过新的 accelX 值。

0.1 的 KFilteringFactor 使该滤波器滤除所有高频。您肯定会希望通过更改此值来进行试验以适应您的特定应用程序。

于 2012-02-10T18:55:39.960 回答
2

由于您正在阅读 Big Nerd Ranch Book - 一个好主意是继续阅读本书的讨论论坛

有关更多信息,请查看有关低通滤波器的维基百科文章。

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

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

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

于 2011-08-04T13:54:10.257 回答