加速度计的低通滤波器
本文关键字:低通滤波器 加速度计 | 更新日期: 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