Skip to main content

Moving Average Pic


LED LYT Meter: LED, Microcontrolador PIC e Moving Average Code Olá a todos, obrigado por conferir o meu primeiro Instructable. Eu apreciei ver suas criações ao longo dos anos e amo o que todos vocês estão contribuindo. Este projeto é um spin off de um que eu vi recentemente aqui e eu preciso dar um grito para Bot1398 porque ele demonstrou-me em seu Instructable que você poderia usar um LED para detectar mudanças na intensidade de luz no ambiente e usar isso para Ligue ou desligue um outro LED. Eu sabia que se você forneceu um pouco de energia para um LED que iria emitir luz. Eu nunca pensei que poderia ser usado ao contrário. Depois que eu vi o seu Instructable: Light Sensing LEDs fez sentido, mas eu queria ver isso realmente funciona para mim. Eu estou escrevendo este Instructable porque Bot1398 usou um Arduino e Ive nunca os usou. Eu não tenho nada contra eles, no entanto, quando eu comecei a usar microcontroladores cerca de 3 anos atrás, eu estava à procura de velocidade e potência para uma aplicação específica. Eu estabeleci-me na série do microcontrolador de PIC por Microchip. É incrível o que você pode fazer com microcontroladores, você pode deixar sua imaginação correr selvagem e com um pouco de programação criativa conseguir exatamente o que você quer. Há uma série de linguagens de programação lá fora também, mas quando eu comecei eu queria velocidade e saber exatamente o que estava acontecendo em cada passo, portanto, eu escolhi Assembléia Linguagem, uma vez que parecia muito como o BASIC que eu aprendi sobre o IBM PC Jr. volta na década de 1980, quando eu estava crescendo. Isso é o que este Instructable implica: Microcontroladores PIC e Assembly Language para usar um LED (Light Emitting Diode) para detectar a quantidade de luz ambiente e exibir a medida numérica desta luz, juntamente com um gráfico de barras em uma tela LCD. Eu fiz produzir a primeira versão deste dispositivo de detecção de luz baseado em LED que funcionou, o problema que eu notei foi que os valores saltou em torno de um pouco. Portanto, eu olhei para uma solução para este problema que eu pensei sobre a média dos valores, mas como matemática binária é tipo de difícil, mas há sempre uma maneira de fazê-lo. Como eu estava procurando soluções eu me deparei com uma grande página sobre Moving Averages e como fazê-lo mais eficazmente para que até mesmo o 8-Bit Microcontrollers pode lidar com isso com facilidade. O link para a página está aqui: computacionalmente eficientes médias móveis e isso funciona extremamente bem. Esta implementação exibe a Média Móvel das últimas 256 leituras de luz e exibe esse valor juntamente com um gráfico de barras na Tela LCD. O código da média móvel evita que os valores lidos a partir do LED saltar muito e dá-lhe um resultado melhor, muito mais preciso. Quando ligamos um LED a um Microcontrolador, normalmente estamos fazendo isso para iluminá-lo. Neste caso, no entanto, estamos realmente aplicando uma tensão positiva para a extremidade negativa do eletrodo. Isto é para que possamos tirar proveito de algo chamado capacitância parasita. Aplicando esta tensão positiva irá acumular uma pequena carga (recursos na internet dizer dentro de cerca de 100-200 nanossegundos) dentro desta capacitância parasita do LED que estamos usando. A capacitância real não é muito importante, mas on-line resouces dizer que é em torno de 10-15 pF. Em seguida, trocaremos o pino do microcontrolador ligado à extremidade negativa do eletrodo de uma OUTPUT para uma INPUT e esperaremos que a carga seja drenada. Quando a carga drena o suficiente, o pino agora lerá um Nível Lógico 0 ou Baixo onde vamos desligar o timer e usar esse valor para calcular a média móvel e exibir os resultados na tela. Tomaremos mais leituras e as exibiremos na tela no intervalo que está escrito no código de montagem. No código terminado, eu tenho que definir uma leitura sobre cada 20 microssegundos. Isso ocorre 50 vezes para que um resultado atualizado é exibido na tela aproximadamente a cada segundo ou assim. O tempo que leva para obter uma leitura vai variar um pouco, porque leva mais tempo para a carga para drenar em um ambiente escuro e isso ocorre mais rápido em ambientes de luz. A taxa de descarga da capacitância LED é de alguma forma diretamente relacionada ao número de fótons ou quantidade de luz atingindo os elementos de geração de luz LED. Limpo não é. ) Agora que sabemos como funciona, vamos passar para o Passo 1. Etapa 1: Reunir Componentes e Montar o Circuito Mostrar todas as 5 Imagens Primeiro colete os seguintes itens que você vai precisar para construir o LED LYT METER: Microcontrolador PIC (eu usei o Agora você deve ser capaz de seguir o esquema para montar o circuito em uma prancha ou qualquer outra maneira que você gostaria de colocar seus circuitos juntos. Este é bastante fácil e tem partes mínimas. Eu anexei dois esquemas diferentes, um tem o LED de medição de luz ligado a dois pinos de microcontrolador diferentes eo outro tem este LED com o cátodo (ou extremidade negativa) ligado a um pino de microcontrolador eo ânodo (ou extremidade positiva) do LED ligado à terra. Isto parece para trás mas, remeber, nós não estamos usando o diodo emissor de luz para produzir a luz, mas para a medir preferivelmente. É por isso que ele está conectado dessa maneira. Em minhas fotos você verá que o LED está conectado a dois pinos do microcontrolador. Isso é porque eu queria ser capaz de usar o LED para produzir luz também, a fim de verificar para se certificar de que funciona quando o programa é iniciado. Se você optar por conectar o LED a 2 pinos do microcontrolador você precisará manter isso em mente para que ele funcione. Eu não poderia encontrar este documentado em qualquer lugar por isso demorou um pouco de experimentação para obtê-lo para o trabalho. Para poder acender o LED, ambos os pinos do microcontrolador precisarão ser configurados como SAÍDAS. Então, para fazer o LED brilhar, você definir o ânodo (ou positivo) do LED de alta para que a corrente flui através do LED para produzir luz. No começo eu pensei que eu precisaria definir o cátodo (ou negativo) do LED como uma ENTRADA, mas isso não funcionou. Agora que você tem os componenets, colocá-los juntos na breadboard seguindo o esquema que você deseja seguir. Quando montado, ele deve olhar um pouco semelhante às imagens abaixo. Estou usando um regulador de 5 volts para fornecer 5 volts para alimentar o circuito. Eu uso uma verruga de parede que fornece cerca de 9 volts para o regulador. A tela LCD que estou usando é um Módulo de exibição de cristais líquidos NHDC0220AZFSWFTW COG (ChiponGlass) Newhaven. Eu costumava usar o LCD HD44780 exibe que muitas outras pessoas usam. Você pode definiately usar o HD44780 exibe sem qualquer problema e há muito mais código fonte lá fora para fazê-los executar. A tela de Newhaven não tinha código-fonte, mas sentado com a folha de dados e usando o código-fonte HD44780, eu vim com o código para fazê-lo funcionar perfeitamente. Eu gosto do display por alguns motivos. O contraste é muito fácil de definir e até agora eu não tive que mudá-lo em tudo durante as diferentes estações, ele sempre permanece claro e muito fácil de ler. Ele também tem uma pegada menor e era exatamente o que eu precisava para um projeto enorme que eu estou trabalhando em onde o espaço disponível é um prémio. É menor do que o HD44780 exibe e ainda exibe 20 caracteres em cada uma das duas linhas. Finalmente, é menos caro do que o HD44780 exibe também. Eu escolhi um par destes acima de Digikey e em somente um preço de 10.25 cada. Verifique-os para fora aqui: Indicador do LCD de Newhaven em Digikey. Tenha em mente que este display requer de 3,3 a 5,5 volts, portanto, tenha isso em mente ao escolher sua fonte de alimentação. O código fonte que é fornecido também deve executar o HD44780 exibe sem problemas. Esta é apenas a maneira que eu tenho que configurar. Você pode colocar os componentes em pinos diferentes do seu microcontrolador. Basta ter em mente quais pinos do microcontrolador que você conectar para o positivo e negativo final do LED de detecção de luz. Você também pode conectar sua tela LCD para operar no modo de 4 bits em vez do modo de 8 bits, conforme ilustrado. Isso exigiria quatro conexões menos no circuito, mas torna a sua programação um pouco mais complicada. Avançar para os próximos passos. Escrevendo o Programa. Como outros já mencionaram, você deve considerar um filtro IIR (resposta de impulso infinito) em vez do filtro FIR (resposta de impulso finito) que você está usando agora. Há mais, mas à primeira vista os filtros FIR são implementados como convoluções explícitas e filtros IIR com equações. O filtro IIR especial que eu uso muito em microcontroladores é um filtro de passa-baixa de pólo único. Este é o equivalente digital de um simples filtro analógico R-C. Para a maioria das aplicações, elas terão melhores características do que o filtro de caixa que você está usando. A maioria dos usos de um filtro de caixa que eu encontrei são o resultado de alguém não prestar atenção na classe de processamento de sinal digital, e não como resultado de precisar de suas características particulares. Se você só quer atenuar as altas freqüências que você sabe que são ruído, um único pólo filtro passa-baixo é melhor. A melhor maneira de implementar um digitalmente em um microcontrolador é geralmente: FILT lt - FILT FF (NEW - FILT) FILT é um pedaço de estado persistente. Esta é a única variável persistente que você precisa para calcular este filtro. NEW é o novo valor que o filtro está sendo atualizado com esta iteração. FF é a fracção do filtro. Que ajusta o peso do filtro. Olhe para este algoritmo e veja que para FF 0 o filtro é infinitamente pesado desde que a saída nunca muda. Para FF 1, seu realmente nenhum filtro em tudo desde que a saída apenas segue a entrada. Os valores úteis estão no meio. Em sistemas pequenos você escolhe FF para ser 1/2 N de modo que a multiplicação por FF possa ser realizada como um deslocamento para a direita por N bits. Por exemplo, FF pode ser 1/16 e multiplicar por FF, portanto, um deslocamento para a direita de 4 bits. Caso contrário, este filtro precisa apenas de uma subtração e uma adição, embora os números geralmente precisam ser mais largos do que o valor de entrada (mais na precisão numérica em uma seção separada abaixo). Eu costumo tomar leituras A / D significativamente mais rápido do que eles são necessários e aplicar dois desses filtros em cascata. Este é o equivalente digital de dois filtros R-C em série, e atenua por 12 dB / oitava acima da freqüência de rolloff. No entanto, para as leituras A / D é geralmente mais relevante olhar para o filtro no domínio do tempo, considerando sua resposta passo. Isso indica a rapidez com que seu sistema verá uma alteração quando a coisa que você está medindo muda. Para facilitar a concepção destes filtros (que significa apenas escolher FF e decidir quantos deles para cascatear), eu uso o meu programa FILTBITS. Você especifica o número de bits de deslocamento para cada FF na série de filtros em cascata e calcula a resposta da etapa e outros valores. Na verdade eu costumo correr isso através do meu script wrapper PLOTFILT. Isso executa FILTBITS, que faz um arquivo CSV, e depois traça o arquivo CSV. Por exemplo, aqui está o resultado de PLOTFILT 4 4: Os dois parâmetros para PLOTFILT significa que haverá dois filtros em cascata do tipo descrito acima. Os valores de 4 indicam o número de bits de mudança para realizar a multiplicação por FF. Os dois valores FF são, portanto, 1/16 neste caso. O traço vermelho é a resposta da etapa da unidade, e é a coisa principal a olhar. Por exemplo, isto diz-lhe que se a entrada muda instantaneamente, a saída do filtro combinado estabelecerá a 90 do novo valor em 60 iterações. Se você se preocupa com 95 settling tempo, então você tem que esperar cerca de 73 iterações, e por 50 tempo de resolução apenas 26 iterações. O traço verde mostra a saída de um único pico de amplitude total. Isto dá-lhe alguma idéia da supressão aleatória do ruído. Parece que nenhuma amostra irá causar mais do que uma alteração de 2,5 na saída. O traço azul é dar uma sensação subjetiva do que este filtro faz com o ruído branco. Este não é um teste rigoroso, uma vez que não há garantia o que exatamente o conteúdo foi dos números aleatórios escolhidos como a entrada de ruído branco para esta execução de PLOTFILT. Seu somente para dar-lhe uma sensação áspera de quanto será squashed e de como liso é. PLOTFILT, talvez FILTBITS, e muitas outras coisas úteis, especialmente para o desenvolvimento de firmware PIC está disponível no software PIC Development Tools release na minha página de downloads de Software. Adicionado sobre precisão numérica eu vejo dos comentários e agora uma nova resposta que há interesse em discutir o número de bits necessários para implementar este filtro. Observe que a multiplicação por FF criará Log 2 (FF) novos bits abaixo do ponto binário. Em sistemas pequenos, FF é geralmente escolhido para ser 1/2 N para que este multiplicar é realmente realizado por um deslocamento à direita de N bits. FILT é geralmente um inteiro de ponto fixo. Observe que isso não altera nenhuma das matemáticas do ponto de vista dos processadores. Por exemplo, se você estiver filtrando leituras A / D de 10 bits e N 4 (FF 1/16), então você precisará de 4 bits de fração abaixo das leituras A / D inteiras de 10 bits. Um processadores mais, youd estar fazendo operações de 16 bits inteiro devido às leituras de 10 bit A / D. Neste caso, você ainda pode fazer exatamente as mesmas operações de 16 bits inteiros, mas comece com as leituras A / D esquerda deslocada por 4 bits. O processador não sabe a diferença e não precisa. Fazer a matemática em inteiros inteiros de 16 bits funciona se você os considera 12,4 pontos fixos ou inteiros verdadeiros de 16 bits (16,0 ponto fixo). Em geral, você precisa adicionar N bits cada pólo de filtro se você não quiser adicionar ruído devido à representação numérica. No exemplo acima, o segundo filtro de dois teria 1044 18 bits para não perder informações. Na prática em uma máquina de 8 bits que significa youd usar valores de 24 bits. Tecnicamente apenas o segundo pólo de dois precisaria do valor mais amplo, mas para a simplicidade do firmware eu costumo usar a mesma representação, e, portanto, o mesmo código, para todos os pólos de um filtro. Normalmente eu escrevo uma sub-rotina ou macro para executar uma operação de pólo de filtro, em seguida, aplicar isso a cada pólo. Se uma subrotina ou macro depende se os ciclos ou a memória do programa são mais importantes nesse projeto específico. De qualquer maneira, eu uso algum estado zero para passar NOVO para a subrotina / macro, que atualiza FILT, mas também carrega isso para o mesmo estado zero NOVO foi dentro Isso torna mais fácil para aplicar vários pólos desde o FILT atualizado de um pólo é O NOVO do próximo. Quando uma sub-rotina, é útil ter um ponteiro apontar para FILT no caminho, que é atualizado para logo após FILT na saída. Desta forma, a sub-rotina opera automaticamente em filtros consecutivos na memória se for chamada várias vezes. Com uma macro você não precisa de um ponteiro desde que você passa no endereço para operar em cada iteração. Exemplos de código Aqui está um exemplo de uma macro como descrito acima para um PIC 18: E aqui está uma macro semelhante para um PIC 24 ou dsPIC 30 ou 33: Ambos estes exemplos são implementados como macros usando o meu pré-processador de assembler PIC. Que é mais capaz do que qualquer um das instalações macro incorporadas. Clabacchio: Outra questão que eu deveria ter mencionado é a implementação de firmware. Você pode escrever uma sub-rotina de filtro passa-baixa de um único pólo uma vez, depois aplicá-la várias vezes. Na verdade eu costumo escrever tal sub-rotina para ter um ponteiro na memória para o estado do filtro, em seguida, tê-lo avançar o ponteiro para que ele pode ser chamado em sucessão facilmente para realizar filtros multi-polo. Ndash Olin Lathrop Apr 20 12 at 15:03 1. muito obrigado por suas respostas - todas elas. Eu decidi usar este filtro IIR, mas este filtro não é usado como um filtro LowPass padrão, uma vez que eu preciso para a média de valores de contador e compará-los para detectar alterações em um determinado intervalo. Uma vez que estes Valores van ser de dimensões muito diferentes, dependendo de hardware que eu queria tomar uma média, a fim de ser capaz de reagir a estas alterações Hardware específicas automaticamente. Ndash sensslen May 21 12 at 12:06 Se você pode viver com a restrição de um poder de dois números de itens para a média (ou seja, 2,4,8,16,32 etc), então a divisão pode ser feita de forma fácil e eficiente em um Micro de baixo desempenho sem divisão dedicada, pois pode ser feito como um deslocamento bit. Cada turno é um poder de dois, por exemplo: O OP pensou que ele tinha dois problemas, dividindo em um PIC16 e memória para seu buffer de anel. Esta resposta mostra que a divisão não é difícil. É verdade que ele não trata o problema da memória, mas o sistema SE permite respostas parciais, e os usuários podem tirar algo de cada resposta por si mesmos, ou mesmo editar e combinar outras respostas. Uma vez que algumas das outras respostas requerem uma operação de divisão, elas são igualmente incompletas, uma vez que não mostram como efetivamente conseguir isso em um PIC16. Ndash Martin Apr 20 12 at 13:01 Há uma resposta para um verdadeiro filtro de média móvel (aka boxcar filtro) com menos requisitos de memória, se você não mente downsampling. É chamado um filtro integrador-pente em cascata (CIC). A idéia é que você tem um integrador que você toma as diferenças de um período de tempo, eo dispositivo de economia de memória chave é que por downsampling, você não tem que armazenar cada valor do integrador. Ele pode ser implementado usando o seguinte pseudocódigo: Seu comprimento médio móvel efetivo é decimationFactorstatesize, mas você só precisa manter em torno de amostras statesize. Obviamente, você pode obter um melhor desempenho se o seu statesize e decimationFactor são poderes de 2, de modo que a divisão e os operadores restantes são substituídos por turnos e máscara-ands. Postscript: Eu concordo com Olin que você deve sempre considerar filtros IIR simples antes de um filtro de média móvel. Se você não precisa de freqüência-nulos de um filtro de vagão, um filtro de passa-baixa de 1 pólo ou de 2 pólos provavelmente funcionará bem. Por outro lado, se você estiver filtrando para fins de decimação (tomando uma alta taxa de amostragem entrada e calculando a média para o uso por um processo de baixa taxa), em seguida, um CIC filtro pode ser exatamente o que você está procurando. (Especialmente se você pode usar statesize1 e evitar o ringbuffer completamente com apenas um valor único integrador anterior) Theres alguma análise em profundidade da matemática por trás usando o filtro IIR de primeira ordem que Olin Lathrop já descreveu mais sobre a troca de pilha Digital Signal Processing (Inclui muitas imagens bonitas.) A equação para este filtro IIR é: Isso pode ser implementado usando apenas inteiros e nenhuma divisão usando o código a seguir (pode precisar de alguma depuração como eu estava digitando na memória.) Este filtro aproxima uma média móvel de Os últimos K amostras, definindo o valor de alfa para 1 / K. Faça isso no código anterior, definindo BITS para LOG2 (K), ou seja, para K 16 set BITS para 4, para K 4 set BITS para 2, etc (eu verificar o código listado aqui logo que eu recebo uma alteração e Editar esta resposta, se necessário.) Responder Jun 23 12 at 4:04 Heres um filtro passa-baixo de um único pólo (média móvel, com freqüência de corte CutoffFrequency). Muito simples, muito rápido, funciona muito bem, e quase nenhuma sobrecarga de memória. Nota: Todas as variáveis ​​têm escopo além da função de filtro, exceto o passado em newInput Nota: Este é um filtro de etapa única. Várias etapas podem ser conectadas em cascata para aumentar a nitidez do filtro. Se você usar mais de uma etapa, você terá que ajustar DecayFactor (como se relaciona com a Cutoff-Frequency) para compensar. E, obviamente, tudo o que você precisa é dessas duas linhas colocadas em qualquer lugar, eles não precisam de sua própria função. Este filtro tem um tempo de aceleração antes que a média móvel represente a do sinal de entrada. Se você precisar ignorar esse tempo de aceleração, basta inicializar MovingAverage para o primeiro valor de newInput em vez de 0 e esperar que o primeiro newInput não seja um outlier. (CutoffFrequency / SampleRate) tem um intervalo entre 0 e 0,5. DecayFactor é um valor entre 0 e 1, geralmente perto de 1. Flutuadores de precisão única são bons o suficiente para a maioria das coisas, eu só prefiro dobra. Se você precisa ficar com números inteiros, você pode converter DecayFactor e Amplitude Factor em inteiros fracionários, em que o numerador é armazenado como o inteiro, eo denominador é uma potência inteira de 2 (assim você pode bit-shift para a direita como o Denominador em vez de ter que dividir durante o loop de filtro). Por exemplo, se você usar DecayFactor 0,99, e você quiser usar números inteiros, você pode definir DecayFactor 0,99 65536 64881. E então, sempre que você multiplicar por DecayFactor em seu loop de filtro, basta deslocar o resultado 16. Para obter mais informações sobre isso, um excelente livro thats Online, capítulo 19 sobre filtros recursivos: dspguide / ch19.htm PS Para o paradigma da média móvel, uma abordagem diferente para definir DecayFactor e AmplitudeFactor que pode ser mais relevante para suas necessidades, vamos dizer que você quer o anterior, cerca de 6 itens média juntos, fazê-lo discretamente, youd adicionar 6 itens e dividir por 6, então Você pode definir o AmplitudeFactor para 1/6 e DecayFactor para (1.0 - AmplitudeFactor). Respondeu May 14 12 at 22:55 Todo mundo tem comentado completamente sobre a utilidade de IIR vs FIR, e na divisão de poder-de-dois. Id gostaria de dar alguns detalhes de implementação. O abaixo funciona bem em pequenos microcontroladores sem FPU. Não há multiplicação, e se você manter N um poder de dois, toda a divisão é de ciclo único bit-shifting. Tampão de toque FIR básico: mantém um buffer de execução dos últimos N valores e uma Soma em execução de todos os valores no buffer. Cada vez que uma nova amostra entra, subtraia o valor mais antigo no buffer de SUM, substitua-o pela nova amostra, adicione a nova amostra à SUM e a saída SUM / N. Tampão de anel IIR modificado: mantenha uma SUM corrente dos últimos N valores. Cada vez que uma nova amostra chega, SUM - SUM / N, adicione a nova amostra e a saída SUM / N. Se I39m lendo você direito, você está descrevendo um filtro IIR de primeira ordem, o valor que você está subtraindo isn39t o valor mais antigo que está caindo, mas é, em vez disso, a média dos valores anteriores. Os filtros IIR de primeira ordem podem certamente ser úteis, mas não tenho certeza do que você quer dizer quando sugere que a saída é a mesma para todos os sinais periódicos. A uma taxa de amostragem de 10KHz, a alimentação de uma onda quadrada de 100Hz em um filtro de caixa de 20 estágios produzirá um sinal que sobe uniformemente para 20 amostras, senta alto para 30, cai uniformemente para 20 amostras e senta baixo para 30. Uma primeira ordem IIR. Ndash supercat Aug 28 13 às 15:31 vai produzir uma onda que começa bruscamente a subir e gradualmente nivela perto (mas não no) máximo de entrada, então começa bruscamente a cair e nivela gradualmente perto (mas não) o mínimo de entrada. Comportamento muito diferente. Uma questão é que uma média móvel simples pode ou não ser útil. Com um filtro IIR, você pode obter um bom filtro com relativamente poucos calcs. O FIR que você descreve só pode lhe dar um retângulo no tempo - um sinc em freq - e você não pode gerenciar os lobos laterais. Pode valer a pena jogar algumas multiplicações inteiras para torná-la uma simpática e simétrica sintonia FIR se você pode poupar os carrapatos do relógio. Ndash Scott Seidman Aug 29 13 às 13:50 ScottSeidman: Não há necessidade de multiplicar se um simplesmente tem cada estágio do FIR ou saída a média da entrada para esse estágio e seu valor armazenado anterior, e depois armazenar a entrada (se tiver O intervalo numérico, pode-se usar a soma em vez da média). Se isso é melhor do que um filtro de caixa depende da aplicação (a resposta de passo de um filtro de caixa com um atraso total de 1ms, por exemplo, terá um pico d2 / dt desagradável quando a mudança de entrada e novamente 1ms mais tarde, mas terá O mínimo possível d / dt para um filtro com um atraso total de 1 ms). Como disse mikeselectricstuff, se você realmente precisa reduzir suas necessidades de memória, e você não se importa sua resposta ao impulso é uma exponencial (em vez de um pulso retangular), eu iria para um filtro de média móvel exponencial . Eu uso-os extensivamente. Com esse tipo de filtro, você não precisa de nenhum buffer. Você não tem que armazenar N amostras passadas. Apenas um. Assim, seus requisitos de memória são cortados por um fator de N. Além disso, você não precisa de qualquer divisão para isso. Somente multiplicações. Se você tiver acesso a aritmética de ponto flutuante, use multiplicações de ponto flutuante. Caso contrário, faça multiplicações inteiras e desloque para a direita. No entanto, estamos em 2012, e eu recomendo que você use compiladores (e MCUs) que permitem que você trabalhe com números de ponto flutuante. Além de ser mais memória eficiente e mais rápido (você não tem que atualizar itens em qualquer buffer circular), eu diria que é também mais natural. Porque uma resposta de impulso exponencial corresponde melhor à maneira como a natureza se comporta, na maioria dos casos. Um problema com o filtro IIR como quase tocado por olin e supercat mas aparentemente desconsiderado por outros é que o arredondamento para baixo introduz alguma imprecisão (e potencialmente viés / truncamento). Assumindo que N é uma potência de dois, e apenas aritmética inteira é usada, o deslocamento direto sistematicamente elimina os LSBs da nova amostra. Isso significa que quanto tempo a série poderia ser, a média nunca vai levar esses em conta. Por exemplo, suponha uma série lentamente decrescente (8,8,8,8,7,7,7,7,6,6) e suponha que a média é realmente 8 no início. A amostra do punho 7 trará a média para 7, independentemente da intensidade do filtro. Apenas para uma amostra. Mesma história para 6, etc. Agora pense no oposto. A série sobe. A média ficará em 7 para sempre, até que a amostra seja grande o suficiente para fazer a mudança. Claro, você pode corrigir o viés adicionando 1 / 2N / 2, mas isso não vai realmente resolver o problema de precisão. Nesse caso a série decrescente permanecerá para sempre em 8 até que a amostra seja 8-1 / 2 (N / 2). Para N4, por exemplo, qualquer amostra acima de zero manterá a média inalterada. Acredito que uma solução para isso implicaria manter um acumulador dos LSBs perdidos. Mas eu não fui longe o suficiente para ter o código pronto, e não tenho certeza que não iria prejudicar o poder IIR em alguns outros casos de série (por exemplo, se 7,9,7,9 seria média para 8 então). Olin, sua cascata de dois estágios também precisaria de alguma explicação. Você quer dizer segurando dois valores médios com o resultado do primeiro alimentado para o segundo em cada iteração. Qual é o benefício desta média / média móvel simples Médias / 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. Criar uma função stateful / classe / instância 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�ia m�el simples �um m�odo para calcular uma m�ia de um fluxo de n�eros calculando apenas a m�ia dos �timos n�eros de 160 P 160 a partir do fluxo 160, em que 160 P 160 �conhecido como o per�do. Ele pode ser implementado chamando uma rotina de iniciação com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de Para), os últimos 160 P 160 deles, vamos chamar este 160 SMA (). A palavra 160 estado 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar determinadas informações entre as chamadas para ele: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um dos Suas chamadas individuais. Stateful 160 também significa que chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que não 160 não 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 conter os valores p mais recentes. Cada função retornada de init-moving-average tem seu estado em um átomo contendo 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 de lista que mantém o valor apenas movendo para fora da janela e para ser substituído com o valor apenas adicionado. Usando um fechamento editar Atualmente este sma não pode ser nogc porque ele aloca um encerramento no heap. Alguma análise de escape pode remover a alocação de heap. Usando uma edição de estrutura Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: Para evitar que as aproximações de ponto flutuante sigam se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Esta implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (ler a partir da escrita) em vez de combiná-los em um 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 embutido p, que é usado como o período da média móvel simples. A função de execução lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida pela entrada agrupada, formando a base de cada média móvel. Erlang tem fechamentos, mas variáveis ​​imutáveis. Uma solução então é usar processos e uma simples mensagem passando API baseada. As linguagens de matriz têm rotinas para calcular os avarages deslizando para uma determinada seqüência de itens. É menos eficiente para loop como nos comandos a seguir. Solicita continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND / 1, e a média pode ser encontrada em List / OPS 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: list é 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 definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), eo 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 de índice, e aponta para o fim da sub-lista a lista sendo calculada a 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 cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será utilizado no cálculo médio. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo será normalmente negativo, de modo que a seguinte equação evitará índices negativos: max (i-p1,1) ou, arranjar 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 - índice de início 1) ou, arranjar a equação, (i - (max (ip, 0) 1) e então , (I-max (ip, 0)). A variável z detém o valor comum (max (ip), 0) então o beginindex será (z1) e os numberofelements serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média .) Irá somá-los soma (.) / (Iz) ri irá média deles e armazenar o resultado no lugar apropriado na lista de resultados Usando um fecho e criando uma função

