Moving Average Este exemplo ensina como calcular a média móvel de uma série de tempo no Excel. Um avanço em movimento é usado para suavizar irregularidades (picos e vales) para reconhecer facilmente as tendências. 1. Primeiro, vamos dar uma olhada em nossa série de tempo. 2. No separador Dados, clique em Análise de dados. Observação: não é possível encontrar o botão Análise de dados Clique aqui para carregar o suplemento do Analysis ToolPak. 3. Selecione Média móvel e clique em OK. 4. Clique na caixa Input Range e selecione o intervalo B2: M2. 5. Clique na caixa Intervalo e escreva 6. 6. Clique na caixa Output Range e seleccione a célula B3. 8. Faça um gráfico destes valores. Explicação: porque definimos o intervalo como 6, a média móvel é a média dos 5 pontos de dados anteriores eo ponto de dados atual. Como resultado, os picos e vales são suavizados. O gráfico mostra uma tendência crescente. O Excel não consegue calcular a média móvel para os primeiros 5 pontos de dados porque não existem pontos de dados anteriores suficientes. 9. Repita os passos 2 a 8 para intervalo 2 e intervalo 4. Conclusão: Quanto maior o intervalo, mais os picos e vales são suavizados. Quanto menor o intervalo, mais próximas as médias móveis são para os pontos de dados reais. Você gosta deste site gratuito Por favor, compartilhe esta página no Google Eu quero implementar um algoritmo iterativo, que calcula a média ponderada. A lei do peso específico não importa, mas deve ser próxima de 1 para os valores mais recentes e perto de 0 para o mais antigo. O algoritmo deve ser iterativo. Isto é, não deve recordar todos os valores anteriores. Deve saber apenas um valor mais recente e qualquer informação agregativa sobre passado, como valores anteriores da média, somas, contagens etc. Por exemplo, o seguinte algoritmo pode ser: Dará peso exponencial decrescente, o que pode não ser bom. É possível ter a etapa que diminui o peso ou algo o que os requisitos para pesando a lei é seguinte: 1) O peso diminui em 2 passado) I tem alguma duração média ou característica de modo que os valores mais velhos esta duração importam muito menos do que uns mais novos 3) Deve ser capaz de definir esta duração eu preciso o seguinte. Suponha que vi são valores, onde v1 é o primeiro. Também suponha wi são pesos. Mas w0 é o ÚLTIMO. Então, após o primeiro valor veio eu tenho a primeira média Depois que o segundo valor v2 veio, eu deveria ter média Com o próximo valor eu deveria ter Nota, esse perfil de peso está se movendo comigo, enquanto eu estou movendo ao longo da seqüência de valor. I. e. Cada valor não tem seu próprio peso o tempo todo. Meu objetivo é ter esse peso mais baixo enquanto vai para o passado. Gt Mas minha tarefa é ter a média recalculada cada vez que o novo valor chega com valores antigos reponderados. OP Sua tarefa é quase sempre impossível, mesmo com esquemas de ponderação excepcionalmente simples. Você está pedindo, com O (1) memória, as médias de rendimento com um esquema de ponderação em mudança. Por exemplo, à medida que novos valores estão sendo passados, para alguns quase arbitrariamente mudar pesos seqüência. Isso é impossível devido à injetividade. Uma vez que você mescla os números juntos, você perde uma enorme quantidade de informações. Por exemplo, mesmo se você tivesse o vetor de peso. Não foi possível recuperar o vetor de valor original ou vice-versa. Há apenas dois casos que eu posso pensar onde você poderia fugir com isso: pesos constantes, tais como 2,2,2. 2: isso é equivalente a um algoritmo de média on-line, que você não quer porque os valores antigos não estão sendo reponderados. Os pesos relativos das respostas anteriores não mudam. Por exemplo, você poderia fazer pesos de 8,4,2,1. E adicionar em um novo elemento com peso arbitrário como. 1. mas você deve aumentar todos os anteriores pelo mesmo fator multiplicativo, como 16,8,4,21. Assim, a cada passo, você está adicionando um novo peso arbitrário e um novo reescalonamento arbitrário do passado, então você tem 2 graus de liberdade (somente 1 se você precisa manter seu produto ponto normalizado). Os vetores de peso que você obtém pareceriam: Assim, qualquer esquema de ponderação que você possa fazer parecer que vai funcionar (a menos que você precise manter a coisa normalizada pela soma dos pesos, caso em que você deve dividir a nova média pelo novo Soma, que você pode calcular mantendo apenas O (1) memória). Simplesmente multiplique a média anterior pelo novo s (que implicitamente distribuirá sobre o ponto-produto nos pesos) e adere ao novo valor de wnew. Aqui estou supondo que você quer os pesos para somar a 1. Desde que você pode gerar um peso relativo sem ele mudar no futuro, você pode acabar com uma solução que imita esse comportamento. Isto é, suponha que você definiu seus pesos como uma seqüência e definiu a entrada como seqüência. Considere a forma: soma (s0i0 s1i1 s2i2. Snin) / soma (s0 s1 s2. Sn). Note-se que é trivialmente possível calcular este incrementalmente com um par de contadores de agregação: Claro, calculateWeightFromCounter () neste caso shouldnt gerar pesos que somam a um - o truque aqui é que nós médio dividindo pela soma dos pesos De modo que no final, os pesos praticamente parecem somar a um. O verdadeiro truque é como você faz calculateWeightFromCounter (). Você poderia simplesmente retornar o próprio contador, por exemplo, no entanto, note que o último número ponderado não seria perto da soma dos contadores necessariamente, então você pode não acabar com as propriedades exatas que você deseja. (É difícil dizer desde, como mencionado, você deixou um problema bastante aberto.) Respondeu Mar 28 12 às 21:45 O problema é que os pesos estão mudando com cada novo valor. No seu caso, eles não são. Ndash Suzan Cioc Mar 29 12 at 14:43 Os pesos reais usados estão mudando com cada novo valor - os quotweightsquot estão sendo divididos por um número sucessivamente maior, impondo assim que os pesos reais usados sempre somam a 1. ndash Kaganar Mar 29 12 At 14:45 Isso é muito longo para postar em um comentário, mas pode ser útil saber. Suponha que você tem: w0vn. Wnv0 (bem chamar isso w0..nvn..0 para breve) Então o próximo passo é: w0vn1. Wn1v0 (e isto é w0..n1vn1..0 para o short) Isto significa que nós precisamos uma maneira de calcular w1..n1vn..0 de w0..nvn..0. É certamente possível que vn..0 seja 0. 0, z, 0. 0 onde z está em algum local x. Se não temos qualquer armazenamento extra, então f (zw (x)) zw (x 1) onde w (x) é o peso para a localização x. Reorganizando a equação, w (x 1) f (zw (x)) / z. Bem, w (x 1) melhor ser constante para uma constante x, então f (zw (x)) / z melhor ser constante. Portanto, f deve deixar z propagar - isto é, f (zw (x)) zf (w (x)). Mas aqui novamente temos um problema. Note que se z (que pode ser qualquer número) pode propagar através de f. Então w (x) certamente pode. Assim, f (zw (x)) w (x) f (z). Assim, f (w (x)) w (x) / f (z). Mas para um x constante. W (x) é constante, e portanto f (w (x)) também será constante. W (x) é constante, então f (z) melhor ser constante de modo que w (x) / f (z) é constante. Assim, f (w (x)) w (x) / c em que c é uma constante. Assim, f (x) cx em que c é uma constante quando x é um valor de peso. Ou seja, cada peso é um múltiplo do anterior. Assim, os pesos assumem a forma w (x) mbx. Observe que isso pressupõe que a única informação f seja o último valor agregado. Note que em algum momento você será reduzido a este caso, a menos que você esteja disposto a armazenar uma quantidade não constante de dados representando sua entrada. Você não pode representar um vetor de comprimento infinito de números reais com um número real, mas pode aproximá-los de alguma forma em uma quantidade constante e finita de armazenamento. Mas isso seria meramente uma aproximação. Embora eu não tenha provado isso rigorosamente, é minha conclusão que o que você quer é impossível de fazer com um alto grau de precisão, mas você pode ser capaz de usar log (n) espaço (que também pode ser O (1) para muitos Aplicações práticas) para gerar uma aproximação de qualidade. Você pode ser capaz de usar ainda menos. Respondeu Mar 29 12 at 23:01 Eu tentei praticamente codificar algo (em Java). Como foi dito, seu objetivo não é realizável. Você só pode contar a média de um número de últimos valores lembrados. Se você não precisa ser exato, você pode aproximar os valores mais antigos. Eu tentei fazê-lo lembrando os últimos 5 valores exatamente e os valores mais antigos apenas somado por 5 valores, lembrando os últimos 5 SUMs. Então, a complexidade é O (2n) para lembrar os últimos valores nnn. Esta é uma aproximação muito grosseira. Você pode modificar os tamanhos de matriz lastValues e lasAggregatedSums como você deseja. Veja esta imagem ascii-art tentando exibir um gráfico dos últimos valores, mostrando que as primeiras colunas (dados mais antigos) são lembradas como valor agregado (não individualmente), e somente os primeiros 5 valores são lembrados individualmente. Desafio 1. Meu exemplo não conta pesos, mas eu acho que não deveria ser problema para você adicionar pesos para o LastAggregatedSums apropriadamente - o único problema é que se você quiser pesos mais baixos para valores mais antigos, seria mais difícil, porque a matriz está girando, então Não é fácil saber qual o peso para qual membro da matriz. Talvez você pode modificar o algoritmo para sempre mudar valores na matriz em vez de girar Em seguida, adicionando pesos shouldnt ser um problema. Desafio 2. Os arrays são inicializados com 0 valores, e esses valores estão contando com a média desde o início, mesmo quando não temos receber valores suficientes. Se você estiver executando o algoritmo por muito tempo, você provavelmente não se preocupe que ele está aprendendo por algum tempo no início. Se você fizer isso, você pode postar uma modificação -) respondeu Jan 21 14 at 15:59 Sua resposta 2016 Stack Exchange, Incmoving average Média de dados de séries temporais (observações igualmente espaçadas no tempo) de vários períodos consecutivos. Chamado de movimento porque é continuamente recalculado à medida que novos dados se tornam disponíveis, ele progride caindo o valor mais antigo e adicionando o valor mais recente. Por exemplo, a média móvel das vendas de seis meses pode ser calculada tomando a média das vendas de janeiro a junho, depois a média das vendas de fevereiro a julho, depois de março a agosto, e assim por diante. As médias móveis (1) reduzem o efeito de variações temporárias nos dados, (2) melhoram o ajuste dos dados para uma linha (um processo chamado suavização) para mostrar a tendência dos dados mais claramente e (3) realçam qualquer valor acima ou abaixo do valor tendência. Se você está calculando algo com variação muito alta o melhor que você pode ser capaz de fazer é descobrir a média móvel. Eu queria saber qual era a média móvel dos dados, então eu teria uma melhor compreensão de como estávamos fazendo. Quando você está tentando descobrir alguns números que mudam muitas vezes o melhor que você pode fazer é calcular a média móvel. O melhor do BusinessDictionary, entregue diariamente 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 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 de 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 de ruído aleatória. 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 exigem 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 de entrada e de média para o seu 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ê precisar 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 é um número inteiro 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: www. 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. Na segunda coluna desta tabela, é mostrada uma média móvel de ordem 5, fornecendo uma estimativa do ciclo de tendência. O primeiro valor nesta coluna é a média das cinco primeiras observações (1989-1993) o segundo valor na coluna 5-MA é a média dos valores 1990-1994 e assim por diante. Cada valor na coluna 5-MA é a média das observações no período de cinco anos centrado no ano correspondente. Não há valores para os dois primeiros anos ou últimos dois anos porque não temos duas observações de cada lado. Na fórmula acima, a coluna 5-MA contém os valores de hat com k2. Para ver como é a estimativa do ciclo tendencial, traçamos o gráfico juntamente com os dados originais da Figura 6.7. Lote 40 elecsales, principal quotResidential vendas de eletricidade, ylab quotGWhquot. Observe como a tendência (em vermelho) é mais suave do que os dados originais e captura o movimento principal da série de tempo sem todas as pequenas flutuações. O método da média móvel não permite estimativas de T em que t está próximo das extremidades da série, portanto, a linha vermelha não se estende para os bordos do gráfico em qualquer lado. Mais tarde usaremos métodos mais sofisticados de estimativa de tendência-ciclo que permitem estimativas próximas aos pontos finais. A ordem da média móvel determina a suavidade da estimativa de tendência-ciclo. Em geral, uma ordem maior significa uma curva mais suave. O gráfico a seguir mostra o efeito da alteração da ordem da média móvel para os dados de vendas de eletricidade residencial. As médias móveis simples como estas são normalmente de ordem ímpar (por exemplo, 3, 5, 7, etc.). Isto é assim que são simétricas: numa média móvel de ordem m2k1, há k observações anteriores, k observações posteriores e a observação do meio Que são médias. Mas se m fosse uniforme, não seria mais simétrico. Médias móveis de médias móveis É possível aplicar uma média móvel a uma média móvel. Uma razão para fazer isso é fazer uma média móvel de ordem uniforme simétrica. Por exemplo, podemos pegar uma média móvel de ordem 4 e, em seguida, aplicar outra média móvel de ordem 2 aos resultados. Na Tabela 6.2, isto foi feito para os primeiros anos dos dados da produção de cerveja trimestral australiana. Beer2 lt - window 40 ausbeer, início 1992 41 ma4 ltm 40 beer2, ordem 4. center FALSE 41 ma2x4 ltm 40 beer2, ordem 4. center TRUE 41 A notação 2times4-MA na última coluna significa um 4-MA Seguido por um 2-MA. Os valores na última coluna são obtidos tomando uma média móvel de ordem 2 dos valores na coluna anterior. Por exemplo, os dois primeiros valores na coluna 4-MA são 451,2 (443410420532) / 4 e 448,8 (410420532433) / 4. O primeiro valor na coluna 2times4-MA é a média destes dois: 450,0 (451.2448.8) / 2. Quando um 2-MA segue uma média móvel de ordem par (como 4), é chamado de média móvel centrada de ordem 4. Isto é porque os resultados são agora simétricos. Para ver que este é o caso, podemos escrever o 2times4-MA da seguinte forma: begin hat amp frac Bigfrac (y y y y) frac (y y y y) Big frac fray frac14y frac14y frac14y frac18y. Fim É agora uma média ponderada das observações, mas é simétrica. Outras combinações de médias móveis também são possíveis. Por exemplo, um 3 x 3 MA é frequentemente utilizado e consiste numa média móvel de ordem 3 seguida por outra média móvel de ordem 3. Em geral, uma ordem par MA deve ser seguida por uma ordem par MA para torná-lo simétrico. Similarmente, uma ordem ímpar MA deve ser seguida por uma ordem ímpar MA. Estimativa do ciclo de tendência com dados sazonais O uso mais comum de médias móveis centradas é estimar o ciclo de tendência a partir de dados sazonais. Considere o 2x4-MA: fracasso do chapéu frac14y frac14y frac14y frac18y. Quando aplicado a dados trimestrais, cada trimestre do ano recebe igual peso, uma vez que o primeiro eo último termo se aplicam ao mesmo trimestre em anos consecutivos. Conseqüentemente, a variação sazonal será média e os valores resultantes de hat t terão pouca ou nenhuma variação sazonal restante. Obter-se-ia um efeito semelhante utilizando uma mistura de 2 x 8-MA ou 2 x 12-MA. Em geral, uma m-MA 2x é equivalente a uma média móvel ponderada de ordem m1 com todas as observações tomando peso 1 / m, exceto para o primeiro e último termos que tomam pesos 1 / (2m). Portanto, se o período sazonal é par e de ordem m, use um m-MA de 2x para estimar o ciclo tendencial. Se o período sazonal é ímpar e de ordem m, use um m-MA para estimar o ciclo de tendência. Em particular, um 2 x 12-MA pode ser usado para estimar o ciclo de tendência de dados mensais e um 7-MA pode ser usado para estimar o ciclo tendência de dados diários. Outras escolhas para a ordem do MA normalmente resultarão em estimativas de ciclo de tendência sendo contaminadas pela sazonalidade nos dados. Exemplo 6.2 Fabricação de equipamento elétrico A Figura 6.9 mostra uma 2 x 12-MA aplicada ao índice de ordens de equipamentos elétricos. Observe que a linha lisa não mostra sazonalidade é quase o mesmo que o ciclo de tendência mostrado na Figura 6.2 que foi estimado usando um método muito mais sofisticado do que as médias móveis. Qualquer outra escolha para a ordem da média móvel (exceto 24, 36, etc.) teria resultado em uma linha suave que mostra algumas flutuações sazonais. Plot 40 elecequip, ylab quotNovas ordens indicequot. Col quotgrayquot, main quotred 41 Química média ponderada As médias combinadas das médias móveis resultam em médias móveis ponderadas. Por exemplo, o 2x4-MA discutido acima é equivalente a um 5-MA ponderado com pesos dados por frac, frac, frac, frac, frac. Em geral, uma m-MA ponderada pode ser escrita como hat t sum k aj y, onde k (m-1) / 2 e os pesos são dados por a, dots, ak. É importante que todos os pesos somem a um e que sejam simétricos para que aj a. O m-MA simples é um caso especial onde todos os pesos são iguais a 1 / m. Uma grande vantagem das médias móveis ponderadas é que elas produzem uma estimativa mais suave do ciclo tendencial. Em vez das observações que entram e que deixam o cálculo no peso cheio, seus pesos são aumentados lentamente e então lentamente diminuídos resultando em uma curva mais lisa. Alguns conjuntos específicos de pesos são amplamente utilizados. Alguns deles são apresentados na Tabela 6.3.
No comments:
Post a Comment