加速度计的低通滤波器

本文关键字:低通滤波器 加速度计 | 更新日期: 2023-09-27 17:50:25

我正在使用c#为windows phone创建一个应用程序,该应用程序使用加速器,但在屏幕上显示时并不流畅。我只需要移动y轴。我在微软网站上看到过这个公式,但我不确定我应该如何使用它

O = O-1 + α(I – O-1)

其中O为输出,α为系数,I为输入(原始值)

我如何在我的代码中实现这个呢?

private void UpdateUI(AccelerometerReading accelerometerReading)
{
    statusTextBlock.Text = "getting data";
    Vector3 acceleration = accelerometerReading.Acceleration;
    // Show the numeric values on screen.
    yTextBlock.Text = "Y: " + acceleration.Y.ToString("0.00");
    //low pass filter
    //????
    //move ball on screen
    var TopMar = (278.5*acceleration.Y)+278.5;
    var BotMar = 557 - TopMar;
    yDot.Margin = new Thickness(203, BotMar, 203, TopMar);
}

加速度计的低通滤波器

如果Vector3重载了操作符,则应该:

private Vector3 MeanAcceleration = null;
private void UpdateUI(AccelerometerReading accelerometerReading)
{
    const double alpha = 0.05;
    statusTextBlock.Text = "getting data";
    Vector3 acceleration = accelerometerReading.Acceleration;
    // Show the numeric values on screen.
    yTextBlock.Text = "Y: " + acceleration.Y.ToString("0.00");
    //low pass filter
    if (MeanAcceleration == null)
        MeanAcceleration = acceleration;
    else
        MeanAcceleration = (1 - alpha) * MeanAcceleration + alpha * acceleration;
    //move ball on screen
    var TopMar = (278.5 * MeanAcceleration.Y) + 278.5;
    var BotMar = 557 - TopMar;
    yDot.Margin = new Thickness(203, BotMar, 203, TopMar);
}

您需要一个字段(或类似范围的东西)并为其分配平均值。每个时间步,你更新这个平均值。

Alpha必须在0和1之间,以有效地低通信号,它应该是0.1或更低。如果输出太摇摆,减少这个,如果输出太慢,增加alpha。如果两者都是,你可能需要一个更复杂的数字滤波器。

如果开头不重要,你可以用像

这样的东西初始化平均值

private Vector3 MeanAcceleration = new Vector3(0,0,0);

但我不确定构造函数,因为我不知道确切是哪个Vector3