如何计算GPS的移动平均速度?

时间:2011-12-18 21:51:30

标签: android gps

我正在使用GPS开发一个Android应用程序。我想实现一个功能,显示用户在1/5/15分钟内的平均速度。类似于unix上的CPU负载。我可以通过累计逐秒计算的距离并将其除以经过的时间来轻松计算平均值,但我想不出计算移动平均线的聪明方法。

显然,我可以通过每秒将最后一个位置和当前位置之间的距离放在一个数组中,同时删除最旧的值来完成id。

我正在寻找一种巧妙的方法。

2 个答案:

答案 0 :(得分:5)

这是一种非常直接的方法:

如果您每秒采样位置,请在队列中保留901个样本,即15分钟(和1个额外)。 位置0是最近的测量值,实际上是您当前的位置。

对于过去X分钟的平均速度:

s = X * 60;
point1 = postion_queue[0]; // this is your current position
point2 = postion_queue[s]; // this is your position s seconds ago
d = distance_between_points(point1, point2);
speed = d / s;

speed现在是每秒的距离单位,转换为英里/小时,或者每小时你需要的单位。不同的X值可用于1到15分钟之间的任何平均值。

答案 1 :(得分:2)

您需要存储整个时间范围内的所有值,如您所建议的那样。原因是你不知何故需要“忘记”旧值对移动平均线的贡献。如果您不知道这些值在哪里(例如,如果您不存储它们),则不能完全这样做。

在您的情况下,15分钟内每秒1个值相当于15 * 60 = 900个数据点,这应该没问题。

请注意,每次更新时都不需要对整个数组执行求和:您可以根据数据点数,新值和当时“忘记”的值计算新的移动平均值:

new_average = (n * old_average - x_forget + x_new) / n

此处,n是数据点的数量(在您的情况下为900),x_forget是您“遗忘”的值,x_new是最新值。然后从数组前面删除x_forget并在结尾存储x_new。您可能希望使用通过链接列表实现的队列而不是数组。