Friday 22 March 2019

Acelerômetro médio em movimento


Um filtro simples, de um único pólo, de passagem baixa, recursivo IIR é rápido e fácil de implementar, e. Onde x, y são os sinais do acelerômetro XY brutos (não filtrados), xf, yf são os sinais de saída filtrados e k determina a constante de tempo dos filtros (tipicamente um valor entre 0,9 e 0,9999) onde k maior significa uma constante de tempo mais longa ). Você pode determinar k de forma empírica, ou se você conhece sua freqüência de corte requerida, Fc. Então você pode usar a fórmula: onde Fs é a taxa de amostragem. Note que xf, yf são os valores anteriores do sinal de saída no RHS e os novos valores de saída no LHS da expressão acima. Observe também que estamos assumindo aqui que você estará amostragem dos sinais do acelerômetro em intervalos de tempo regulares, p. A cada 10 ms. A constante de tempo será uma função de k e desse intervalo de amostragem. Escrevi uma atividade simples que é SensorEventListener para Sensor. TYPEACCELEROMETER. No meu evento onSensorChanged (evento SensorEvent), eu simplesmente escolho os valores no formato X, Y, Z e escreva-os para um arquivo. Adicionado a este X, Y, Z é um rótulo, o rótulo é específico para a atividade que estou realizando. Então, o seu rótulo X, Y, Z, como esse, eu obtenho meu perfil de atividade. Gostaria de ter sugestões sobre as operações a serem executadas após a coleta de dados, de modo a remover o ruído e obter os melhores dados para uma atividade. A intenção principal desta coleção de dados é construir um aplicativo de detecção de atividade do usuário usando a biblioteca de rede neural (NeuroPh para Android) Link. Perguntou 6 de maio 13 às 4:49 Apenas por diversão eu escrevi um pedômetro algumas semanas atrás, e teria sido capaz de detectar as três atividades que você mencionou. Faça as seguintes observações: Além do Sensor. TYPEACCELEROMETER. O Android também possui Sensor. TYPEGRAVITY e Sensor. TYPELINEARACCELERATION. Se você registrar os valores de todos os três, observe que os valores de TYPEACCELEROMETER são sempre iguais à soma dos valores de TYPEGRAVITY e TYPELINEARACCELERATION. O método onSensorChanged () primeiro fornece TYPEACCELEROMETER, seguido de TYPEGRAVITY e TYPELINEARACCELERATION, que são os resultados de sua metodologia interna de dividir as leituras do acelerômetro na gravidade e a aceleração não devido à gravidade. Dado que você está interessado na aceleração devido às atividades, ao invés da aceleração devido à gravidade, você pode achar que TYPELINEARACCELERATION é melhor para o que você precisa. Independentemente dos sensores que você usa, o X, Y, Z que você está medindo dependerá da orientação do dispositivo. No entanto, para detectar as atividades que você menciona, o resultado não pode depender, p. Se o usuário está segurando o dispositivo em uma posição de retrato ou paisagem, ou se o dispositivo é plano ou vertical, então os valores individuais de X, Y e Z não serão usados. Em vez disso, você deve olhar para o comprimento do vetor, ou seja, sqrt (X XY YZ Z), que é independente da orientação do dispositivo. Você só precisa suavizar os dados se você estiver alimentando isso em algo que é sensível ao ruído. Em vez disso, eu digo que os dados são os dados, e você obterá os melhores resultados se você usar mecanismos que não sejam sensíveis ao ruído e, portanto, não precisam ser alisados. Por definição, o liso é descartar dados. Você deseja projetar um algoritmo que leve dados nois em uma extremidade e emita a atividade atual na outra extremidade, então não prejudique se é necessário incluir o alisamento como parte desse algoritmo. Aqui está um gráfico de sqrt (X XY YZ Z) Do Sensor. EDPE ACCELEROMETER que gravei quando construí meu pedômetro. Os gráficos mostram as leituras medidas quando andei por 100 passos. A linha verde é sqrt (X XY YZZ), a linha azul é uma média móvel ponderada exponencialmente da linha verde que me dá o nível médio da linha verde e a linha vermelha mostra as etapas de minha contagem de algoritmo. Eu consegui contar os passos apenas procurando o máximo e mínimo e quando a linha verde cruza a linha azul. Eu não usei qualquer suavização ou Fast Fourier Transforms. Na minha experiência, para este tipo de coisa, os algoritmos mais simples muitas vezes funcionam melhor, porque, embora algumas complexas possam funcionar em algumas situações, é mais difícil prever como se comportam em todas as situações. E a robustez é uma característica vital de qualquer algoritmo :-). Respondeu 14 de maio 13 às 9:32 A caminhada é a atualização regular com picos e calhas, como mostrado. O papelado é quando não há nenhum movimento afastado da média, e mão é quando há movimentos irregulares que não seguem o padrão de caminhada. Em qualquer caso, se você apenas medir um sensor e não deseja que seus resultados sejam sensíveis à forma como o dispositivo está sendo mantido, sqrt (X2Y2Z2) é a única entrada com a qual você pode trabalhar. Para obter mais informações, você precisaria usar outros sensores. Ndash Stochastically 14 de maio 13 às 18:39 Isso parece um problema interessante. Você planejou seus dados contra o tempo para ter uma idéia disso, para ver o tipo de ruído que você está lidando e para ajudar a decidir como você pode processar Seus dados para entrada no ID do detector começam com linhas para cada atividade: Axe Ay Az Vx Vy Vz (aproximado por área de cálculo de trapezoids formada por seus pontos de dados). Etc Talvez você possa resolver a orientação do telefone tentando detectar a gravidade e, em seguida, rote seus vetores para uma orientação padrão (por exemplo, o eixo Z positivo para cima). Se você pode fazer isso, os diferentes eixos podem se tornar mais significativos. Por exemplo, andar (no bolso) tende a ter uma velocidade no plano horizontal, que pode ser distinguido do andar (na mão) pelo movimento no plano vertical. Quanto aos filtros, se os dados parecerem ruidosos, um simples ponto de partida é aplicar uma média móvel para suavizar. Esta é uma técnica comum para os dados do sensor em geral. Além disso, esta publicação parece relevante para sua pergunta: Coisas identificadas por mim: os dados devem ser pré-processados ​​como e como você precisa, no meu caso, eu apenas quero 3 entradas e Uma saída Os dados devem ser submetidos a Suavização (suavização de cinco pontos ou qualquer outra técnica que lhe forneça o melhor) Referência. Então, o Ruído é filtrado (não completamente embora). A média móvel é uma das técnicas Os dados linearizados seriam bons, porque você não tem idéia de como os dados foram amostrados, Use a interpolação para ajudá-lo a Linearizar os dados. Finalmente use FFT (Fast Fourier Transform) para extrair a receita do prato , Que é para extrair recursos fora do seu conjunto de dados 13 de maio de 13 às 6:42 Sua resposta 2017 Stack Exchange, IncAveraging Filter Este exemplo mostra o fluxo de trabalho recomendado para gerar código C de uma função MATLAB usando o comando codegen. Estas são as etapas: 1. Adicione a diretiva do codegen à função MATLAB para indicar que ela se destina a geração de código. Esta diretiva também permite que o analisador de código MATLAB identifique avisos e erros específicos para MATLAB para geração de código. 2. Gerar uma função MEX para verificar se o código MATLAB é adequado para geração de código. Se ocorrerem erros, você deve corrigi-los antes de gerar o código C. 3. Teste a função MEX no MATLAB para garantir que seja funcionalmente equivalente ao código MATLAB original e que não ocorrem erros de tempo de execução. 4. Gerar código C. 5. Inspecione o código C. Pré-requisitos Não há pré-requisitos para este exemplo. Criar uma nova pasta e copiar arquivos relevantes O código a seguir criará uma pasta na sua pasta de trabalho atual (pwd). A nova pasta apenas conterá os arquivos relevantes para este exemplo. Se você não quiser afetar a pasta atual (ou se você não pode gerar arquivos nesta pasta), você deve mudar sua pasta de trabalho. Comando Executar: Crie uma Nova Pasta e Copie Arquivos Relevantes Sobre a Função de Filtragem de média A função de média de filtragem. m atua como um filtro de média no sinal de entrada, ele toma um vetor de valores de entrada e calcula uma média para cada valor no vetor. O vetor de saída é do mesmo tamanho e forma que o vetor de entrada. A diretiva de compilação do codegen indica que o código MATLAB destina-se a geração de código. Crie alguns dados de amostra Gerar uma onda seno ruidosa e traçar o resultado. Gerar uma função MEX para testes Gerar uma função MEX usando o comando codegen. O comando codegen verifica se a função MATLAB é adequada para geração de código e gera uma função MEX que você pode testar no MATLAB antes de gerar código C. Como C usa tipagem estática, codegen deve determinar as propriedades de todas as variáveis ​​nos arquivos MATLAB em tempo de compilação. Aqui, a opção de linha de comando - args fornece um exemplo de entrada para que o codegen possa inferir novos tipos com base nos tipos de entrada. Usando o sinal de amostra criado acima como o exemplo de entrada garante que a função MEX possa usar a mesma entrada. Por padrão, codegen gera uma função MEX chamada médiafiltermex na pasta atual. Isso permite que você teste o código MATLAB e a função MEX e compare os resultados. Teste a função MEX no MATLAB Execute a função MEX no MATLAB Cria o código C Inspecione o código gerado O comando codegen com a opção - config coder. config (lib) gera o código C empacotado como uma biblioteca C autônoma. O código C gerado está na pasta codegenlibaveragingfilter. Os arquivos são: Inspecione o código C para a média do filtro. c Função Selecione seu país

No comments:

Post a Comment