答案 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。