加速度计低通滤波

发布于 2024-11-27 16:22:59 字数 1572 浏览 0 评论 0原文

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

Still on the BigNerdRanch iOS Development book.

In the Accelerometer chapter, they first implement accelerometer tracking but it's fairly jumpy. They then suggest to apply a low pass filter to it by changing the original code:

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

to this:

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

Fairly simple question: where do they get these values from? I've been looking through the documentation and I found something about low pass filters, which suggests the following code:

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

However, I first tried with that code and I got an error (by analyzing my app) saying 'the left value of '*' is a garbage value'. My accelerometer tracking didn't work either.

I'm fairly confused as to what these values mean. For example, in the first part of the code, why do they multiply the acceleration values by 10? To get a 'bigger' movement? I could make some sense out of that, but the second code with the low pass filter makes absolutely no sense to me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

枯叶蝶 2024-12-04 16:22:59
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));

这段代码中发生的情况是,您将当前的加速度乘以过滤因子 0.1,然后将其添加到上次调用更新时的过滤加速度 0.9 中。

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

KFilteringFactor 为 0.1 使该滤波器滤除所有高频。您肯定会想尝试更改此值以适合您的特定应用程序。

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

Whats happening in this code you are multiplying the acceleration at the moment by the Filtering factor 0.1 and then adding it to the filtered acceleration of the last time an update was called by 0.9.

This is pretty much getting the new value and adding it as 10% of the total accelX the other 90% is made up of the previous value which depends on the value before that, which depends on the value before that and so on. This cuts out high frequency values as only allows 10% of any change to go through to the new accelX value.

The KFilteringFactor of 0.1 makes this filter cut out all high frequencies. You will definitely want to experiment by changing this value to suit your particular application.

自控 2024-12-04 16:22:59

由于您正在阅读《Big Nerd Ranch》一书 - 一个好主意是继续阅读 图书讨论论坛

有关详细信息,请参阅有关低通滤波器的维基百科文章

有关过滤的另一个示例,请查看 Apple 的 AccelerometerGraph 示例

另外 - 想想如果您将 kFilteringFactor 设置为 0.2,则当前值的乘数为 0.8,即 1 - 0.2,并且乘数为新值是 2.0,因为它是 0.2 x 10

我想 10 是给出合理值的缩放因子。

Since you're working through the Big Nerd Ranch Book - a good idea would be to go on to the Book's discussion forum.

For more information have a look at the Wikepedia article about low pass filters.

And for another example of filtering have a look at Apple's AccelerometerGraph example

Also - think if you take kFilteringFactor to be 0.2 which gives the multipliers for the current value to be 0.8 which is 1 - 0.2, and the multiplier for the new value is 2.0 because it's 0.2 x 10

I suppose 10 is the scaling factor to give reasonable values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文