Saturday 25 November 2017

Gps Moving Average


Estou desenvolvendo uma aplicação Android usando o GPS. Gostaria de implementar um recurso que exibisse a velocidade média dos usuários ao longo dos 1515 minutos. Algo como a carga da CPU no Unix. Eu posso calcular a média facilmente, acumulando a distância percorrida segundo a segundo e dividindo-a pelo tempo decorrido, mas não consigo pensar em uma maneira inteligente de calcular a média móvel. Obviamente, eu posso obter o ID feito, colocando a distância entre a última e a atual posição em uma matriz a cada segundo ao excluir o valor mais antigo. Estou procurando uma maneira limpa de fazer isso. Solicitado 18 de dezembro às 21:51 Você precisará armazenar todos os valores para todo o período de tempo, como você já sugeriu. A razão é que você de alguma forma precisa esquecer as contribuições dos valores antigos para a média móvel. Você não pode fazer isso exatamente se você não sabe quais são esses valores (ou seja, se você não os armazena). No seu caso, 1 valor cada segundo por 15 minutos equivale a 15 60 900 pontos de dados, isso deve estar OK. Observe que você não precisa realizar uma soma em toda a matriz sempre que você atualizar: você pode calcular a nova média móvel a partir do número de pontos de dados, o novo valor e o valor que você está esquecendo nesse momento: Aqui, n é O número de pontos de dados (900 no seu caso), o xforget é o valor que você está esquecendo e xnew é o valor mais recente. Você então solta o xforget da frente da sua matriz e armazena o xnew no final. Em vez de uma matriz, você pode querer usar uma fila implementada através de uma lista vinculada. Respondeu 18 de dezembro 11 às 22:24 Heres um caminho a seguir sobre isso que é bastante simples: se você é a posição de amostragem a cada segundo, mantenha 901 amostras em uma fila, isso é 15 minutos (e 1 extra). Posição 0 é a medida mais recente, efetivamente sua posição atual. Para uma velocidade média nos últimos X minutos: a velocidade é agora unidades de distância por segundo, converte para mph, ou kph ou quaisquer unidades que você precisar. Diferentes valores de X podem ser usados ​​para qualquer média entre 1 e 15 minutos. Respondido 18 de dezembro às 22:20 Sua resposta 2017 Stack Exchange, Inc É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Achei que posso otimizar um pouco, escolhendo um tamanho de janela que seja um poder de Dois para permitir o deslocamento de bits em vez de dividir, mas não precisar de um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam menores e menores para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento de GPS que escrevi. Comece com 1 amostra e divida em 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou um matemático, mas isso pareceu uma boa maneira de fazê-lo. Achei que isso tornaria o estômago de um verdadeiro matemático, mas, parece ser uma das formas aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que deseja seguir. Isso pode não ser importante na maioria das vezes, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição atual e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondeu 16 de novembro 16 às 23:03 inicialize o total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), um add totalnewValue, um incremento (contagem), uma média de divisão (quantidade total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga e, em seguida, calculando a nova média móvel. Como soma das 4 variáveis ​​de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido em 3 de fevereiro de 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2017 Stack Exchange, Inc

No comments:

Post a Comment