2011-12-18 5 views
1

Я разрабатываю приложение для Android с помощью GPS. Я хотел бы реализовать функцию, которая отображает среднюю скорость пользователей за 1/5/15 минуту. Что-то вроде загрузки процессора на unix. Я могу легко вычислить среднее значение, умножив пройденное расстояние на секунду и разделив его на прошедшее время, но я не могу придумать разумный способ вычисления скользящей средней.Как рассчитать скользящую среднюю скорость от GPS?

Очевидно, что я могу получить идентификатор, помещая расстояние между последней и текущей позицией в массиве каждую секунду при удалении самого старого значения.

Я ищу аккуратный способ сделать это.

ответ

2

Вам необходимо будет сохранить все значения за весь промежуток времени, как вы уже сказали. Причина в том, что вам как-то нужно «забыть» вклад старых значений в скользящую среднюю. Вы не можете сделать это точно, если не знаете, что эти значения, где (т. Е. Если вы их не храните).

В вашем случае 1 значение в секунду в течение 15 минут составляет 15 * 60 = 900 точек данных, это должно быть ОК.

Обратите внимание, что вам не нужно выполнять сумму по всему массиву каждый раз, когда вы обновляете: вы можете рассчитать новое скользящее среднее из числа точек данных, нового значения и значения, которое вы «забываете» при этом момент:

new_average = (n * old_average - x_forget + x_new) 

Здесь n это количество точек данных (900 в вашем случае), x_forget это значение вы «забывают» и x_new является последним значением. Затем вы опускаете x_forget с передней части своего массива и храните x_new в конце. Вместо массива вы можете использовать очередь, реализованную через связанный список.

4

Heres один способ это сделать, что это довольно прямо вперед:

Если вы выборки позиции каждый второй держать 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 минут.

Смежные вопросы