用于加速度计的低通滤波器

时间:2014-03-16 14:21:29

标签: c# windows-phone-8 accelerometer lowpass-filter

1 个答案:

答案 0 :(得分:0)

如果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。