Comments

Popular posts from this blog

Forex Trading Software Com Sinais

Sinais comerciais grátis. INSCREVA-SE AGORA Troque em 3 etapas simples sob 10 minutos um o dia não tem o tempo ao comércio Tente nosso serviço de cópia do comércio Troca intradiária sinais do PIT EOD sinais negociando SL 038 TP 100 automatizado nenhuma experimentação do começo do cerco agora Cancelar todo o tempo Sinais de troca Intraday Tempo real ARB Alertas de sinais em seu dispositivo inteligente: Taxas de moeda ao vivo Social Feed Download Apps Destaque em Forex gerenciado Negociação de conta Os sinais são grandes. Ele é muito consciente sobre o que está fazendo. Ele atualiza todos os dias os sinais. Eu recomendaria definitivamente Arbtraders sinais. Pablo, Bélgica Muito cedo, mas eu fui testado Beta desde o início e os sinais de negociação são excelentes, muito claro, fácil de seguir, rápido e acima de tudo eles são rentáveis. Eu precisaria demo para um período muito mais longo de tempo antes de recomendar dinheiro real, mas até agora tão bom. Ive seguiu Arbtrader antes em outras

Is Binary Options Better Than Forexpros

Forex vs opções binárias. O que é melhor Esta pergunta totalmente banal é feita com muita freqüência. Banal One é uma classe de ativos, o outro um instrumento financeiro Forex vs opções binárias Seria bom saber a resposta para a questão de saber se a negociação forex é melhor do que negociar opções binárias e vice-versa. Isso pode ajudar alguns comerciantes que se encontraram no mercado errado para fazer o reajuste, especialmente porque há muitos comerciantes que perderam um monte de dinheiro junketing de um mercado financeiro para o outro. Vamos tentar rever os prós e contras de negociação de opções de forex e binário sob os seguintes títulos: b) facilidade de comércio c) fator de rentabilidade d) facilidade de entrada no mercado elemento de risco um elemento-chave da diferença entre forex eo mercado de opções binárias é De risco. Negociar o mercado forex é mais arriscado do que negociar o mercado de opções binárias de várias maneiras. A) O mercado forex é um mercado altamente alavanc

Forex 101

O que é Forex Forex é o mercado onde todas as moedas mundiais comércio. O mercado forex é o maior mercado, mais líquido do mundo, com um volume médio diário de negociação superior a 5 trilhões. Não existe uma central de câmbio, uma vez que é negociada ao balcão. Forex trading permite que você compre e venda moedas, semelhante à negociação de ações, exceto que você pode fazê-lo 24 horas por dia, cinco dias por semana, você tem acesso à margem comercial, e você ganha exposição aos mercados internacionais. Para uma introdução mais aprofundada para o mercado de forex, obter FXCMs Novo para Forex Trading Guide. Forex 101 Aprender a negociar em um novo mercado é como aprender a falar uma nova língua. É mais fácil quando você tem um bom vocabulário e compreender algumas idéias e conceitos básicos. Então vamos começar com o básico da negociação forex. O que estou fazendo quando eu troco Forex Forex é uma abreviatura comumente usada para câmbio, e é tipicamente usado para descrever a negociação