Saturday 18 November 2017

Mudança média c código avr


Eu tentei alguns técnicos de média em execução para suavizar a alteração nos dados do ADC no AtMega48 para o controle de luzes (PWM) ao girar uma panela (ADC). Os filtros (pseudo-códigos): observei que os filtros são muito agradáveis. Mas lento em resposta, o que é esperado. Estou procurando por técnicas como a média móvel exponencial. Disse ser mais receptivo. Existe outro como este Como ele diz: onde está entre 0 e 1. Como codificar e otimizar esses códigos sábios (sem usar flutuadores) Ou Como eu converteria os flutuadores em números inteiros correspondentes para tornar o código pequeno, rápido e responsivo. E eu mantive1 Outro, então, que não funcionará conforme o esperado. Por Idve mudar todas as variáveis ​​para flutuar. Por favor, não se concentre na seguinte declaração por enquanto, mas observe. Manter flutuadores na minha base de código está preenchendo a memória do programa de 45 a 137, no caso de Você pode implementar com sobrecarga mínima, limitando as frações binárias. Eu usei isso com bons resultados. Pegue o resultado existente, Mude-o N lugares à direita para dividir por 2N Subtrai-lo do resultado existente. Adicionar novos dados Isso não é tão rápido em mudar com uma mudança de etapa nos dados de entrada como você deseja, mas é fácil de implementar e eficaz o suficiente como um filtro em muitos casos. Você pode acelerar sua resposta ao tomar decisões informais quanto ao seu comportamento em casos que são muito diferentes. Por exemplo, mantenha uma contagem de entradas seqüenciais que são mais do que alguns limites diferentes do resultado existente. Se essa contagem ultrapassar algum limiar, altere a proporção de divisão N por algum fator. Por exemplo, N é geralmente 4- os resultados são deslocados para a direita 4 vezes 16 de divisão. Se a entrada for mais que xxx longe da resposta, faça apenas duas mudanças para a direita e multiplique a nova amostra em 4 antes de adicionar. Respondeu 4 de outubro 12 às 6: 08Se você tiver a média de N amostras, simplesmente multiplique a média por N, adicione a nova amostra e divida por N1. Isso não leva você a uma média móvel. Você precisa estar disposto a armazenar 150 amostras. Então, quando você receber uma nova amostra, multiplique a média por 150, subtrai a mais antiga, adicione a mais nova e divida por 150. Coloque o mais novo no buffer de tamanho 150 e remova o mais antigo. Existem outros esquemas que mantêm NAverage o que reduz as multiplicações um pouco. Jim Wagner Oregon Research Eletrônica, Consultoria Div. Tangente, OU, EUA orelectronics Kleinstein Nível: Postando Freak Registrado: Sáb. 22 de setembro de 2007 Postado por Kleinstein. Dom. 18 de janeiro de 2009 - 04:34 PM Não há nenhuma maneira de salvar as últimas amostras de N (aproximadamente 150) se necessário a média móvel real para cada posição. 150 Samles ainda devem se encaixar na RAM. Você pode salvar as multiplicações no entanto. Adicione a nova amostra e resuma o último a cair. Em seguida, divida a soma por N para o resultado e mantenha a soma para o próximo passo. Devision fica muito mais fácil se você puder usar 128 amostras. Nível: 10k Postman Registrado: Sáb. 12 de fevereiro de 2005 Localização: Wormshill, Inglaterra Postado por david. prentice. Dom. Jan 18, 2009 - 04:51 PM amostras totais médias. Newaverage (total novo) (amostras 1) Se você está preocupado em reportar uma média válida até que o número de amostras seja 150, você acaba de atrasar seu relatório até ser válido. 16000 amostras de ints regulares caberão facilmente em um total longo. Você divide quando é solicitado que você relate o valor médio. Alternativamente, você calcula a média e redefine o total a cada 150 amostras. Você relata esta média até o próximo cálculo. Um pouco como a velocidade no meu computador do ciclo. A roda dianteira tem que fazer mais de uma revolução antes que a velocidade possa ser calculada. Curtvm Nível: Raving Lunatic Registrado: Qua. 21 de setembro de 2005 Publicado por curtvm. Seg. 19 de janeiro de 2009 - 04:40 (isso é semelhante à idéia Kleinsteins). Nível: 10k Postman Registrado em: Mon. 19 de fevereiro de 2001 Localização: Wisconsin EUA Postado por theusch. Seg. 19 de janeiro de 2009 - 02:58 PM Por natureza da descrição, média móvel em uma grande quantidade de amostras, o sinal é lento. Se eu tivesse que generalizar meus aplicativos, típico é fechar o loop a cada 500ms. Eu tenho o ADC tomando uma amostragem contínua (interrompida) de todas as amostras AD usadas armazenando a leitura bruta em uma matriz. Cada 10ms uma ou mais conversões foram feitas em cada canal. (Com um clock de 57600 ADC que é 226usconversão com sobrecarga ISR talvez 250us, então cerca de 40 conversões a cada 10 ms.) No ponto 10 ms, adiciono o valor bruto que representa o resultado de conversão mais recente para um total para cada canal. Cada 500ms, a média é usada para fechar o loop do aplicativo. Isso funciona bem para sinais de movimento lento, como termistores, leituras de tração de corrente e tensões de controle. A soma da média tira muito do ruído e as leituras são tipicamente rígidas. (Tem havido muitos tópicos sobre observação de bobble nas leituras de ADC). Observe que usar a soma, em vez da média, preserva mais alguns bits baixos, mas pisa - mesmo um sinal de movimento lento pode começar a mudar em um segmento de Que 500ms, então, qual é o ponto Agora, os sinais de movimento mais rápido ou aqueles que exigem uma resposta mais rápida precisam de uma abordagem diferente. Uma situação comum para mim é monitorar a DC bruta para perda de energia recebida. Esse sinal pode muito bem ser reciclado AC e tem muita ondulação. Ou pode ter outros fatores que podem fazer gyrate. Nesses casos, faço um esquema de média simples como Kleinstein, com a nova amostra com um peso para alterar o valor anterior. Não, não é uma média móvel real, já que todas as amostras não são mantidas. Para o monitoramento de energia, a nova amostra pode ter 12 ou 14 ou 18 pesos, determinando empiricamente o que funciona melhor em um caso particular. Abaixo está o código de um aplicativo onde 12 era muito grosseiro, e o final usado 116: Você pode colocar batom em um porco, mas ainda é um porco. Eu nunca conheci um porco que eu não gostei, desde que você tenha um pouco de sal e pimenta. Média média móvel média Média média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer idioma que você conheça. Calculando a média móvel simples de uma série de números. Crie uma função de função estatal que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma média móvel simples é um método para calcular uma média de um fluxo de números apenas com a média dos últimos 160 P 160 números da corrente, 160 em que 160 P 160 é conhecido como o período. Pode ser implementado chamando uma rotina de inicialização com 160 P 160 como seu argumento, 160 I (P), 160, o que deve retornar uma rotina que, quando chamada com membros individuais e sucessivos de um fluxo de números, calcula a média de (acima Para), o último 160 P 160 deles, vamos chamar este 160 SMA (). A palavra 160 160 com estado na descrição da tarefa refere-se à necessidade de 160 SMA () 160 para lembrar certas informações entre chamadas para ela: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um São chamadas individuais. O 160 declarado também significa que as chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que 160 não 160 compartilham o estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para manter os valores p mais recentes. Cada função retornada da média init-moving tem seu estado em um átomo que possui um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula da lista que mantém o valor simplesmente deslocando-se da janela e para ser substituído pelo valor adicionado. Usando uma edição de encerramento Atualmente, esse sma não pode ser nogc porque ele aloca um fecho no heap. Algumas análises de escape podem remover a alocação de pilha. Usando uma edição de estrutura Esta versão evita a alocação de pilha do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: para evitar que as aproximações de ponto flutuante continuem empilhando e crescendo, o código poderia executar uma soma periódica em toda a matriz de fila circular. Esta implementação produz dois (função) estado de compartilhamento de objetos. É idiomático em E para separar a entrada da saída (ler da escrita) ao invés de combiná-los em um único objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa elixir abaixo gera uma função anônima com um período incorporado p, que é usado como o período da média móvel simples. A função de execução lê a entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para o STDOUT. A saída é mostrada abaixo, com a média, seguida da entrada agrupada, formando a base de cada média móvel. Erlang possui fechamentos, mas variáveis ​​imutáveis. Então, uma solução é usar processos e uma mensagem simples passando a API baseada. As linguas Matrix têm rotinas para calcular os padrões de deslizamento para uma determinada sequência de itens. É menos eficiente para loop como nos seguintes comandos. Indica continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND1, e significa pode ser encontrado em ListOPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: a lista é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i 5) - Inicializando o cálculo da média móvel e define o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), eo resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), e o novo resultado será armazenado na variável x e exibido (43) 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável índice, e aponta para o final da sub-lista a lista em média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no próximo cálculo médio. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo médio. Então, só precisamos descobrir qual será o primeiro valor na lista. Normalmente, é preciso considerar os elementos p, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo geralmente será negativo, então a seguinte equação evitará índices negativos: max (i-p1,1) ou, organizando a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - iniciar índice 1) ou, organizando a equação, (i - (max (ip, 0) 1) 1) e, em seguida, , (I-max (ip, 0)). A variável z mantém o valor comum (max (ip), 0) para que o beginindex seja (z1) e o número dos itens serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média ( .) Irá somar-lhes soma (.) (Iz) ri irá em média e armazenará o resultado no lugar apropriado na lista de resultados Usando um fechamento e criando uma função

No comments:

Post a Comment