Movimento média circular buffer
Eu sei que isso é possível com impulso como per. But eu realmente gostaria de evitar o uso de impulso eu tenho googled e não encontrei qualquer exemplos adequados ou legíveis. Basicamente eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números em ponto flutuante Usando os números mais recentes de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir this. I experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades melhor . Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Basta, você faz uma variável de acumulador, e como seu código olha para cada amostra, o código atualiza o acumulador com o Novo valor Você escolhe um alfa constante que está entre 0 e 1, e calcula isso. Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 samples. Hmm, eu realmente não tenho certeza que isso é Adequado para você, agora t O que eu colocar aqui O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Eu não tenho certeza se há um alfa que iria espalhar a média sobre os últimos 1000 números, sem subfluxo no cálculo do ponto flutuante Mas se você Queria uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. 12 12 em 4 44. 1 em sua postagem A média móvel exponencial pode permitir que o alfa ser variável Então isso permite que ele Ser usado para computar médias de base de tempo, por exemplo bytes por segundo Se o tempo desde a última atualização de acumulador é mais de 1 segundo, você deixa alfa ser 1 0 Caso contrário, você pode deixar alfa usecs desde a última atualização 1000000 jxh 12 de junho 12 em 6 21.Basicamente, eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números 1000 como um exemplo de dados. Note que o abaixo atualiza o total como elementos como adicionado substituído, evitando costoso ON traversal para calcular A soma - necessária para o E média - on demand. Total é feito um parâmetro diferente de T para suportar, por exemplo, usando um longo longo quando totalizando 1000 long s, um int para char s, ou um dobro ao total float s. This é um pouco falho em que numsamples poderia Passar INTMAX passado - se você se importa que você poderia usar um unsigned long long ou usar um membro bool extra de dados para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples em torno da matriz melhor então renomeado algo inócuo como pos. answered 12 de junho 12 em 5 19.um pressupõe que o operador vazio T amostra é, na verdade void operador T amostra oPless Jun 8 14 at 11 52. oPless ahhh bem vislumbrado realmente eu quis dizer para ele ser operador vazio T amostra, mas é claro que você poderia usar qualquer nota que você gostava Will fix, Graças Tony D Jun 8 14 em 14 27.The cientista e engenheiro s Guia de Processamento de Sinal Digital Por Steven W Smith, Ph D. Capítulo 28 processadores de sinais digitais. Digital processadores de sinal são projetados para executar rapidamente FIR filtros e técnicas semelhantes Para entender A guerra dura E nós devemos primeiro entender os algoritmos Nesta seção vamos fazer uma lista detalhada das etapas necessárias para implementar um filtro FIR Na próxima seção vamos ver como DSPs são projetados para executar estas etapas tão eficientemente quanto possível. Para começar, precisamos Para distinguir entre processamento off-line e processamento em tempo real No processamento off-line, todo o sinal de entrada reside no computador ao mesmo tempo Por exemplo, um geofísico pode usar um sismómetro para registrar o movimento do solo durante um terremoto Após a agitação É mais, a informação pode ser lido em um computador e analisado de alguma forma Outro exemplo de processamento off-line é a imagem médica, como a tomografia computadorizada ea ressonância magnética O conjunto de dados é adquirido enquanto o paciente está dentro da máquina, mas a reconstrução de imagem Pode ser adiada até um momento posterior O ponto chave é que todas as informações estão simultaneamente disponíveis para o programa de processamento Isso é comum em pesquisa científica e engenharia, mas não em Produtos de consumo O processamento off-line é o domínio de computadores pessoais e mainframes. In processamento em tempo real, o sinal de saída é produzido ao mesmo tempo que o sinal de entrada está sendo adquirido Por exemplo, isso é necessário em comunicação telefônica, aparelhos auditivos, Por exemplo, um atraso de 10 milissegundos em uma chamada telefônica não pode ser detectado pelo orador ou ouvinte. Do mesmo modo, não faz diferença se um sinal de radar é Atrasado por alguns segundos antes de ser exibido para o operador Aplicações em tempo real de entrada uma amostra, executar o algoritmo e saída de uma amostra, over-and-over Alternativamente, eles podem introduzir um grupo de amostras, executar o algoritmo e saída Um grupo de amostras Este é o mundo de Digital Signal Processors. Now olhar para trás na Fig 28-2 e imaginar que este é um filtro FIR sendo implementado em tempo real Para calcular a amostra de saída, devemos ha Por exemplo, suponha que usamos oito coeficientes neste filtro, a 0 a 1 a 7 Isso significa que devemos conhecer o valor das oito amostras mais recentes do sinal de entrada, Xn, xn -1, xn -7 Estas oito amostras devem ser armazenadas na memória e continuamente atualizadas à medida que novas amostras são adquiridas Qual é a melhor maneira de gerenciar essas amostras armazenadas A resposta é buffering circular. A Figura 28-3 ilustra uma circular de oito amostras Buffer Nós colocamos este buffer circular em oito locais de memória consecutivos, 20041 a 20048 A figura a mostra como as oito amostras da entrada podem ser armazenadas em um instante no tempo, enquanto b mostra as mudanças após a próxima amostra é adquirida A idéia de Buffering circular é que o fim desta matriz linear está conectado ao seu local de memória de início 20041 é visto como sendo próximo a 20048, assim como 20044 é próximo a 20045 Você manter o controle da matriz por um ponteiro uma variável cujo valor i Um endereço que indica onde reside a amostra mais recente Por exemplo, em um ponteiro contém o endereço 20044, enquanto que em b contém 20045 Quando uma nova amostra é adquirida, ela substitui a amostra mais antiga na matriz eo ponteiro é movido Um endereço à frente Os buffers circulares são eficientes porque somente um valor precisa ser alterado quando uma nova amostra é adquirida. Quatro parâmetros são necessários para gerenciar um buffer circular Primeiro, deve haver um ponteiro que indique o início do buffer circular na memória neste Exemplo, 20041 Em segundo lugar, deve haver um ponteiro indicando o fim do array, por exemplo, 20048, ou uma variável que mantém o seu comprimento, por exemplo 8 Terceiro, o tamanho do passo do endereçamento de memória deve ser especificado Na Figura 28-3 o tamanho do passo é um Por exemplo o endereço 20043 contém uma amostra, o endereço 20044 contém o próximo exemplo, e assim por diante Este é freqüentemente não o caso Por exemplo, o endereçamento pode se referir a bytes, e cada amostra pode exigir dois ou quatro bytes para manter seu valor I N estes casos, o tamanho do passo precisaria ser dois ou quatro, respectivamente. Estes três valores definem o tamanho ea configuração do buffer circular e não irão mudar durante a operação do programa O quarto valor, o ponteiro para a amostra mais recente, Deve ser modificada à medida que cada nova amostra é adquirida. Em outras palavras, deve haver uma lógica de programa que controle como esse quarto valor é atualizado com base no valor dos três primeiros valores. Embora esta lógica seja bastante simples, ela deve ser muito rápida. Ponto inteiro desta discussão DSPs deve ser otimizado na gestão de buffers circular para alcançar a maior velocidade de execução possível. Como um aparte, tampão circular também é útil no processamento off-line Considere um programa onde tanto a entrada e os sinais de saída estão completamente contidos em Memória buffering circular não é necessário para um cálculo de convolução, porque cada amostra pode ser imediatamente acessado No entanto, muitos algoritmos são implementados em estágios com um sinal intermediário ser O método de força bruta é armazenar todo o comprimento de cada sinal intermediário na memória. O buffering circular fornece outra opção armazenar apenas as amostras intermediárias necessárias para O cálculo à mão Isto reduz a quantidade necessária de memória, à custa de um algoritmo mais complicado A idéia importante é que os buffers circulares são úteis para processamento off-line, mas crítico para applications. Now em tempo real, podemos olhar para as etapas Necessário para implementar um filtro FIR usando buffers circulares para o sinal de entrada e os coeficientes Esta lista pode parecer trivial e overexamined-it s not A manipulação eficiente dessas tarefas individuais é o que separa um DSP de um microprocessador tradicional Para cada nova amostra, todos As etapas a seguir precisam ser tomadas. O objetivo é fazer com que essas etapas sejam executadas rapidamente Uma vez que os passos 6 a 12 serão repetidos várias vezes uma vez para cada Os microprocessadores tradicionais devem geralmente executar estes 14 passos em série um após o outro, enquanto os DSPs são projetados para executá-los em paralelo. Em alguns casos, todas as operações dentro dos passos de loop 6 -12 pode ser concluída em um único ciclo de relógio Vamos olhar para a arquitetura interna que permite que este magnífico performance. One das principais aplicações para a placa Arduino é leitura e registro de dados do sensor Por exemplo, um monitora a pressão a cada segundo do dia Como Altas taxas de amostragem muitas vezes gera picos nos gráficos um também quer ter uma média das medidas Como as medições não são estáticas no tempo o que muitas vezes precisamos é de uma média corrente Esta é a média de um determinado período e muito valioso quando se faz análise de tendência . A forma mais simples de uma média em execução pode ser feita por um código que se baseia na média anterior. Se não se quiser usar matemática em ponto flutuante - como thi S ocupa a memória e diminui a velocidade - pode-se fazer o mesmo completamente no domínio inteiro A divisão por 256 no código de exemplo é um shift-right 8, que é mais rápido do que dizer divisão por, por exemplo, 100 Isso é verdadeiro para cada potência de 2 Como divisor e um só deve ter cuidado a soma dos pesos é igual ao poder de 2 E, claro, deve-se tomar cuidado não há transbordamento intermediário considerar o uso de unsigned long. If você precisa de uma média mais precisa, em concreto a partir dos últimos 10 Medições, você precisa de uma matriz ou lista vinculada para mantê-los Esta matriz age como um buffer circular e com cada nova medição a mais antiga é removida A média de corrida é calculada como a soma de todos os elementos divididos pelo número de elementos na matriz The Código para a média em execução será algo como this. Drawback deste código é que a matriz para manter todos os valores pode se tornar muito grande Se você tem uma medição por segundo e você quer uma média de execução por minuto você precisa de uma matriz de 60 um A média por hora precisaria de uma matriz de 3600 Isso couldn t ser feito desta forma em um Arduino como ele só tem 2K de RAM No entanto, através da construção de uma média de 2 estágios que pode ser abordado bastante bem não para todas as medições em psuedo code. As a Nova matriz estática interna é necessária para cada função runningAverage, isso grita para ser implementado como uma biblioteca class. RunningAverage. A biblioteca runningAverage faz uma classe da função acima para que ela possa ser usada várias vezes em um sketch Desacopla o add eo avg Função para ser um pouco mais flexível por exemplo, pode-se chamar a média várias vezes sem adicionar uma coisa Observe que cada instância da classe adiciona sua própria matriz para realizar medições, e que isso adiciona até o uso de memória A interface da classe é Mantido o menor possível. Nota com versão 0 2 os nomes dos métodos são todos feitos mais descritivo. Um pequeno esboço mostra como ele pode ser usado um gerador aleatório é usado para imitar um sensor. In configuração myRA é limpa assim w E pode começar a adicionar novo loop data. In primeiro um número aleatório é gerado e convertido para um flutuador a ser adicionado ao myRA Então o runningAverage é impresso para a porta serial Um também poderia exibi-lo em algum LCD ou enviar sobre ethernet etc Quando 300 itens São adicionados myRA é limpo para começar de novo again. To usar a biblioteca, faça uma pasta em suas libraries SKETCHBOOKPATH com o nome RunningAverage e coloque o h e não Opcionalmente fazer um subdiretório de exemplos para colocar o exemplo app.2017-01-30 versão inicial .2017-02-28 fixo destrutor em falta em h file.2017-02-28 removido padrão constructor.2017- - trimValue Yuval Naveh adicionado trimValue encontrado em web.2017-11-21 refactored.2017-12-30 adicionado fillValue refatorado para Publishing.2017-07-03 adicionado código de proteção de memória - se matriz interna não pode ser alocada tamanho torna-se 0 Isso é para resolver o problema descrito here. Test extensively. Template class. RunningAverage h. RunningAverage.
Comments
Post a Comment