O cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Uma grande vantagem do filtro de média móvel é que ele pode ser implementado com um algoritmo que é muito rápido. Para entender esse algoritmo, imagine passar um sinal de entrada, x, através de um filtro de média móvel de sete pontos para formar um sinal de saída, y. Agora, veja como dois pontos de saída adjacentes, y 50 e y 51, são calculados: Estes são quase os mesmos pontos de cálculo x 48 a x 53 devem ser adicionados para y 50 e novamente para y 51. Se y 50 já foi calculado , A maneira mais eficiente de calcular y 51 é: Uma vez que y 51 tenha sido encontrado usando y 50, então y 52 pode ser calculado a partir da amostra y 51, e assim por diante. Depois que o primeiro ponto é calculado em y, todos os outros pontos podem ser encontrados com apenas uma única adição e subtração por ponto. Isso pode ser expresso na equação: Observe que esta equação usa duas fontes de dados para calcular cada ponto na saída: pontos a partir da entrada e pontos previamente calculados a partir da saída. Isso é chamado de equação recursiva, o que significa que o resultado de um cálculo é usado em cálculos futuros. (O termo recursivo também tem outros significados, especialmente na informática). O Capítulo 19 discute uma variedade de filtros recursivos em mais detalhes. Lembre-se de que o filtro recursivo de média móvel é muito diferente dos filtros recursivos típicos. Em particular, a maioria dos filtros recursivos tem uma resposta de impulso infinitamente longa (IIR), composta de sinusoides e exponenciais. A resposta de impulso da média móvel é um pulso retangular (resposta de impulso finito, ou FIR). Este algoritmo é mais rápido que outros filtros digitais por várias razões. Primeiro, há apenas dois cálculos por ponto, independentemente do comprimento do kernel do filtro. Em segundo lugar, a adição e subtração são as únicas operações matemáticas necessárias, enquanto a maioria dos filtros digitais requerem multiplicação demorada. Em terceiro lugar, o esquema de indexação é muito simples. Cada índice na Eq. 15-3 é encontrado adicionando ou subtraindo constantes inteiras que podem ser calculadas antes do início da filtragem (isto é, p e q). Em seguida, todo o algoritmo pode ser realizado com representação de inteiro. Dependendo do hardware usado, os inteiros podem ser mais do que uma ordem de magnitude mais rápida do que o ponto flutuante. Surpreendentemente, a representação de números inteiros funciona melhor do que o ponto flutuante com este algoritmo, além de ser mais rápido. O erro round-off de aritmética de ponto flutuante pode produzir resultados inesperados se você não for cuidadoso. Por exemplo, imagine um sinal de 10.000 amostras sendo filtrado com este método. A última amostra no sinal filtrado contém o erro acumulado de 10.000 adições e 10.000 subtracções. Isso aparece no sinal de saída como um deslocamento à deriva. Os inteiros não têm esse problema porque não há nenhum erro round-off na aritmética. Se você deve usar ponto flutuante com este algoritmo, o programa na Tabela 15-2 mostra como usar um acumulador de dupla precisão para eliminar este drift. FIR filtros, filtros IIR, ea equação de diferença de coeficiente constante linear Causal Moving Average (FIR) Filtros Weve discutido sistemas em que cada amostra da saída é uma soma ponderada de (algumas das) as amostras da entrada. Vamos tomar um sistema de soma ponderada causal, onde causal significa que uma dada amostra de saída depende apenas da amostra de entrada atual e outros insumos mais cedo na seqüência. Nem os sistemas lineares em geral, nem os sistemas finitos de resposta ao impulso em particular, precisam ser causais. No entanto, a causalidade é conveniente para um tipo de análise que iria explorar em breve. Se simbolizamos as entradas como valores de um vetor x. E as saídas como valores correspondentes de um vetor y. Então tal sistema pode ser escrito como onde os valores de b são quotweights aplicados às amostras de entrada atuais e anteriores para obter a amostra de saída atual. Podemos pensar na expressão como uma equação, com o sinal de igual signo igual a, ou como uma instrução processual, com o sinal de igual significação atribuição. Vamos escrever a expressão para cada amostra de saída como um loop MATLAB de instruções de atribuição, onde x é um vetor N-comprimento de amostras de entrada, e b é um vetor M-comprimento de pesos. A fim de lidar com o caso especial no início, vamos incorporar x em um vetor mais longo xhat cujas primeiras M-1 amostras são zero. Vamos escrever a soma ponderada para cada y (n) como um produto interno, e faremos algumas manipulações das entradas (como inverter b) para este fim. Esse tipo de sistema é muitas vezes chamado de filtro de média móvel, por razões óbvias. De nossas discussões anteriores, deve ser óbvio que tal sistema é linear e invariante ao deslocamento. Claro, seria muito mais rápido usar a convolução de função MATLAB conv () em vez do nosso mafilt (). Em vez de considerar as primeiras M-1 amostras da entrada de ser zero, poderíamos considerá-los a ser o mesmo que as últimas M-1 amostras. Isso é o mesmo que tratar a entrada como periódica. Bem, use cmafilt () como o nome da função, uma pequena modificação da função mafilt () anterior. Na determinação da resposta de impulso de um sistema, não há geralmente nenhuma diferença entre estes dois, desde que todas as amostras não-iniciais da entrada são zero: Uma vez que um sistema deste tipo é linear e shift-invariante, sabemos que seu efeito em qualquer Sinusoid será apenas a escala e deslocá-lo. Aqui é importante que usemos a versão circular A versão circularmente convoluta é deslocada e escalada um pouco, enquanto a versão com convolução ordinária é distorcida no início. Vamos ver o que a escala exata e deslocamento é usando um fft: Tanto a entrada ea saída têm amplitude apenas nas freqüências 1 e -1, que é como deveria ser, uma vez que a entrada era uma sinusoid eo sistema era linear. Os valores de saída são maiores em uma proporção de 10,6251 / 8 1,3281. Este é o ganho do sistema. E quanto à fase Nós só precisamos olhar onde a amplitude é diferente de zero: A entrada tem uma fase de pi / 2, como nós pedimos. A fase de saída é deslocada por um 1,0594 adicional (com sinal oposto para a freqüência negativa), ou cerca de 1/6 de um ciclo à direita, como podemos ver no gráfico. Agora vamos tentar uma sinusoid com a mesma freqüência (1), mas em vez de amplitude 1 e fase pi / 2, vamos tentar amplitude 1,5 e fase 0. Sabemos que apenas a freqüência 1 e -1 terá amplitude não-zero, então vamos Basta olhar para eles: Novamente a relação de amplitude (15.9377 / 12.0000) é 1.3281 - e quanto à fase é novamente deslocado por 1.0594 Se esses exemplos são típicos, podemos prever o efeito do nosso sistema (resposta ao impulso .1.2 .3 .4 .5) em qualquer sinusoide com frequência 1 - a amplitude será aumentada em um fator de 1,3281 e a fase (freqüência positiva) será deslocada em 1,0594. Poderíamos continuar a calcular o efeito desse sistema sobre sinusóides de outras freqüências pelos mesmos métodos. Mas há uma maneira muito mais simples, e uma que estabelece o ponto geral. Dado que a circunvolução (circular) no domínio do tempo significa a multiplicação no domínio da frequência, daí decorre que, por outras palavras, a DFT da resposta de impulso é a razão da DFT da saída para a DFT da entrada. Nesta relação os coeficientes de DFT são números complexos. Desde abs (c1 / c2) abs (c1) / abs (c2) para todos os números complexos c1, c2, esta equação nos diz que o espectro de amplitude da resposta de impulso será sempre a relação do espectro de amplitude da saída para que Da entrada. No caso do espectro de fase, ângulo (c1 / c2) ângulo (c1) - ângulo (c2) para todos os c1, c2 (com a ressalva de que as fases que diferem por n2pi são considerados iguais). Portanto, o espectro de fase da resposta ao impulso será sempre a diferença entre os espectros de fase da saída e da entrada (com quaisquer correções de 2pi são necessárias para manter o resultado entre - pi e pi). Podemos ver os efeitos de fase mais claramente se desempacotar a representação da fase, isto é, se adicionarmos vários múltiplos de 2pi conforme necessário para minimizar os saltos que são produzidos pela natureza periódica da função ângulo (). Embora a amplitude e a fase sejam normalmente utilizadas para apresentação gráfica e mesmo tabular, uma vez que são uma maneira intuitiva de pensar sobre os efeitos de um sistema sobre os vários componentes de frequência de sua entrada, os coeficientes de Fourier complexos são mais úteis algébricamente, A expressão simples da relação A abordagem geral que acabamos de ver funcionará com filtros arbitrários do tipo esboçado, em que cada amostra de saída é uma soma ponderada de algum conjunto de amostras de entrada. Como mencionado anteriormente, estes são freqüentemente chamados filtros de resposta de impulso finito, porque a resposta ao impulso é de tamanho finito, ou às vezes filtros de média móvel. Podemos determinar as características de resposta de freqüência de tal filtro da FFT de sua resposta de impulso e também podemos projetar novos filtros com características desejadas por IFFT a partir de uma especificação da resposta de freqüência. Filtros Autoregressivos (IIR) Não haveria nenhum ponto em ter nomes para filtros FIR a menos que houvesse algum outro tipo de distinção, de modo que aqueles que estudaram pragmática não ficarão surpresos ao saber que existe de fato outro tipo principal Do filtro tempo-invariante linear. Estes filtros são às vezes chamados recursivos porque o valor das saídas anteriores (assim como entradas anteriores) importa, embora os algoritmos sejam geralmente escritos usando construções iterativas. Eles também são chamados filtros Infinite Impulse Response (IIR), porque em geral sua resposta a um impulso continua para sempre. Eles também são às vezes chamados de filtros auto-regressivos, porque os coeficientes podem ser considerados como o resultado de fazer uma regressão linear para expressar valores de sinal em função de valores de sinal anteriores. A relação dos filtros FIR e IIR pode ser vista claramente numa equação de diferença de coeficiente constante linear, isto é, estabelecendo uma soma ponderada de saídas igual a uma soma ponderada de entradas. Isto é como a equação que damos anteriormente para o filtro causal FIR, exceto que, além da soma ponderada de insumos, também temos uma soma ponderada de saídas. Se quisermos pensar nisso como um procedimento para gerar amostras de saída, precisamos reorganizar a equação para obter uma expressão para a amostra de saída corrente y (n), Adotando a convenção de que a (1) 1 (por exemplo, escalando outros como E bs), podemos nos livrar do termo 1 / a (1): y (n) b (1) x (n) b (2) x (n-1). B (Nb1) x (n-nb) - a (2) y (n-1) -. - a (Na1) y (n-na) Se todos os a (n) diferentes de a (1) são zero, isso reduz a nosso velho amigo o filtro FIR causal. Este é o caso geral de um filtro (causal) LTI, e é implementado pelo filtro de função MATLAB. Vejamos o caso em que os coeficientes b diferentes de b (1) são zero (em vez do caso FIR, onde a (n) são zero): Neste caso, a amostra de saída corrente y (n) é calculada como um (N-1), y (n-2), etc. Para ter uma idéia do que acontece com esses filtros, vamos começar com o caso em que: Ou seja, a amostra de saída atual é a soma da amostra de entrada atual e metade da amostra de saída anterior. Bem, tome um impulso de entrada através de alguns passos de tempo, um de cada vez. Deve ficar claro neste ponto que podemos facilmente escrever uma expressão para o n-ésimo valor de amostra de saída: é apenas (se MATLAB contado a partir de 0, isso seria simplesmente .5n). Como o que estamos calculando é a resposta ao impulso do sistema, demonstrámos por exemplo que a resposta ao impulso pode de fato ter infinitas amostras diferentes de zero. Para implementar esse filtro trivial de primeira ordem no MATLAB, poderíamos usar o filtro. A chamada será assim: eo resultado é: Este negócio é realmente ainda linear Podemos olhar para isto empiricamente: Para uma abordagem mais geral, considere o valor de uma amostra de saída y (n). Por substituição sucessiva poderíamos escrever isto como Isto é exatamente como nosso velho amigo a forma convolução-soma de um filtro FIR, com a resposta de impulso fornecida pela expressão .5k. E o comprimento da resposta ao impulso é infinito. Assim, os mesmos argumentos que usamos para mostrar que os filtros FIR eram lineares agora se aplicam aqui. Até agora isso pode parecer um monte de barulho por não muito. O que é toda esta linha de investigação bom para Bem responder esta questão em etapas, começando com um exemplo. Não é uma grande surpresa que possamos calcular uma amostra exponencial por multiplicação recursiva. Vamos olhar para um filtro recursivo que faz algo menos óbvio. Este tempo bem torná-lo um filtro de segunda ordem, de modo que a chamada para filtro será da forma Permite definir o segundo coeficiente de saída a2 para -2cos (2pi / 40), eo terceiro coeficiente de saída a3 para 1, e olhar para A resposta ao impulso. Não muito útil como um filtro, na verdade, mas ele gera uma onda senoidal amostrada (de um impulso) com três multiplicações por amostra. Para entender como e por que ele faz isso, e como os filtros recursivos podem ser projetados e analisados em O caso mais geral, precisamos dar um passo atrás e dar uma olhada em algumas outras propriedades de números complexos, no caminho para a compreensão da transformada z. Recursive Moving Average Filtro bull bull quot (0) 0 bull 2 160160160160 O filtro de média móvel é Um filtro FIR de comprimento N com todas as torneiras definidas igual a (1 / N) .160 É conhecida por sua péssima separação de freqüência, mas excelente resposta no tempo - nesse sentido, ele fora - Bessels um filtro Bessel.160 Você pode implementá-lo com SigmaStudios bloco FIR como descrito aqui: Quanto mais tempo o filtro, mais suavização - mas o algoritmo de filtro FIR padrão usa muitas instruções para filtros enormes, porque ele tem que multiplicar coeficientes para cada tap.160 Isso é um desperdício quando todos os coeficientes São o mesmo.160 Como o Capítulo 15 do livro de Steven W. Smiths aponta, você pode fazer um filtro de média móvel com uma técnica recursiva que tem um toque antes e depois de um retardo de tamanho (N-1). Esse filtro aparece abaixo Como parte de um circuito de teste com fonte de sinal e um filtro de Bessel para comparação: 160160160160 Os coeficientes são puxados para o bloco de ganho único na entrada.160 A amostra presente adiciona à saída à medida que entra no atraso, a amostra atrasada subtrai da O somador com o feedback acumula essas adições e subtrações para formar a saída - isso faz algo que é trivial em C, mas de outra forma é uma dor na GUI.160 Embora uma técnica recursiva seja usada, o filtro permanece um Verdadeiro filtro FIR - o comprimento de sua resposta ao impulso é definido apenas pelo seu atraso. 160160160160 Minha entrada de teste é uma onda quadrada com ruído adicionado.160 Os resultados filtrados aparecem como o traço superior em ambas as fotos - Primeiro o filtro de média móvel: O filtro Bessel: 160160160160 O filtro de média móvel permite mais ruído, mas preserva melhor a Forma de onda quadrada - não gira em torno dos cantos, e as inclinações para cima e para baixo são simétricas (sua fase linear) .160 Ouvir as duas formas de onda com fones de ouvido mostra um resultado similar - mais ruído com o filtro de média móvel, mas a característica Som de uma onda quadrada vem através. Im não certeza da solução correta embora desde somar a média de cada amostra iria introduzir uma quantidade razoável de erro de arredondamento. Hmm. Gostaria de saber se seperating a parte fracionária de toda a parte iria ajudar. Divida a parte inteira de cada número pela contagem. Manter três somas correntes: 1) A média das partes inteiras, 2) O restante de cada divisão, e 3) A parte fracionária de cada número. Cada vez que a parte inteira de um número é dividida, o resultado da parte inteira é adicionado à soma corrente média e o restante é adicionado à soma corrente restante. Quando a soma corrente restante obtém um valor maior ou igual à contagem, a sua divisão pela contagem com o resultado da parte inteira adicionada à soma média corrente e o restante adicionado à soma restante em curso. Também, em cada cálculo, a parte fracionária é adicionada à soma de corrida fracionária. Quando a média é terminada, a soma corrente restante é dividida pela contagem e o resultado é adicionado à soma média corrente como um número flutuante. Por exemplo: Agora o que fazer com a soma de execução fracionada. O perigo de estouro é muito menos provável aqui, embora ainda possível, então uma maneira de lidar com isso seria dividir a soma de execução fracionária pela contagem no final e adicioná-lo ao nosso resultado: Uma alternativa seria verificar a execução fracionária Soma em cada cálculo para ver se ele é maior ou igual a contar. Quando isso acontece, basta fazer a mesma coisa que fazemos com o restante executando soma. Excelente Jomit Vaghela 6-Mar-07 20:00 Eu gostei do que você disse pequenos trabalhos rapidamente se transformar em grandes empregos. Pensar em otimização durante a codificação é uma boa prática. Grande esforço e explicação, Obrigado Mike DiRenzo 5-Mar-07 15:26 Esta é a primeira vez que respondi a um de seus artigos. No entanto, sou um leitor muito ávido. Enquanto na faculdade, eu tinha que computar médias móveis ponderadas e simples também. Heck, eu mesmo tive que criar alguns dos meus próprios algoritmos de média móvel em uma implementação de ERP personalizado há algum tempo com base em algumas das mesmas fórmulas que eu aprendi em operações 101. Mas esta implementação, usando Generics, supera em muito qualquer coisa em termos de otimização, Simplicidade, e frescura direita darn. Muito obrigado por isso. Um de seus muitos fãs, Em silêncio e silêncio, a verdade fica clara. Ewma gobgob 5-Mar-07 4:30 Se você tentar calcular uma média móvel simples, você tem que manter uma coleção, o que é bastante complexo para uma tarefa tão simples. Como sobre o uso de um ewma Suas 2 linhas de código, muito mais simples. Alfa exp (-elapsedTimeSinceLastValue) ewma alfa ewma (1-alfa) newValue Re: ewma Marc Clifton 5-Mar-07 4:47 Como sobre o uso de um ewma Ideia interessante. Para os leitores que não sabem o que é um ewma, é um Exponential Weighted Moving Average. As pessoas são apenas notoriamente impossíveis. --DavidCrow Theres NENHUMA desculpa para não comentar seu código. - John Simmons / programador proscrito As pessoas que dizem que refatorarão seu código mais tarde para torná-lo bom não entendem refatoração, nem a arte eo ofício de programação. - Josh Smith Re: ewma pwasser 5-Mar-07 12:21 Uma estimativa da média móvel se o tamanho do bin para a média móvel for n pode ser obtido por: NewAverage (((n-1) OldAverage) newValue) / n Isso funciona uma vez que a caixa está cheia (número de amostra n). O compartimento parcialmente cheio é muitas vezes tratado usando um valor de semente para a média móvel inicial (OldAverage) e, em seguida, usando esse cálculo. Isso pressupõe uma distribuição normal de valores etc. Você foi ocupado Colin Angus Mackay 4-Mar-07 11:37 Postando dois artigos nesta noite. Grande trabalho eu não sei como você faz isso. Ive tem cerca de 4 ou 5 artigos metade terminou e eu só nunca parecem encontrar o tempo para completá-los. Bem. Talvez se eu ficasse fora do salão, eu conseguiria. Re: Youve sido ocupado Marc Clifton 4-Mar-07 13:25 Colin Angus Mackay escreveu: Postando dois artigos esta noite. Grande trabalho Obrigado, eu estava realmente escrevendo o artigo sobre a média correndo e percebi que a lista circular seria realmente um artigo stand-alone realmente bom. Além disso, eles são artigos leves. Posso fazer isso rapidamente. É apenas difícil de pensar em coisas úteis, mas simples. Acontece que eu precisava dessas duas classes de qualquer maneira. As pessoas são apenas notoriamente impossíveis. --DavidCrow Theres NENHUMA desculpa para não comentar seu código. - John Simmons / programador proscrito As pessoas que dizem que refatorarão seu código mais tarde para torná-lo bom não entendem refatoração, nem a arte eo ofício de programação. - Josh Smith Re: Youve sido ocupado JeffPClark 8-Mar-07 0:07 Pelo que eu li de Marc, ele provavelmente tem um programa que pode examinar um pedaço de código e explicar os detalhes intrincados, em seguida, publicá-lo diretamente para o projeto de código . Jeff Clark Arquiteto Arquiteto JP Clark, INC. Columbus, Ohio Última Atualização: 13-Out-16 9:59 Geral Notícias Sugestão Pergunta Erro Resposta Joke Praise Rant Admin Use CtrlLeft / Right para mudar Mensagens, CtrlUp / Down para alternar segmentos, CtrlShiftLeft / Direita para alternar pages. I essencialmente tem uma matriz de valores como este: A matriz acima é simplificada, estou coletando um valor por milissegundo no meu código real e eu preciso processar a saída em Um algoritmo que eu escrevi para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olharia para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é tomar esses valores e aplicar um algoritmo para eles que irá suavizar-los um pouco para que eu tenha mais valores lineares. (Ou seja: Id como meus resultados para ser curvy, não jaggedy) Ive foi dito para aplicar um filtro exponencial de média móvel para os meus valores. Como posso fazer isso É muito difícil para mim ler equações matemáticas, eu lidar muito melhor com o código. Como processar valores em minha matriz, aplicando um cálculo exponencial de média móvel para igualá-los perguntou 8 de fevereiro às 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso requer uma pequena classe (supondo que você está usando o Java 5 ou posterior): Instantiate com o parâmetro de decadência desejado (pode ter a sintonia deve estar entre 0 e 1) e use a média () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subscritos. (Eles têm algumas outras notações também, o que não ajuda.) No entanto, o EMA é bastante simples, como você só precisa se lembrar de um antigo valor não arrays estado complicado necessário. Respondeu 8 fevereiro às 20:42 TKKocheran: Muito bonito. Não é bom quando as coisas podem ser simples (se começar com uma nova seqüência, obter um novo averager.) Note que os primeiros termos na seqüência média saltarão em torno de um pouco devido a efeitos de limite, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica de média móvel para o averager e experimentar sem perturbar o resto do seu programa muito. Ndash Donal Fellows Feb 9 12 em 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrado 0,25 em vez de 0,36, então ele está errado. É errado porque assume um aumento ou uma diminuição monotônica (que está sempre subindo ou sempre indo para baixo). A menos que você média TODOS os seus dados, seus pontos de dados --- como você apresentá-los --- são não-lineares. Se você realmente deseja encontrar o valor máximo entre dois pontos no tempo, corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizar isto tomando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro números) a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito o período de três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver médias móveis no trabalho é ir ao Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em technicals na parte inferior do gráfico. Selecione Média Móvel com um período determinado e Média Mínima exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disto, mas pondera os dados mais antigos menos do que os novos dados, esta é uma forma de polarizar o alisamento para trás. Por favor, leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários era apenas pequena. Boa sorte. Se você está tendo problemas com a matemática, você poderia ir com uma média móvel simples, em vez de exponencial. Assim, a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará lidar com as partes inicial e final dos dados, uma vez que claramente você não pode fazer a média dos últimos 5 termos quando estiver no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma soma - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondeu 8 fevereiro às 20:41
Comments
Post a Comment