Thursday 24 January 2019

Moving average filter javascript


Eu tenho essencialmente 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 verá 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 out perguntou Feb 8 12 at 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 ajuste 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.) Observe que os primeiros termos na seqüência média saltarão 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 demais. 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 localize 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 três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as 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 determinado período 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, isto é uma forma de influenciar a suavização em direção às costas. 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. Então a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará manipular as partes inicial e final dos dados, uma vez que claramente você não consegue média dos últimos 5 termos quando você está no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma sum - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondeu 8 de fevereiro em 20:41 É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats um poder de dois para permitir bit-shifting Em vez de dividir, mas não precisava de um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito recursivamente como Então você sempre precisa lembrar a amostra xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, onde as amostras mais no passado obter um menor peso, mas (pelo menos em teoria) você nunca se esqueça nada (os pesos apenas ficar menor e menor para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento GPS que eu escrevi. Eu começo com 1 amostra e dividir por 1 para obter o avg atual. Eu adiciono então uma outra amostra e divido por 2 à corrente avg. Isso continua até que eu chegar ao comprimento da média. Cada vez depois, eu adiciono na nova amostra, obter a média e remover essa média do total. Eu não sou um matemático, mas isso parecia ser uma boa maneira de fazê-lo. Eu imaginei que iria transformar o estômago de um cara de matemática real, mas, verifica-se que é uma das formas aceitas de fazê-lo. E funciona bem. Basta lembrar que quanto maior o seu comprimento, mais lento é seguir o que você deseja seguir. Isso pode não importar a maior parte do tempo, mas quando os satélites seguintes, se você é lento, a trilha poderia estar longe da posição real e vai ficar mal. Você poderia ter uma lacuna entre o sat e os pontos de arrasto. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter alisamento adequado e não ficar muito longe da posição real sentado com os pontos de trilha suavizada. Respondida Nov 16 16 at 23:03 initialize total 0, count0 (cada vez vendo um novo valor Então uma entrada (scanf), um add totalnewValue, um incremento (count), uma divide average (totalcount) Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma das 4 variáveis ​​de entrada, dividida por 4 Bom se todos os insumos foram positivos para fazer o cálculo médio respondido Feb 3 15 at 4:06 Isso vai realmente calcular a média total e NÃO a média móvel. Como a contagem fica maior o impacto de qualquer nova amostra de entrada torna-se ndash nitidamente pequeno Hilmar fevereiro 3 15 at 13:53 Sua resposta 2017 Stack Exchange, IncI necessidade de projetar um filtro de média móvel que tem uma freqüência de corte de 7,8 Hz. Eu usei filtros de média móvel antes, mas até onde estou ciente, o único parâmetro que Pode ser alimentado em E número de pontos a serem calculados. Como isso pode se relacionar com uma freqüência de corte O inverso de 7,8 Hz é de 130 ms, e Im trabalhando com dados que são amostrados a 1000 Hz. Isso implica que eu deveria estar usando um tamanho de janela de filtro média móvel de 130 amostras, ou há algo mais que estou faltando aqui pediu Jul 18 13 at 9:52 O filtro de média móvel é o filtro usado no domínio do tempo para remover O ruído adicionado e também para o propósito de suavização, mas se você usar o mesmo filtro de média móvel no domínio da freqüência para a separação de freqüência, o desempenho será pior. Então, nesse caso, use filtros de domínio de freqüência O filtro de média móvel (por vezes conhecido coloquialmente como um filtro de caixa) tem uma resposta de impulso retangular: Ou, declarado de forma diferente: Lembrando que uma resposta em freqüência de sistemas de tempo discreto É igual à transformada de Fourier de tempo discreto da sua resposta de impulso, podemos calculá-la da seguinte forma: O que mais interessou para o seu caso é a resposta de magnitude do filtro, H (ômega). Usando algumas manipulações simples, podemos obter isso em uma forma mais fácil de compreender: Isso pode não parecer mais fácil de entender. No entanto, devido à identidade Eulers. Lembre-se que: Portanto, podemos escrever o acima como: Como eu disse antes, o que você está realmente preocupado com a magnitude da resposta de freqüência. Assim, podemos tomar a magnitude do acima para simplificá-lo ainda mais: Nota: Nós somos capazes de soltar os termos exponenciais, porque eles não afetam a magnitude do resultado e 1 para todos os valores de ômega. Como xy xy para quaisquer dois números finitos x e y, podemos concluir que a presença dos termos exponenciais não afeta a resposta da magnitude global (em vez disso, eles afetam a resposta da fase do sistema). A função resultante dentro dos parênteses de magnitude é uma forma de um kernel de Dirichlet. É chamado às vezes uma função periódica de sinc, porque se assemelha à função do sinc um tanto na aparência, mas é periódica preferivelmente. De qualquer forma, uma vez que a definição de freqüência de corte é um pouco underspecified (-3 dB ponto -6 dB ponto primeiro sidelobe nulo), você pode usar a equação acima para resolver o que você precisa. Especificamente, você pode fazer o seguinte: Definir H (omega) para o valor correspondente à resposta do filtro que você deseja na freqüência de corte. Defina ômega igual à freqüência de corte. Para mapear uma freqüência de tempo contínuo para o domínio de tempo discreto, lembre-se que omega 2pi frac, onde fs é sua taxa de amostragem. Encontre o valor de N que lhe dá o melhor acordo entre os lados esquerdo e direito da equação. Isso deve ser o comprimento de sua média móvel. Se N é o comprimento da média móvel, então uma frequência de corte aproximada F (válida para N gt 2) na frequência normalizada Fffs é: O inverso disso é Esta fórmula é assintoticamente correta para N grande e tem cerca de 2 erro Para N2, e menos de 0,5 para N4. P. S. Depois de dois anos, aqui finalmente qual foi a abordagem seguida. O resultado foi baseado na aproximação do espectro de amplitude da MA em torno de f0 como uma parábola (série de 2ª ordem) de acordo com MA (Omega) aproximadamente 1 (frac-fra) Omega2 que pode ser feita mais exata perto do cruzamento zero de MA (Omega) Frac por multiplicação de Omega por um coeficiente de obtenção de MA (Omega) aprox. 10.907523 (frac - frac) Omega2 A solução de MA (Omega) - frac 0 dá os resultados acima, onde 2pi F Omega. Tudo o que acima se refere à freqüência de corte -3dB, o sujeito deste post. Às vezes, porém, é interessante obter um perfil de atenuação em banda de parada que é comparável ao de um filtro passa-baixo IIR de 1ª ordem (LPF de um pólo) com uma determinada freqüência de corte -3dB (tal LPF é também chamado integrador com vazamento, Tendo um pólo não exatamente em DC, mas próximo a ele). De facto, tanto a MA como a Ia ordem IIR LPF têm uma inclinação de 20dBdecade na banda de paragem (é necessário um N maior do que o utilizado na figura, N32, para ver isto), mas enquanto MA tem nulos espectricos em FkN e um 1f evelope, o filtro IIR só tem um perfil 1f. Se se deseja obter um filtro MA com capacidades semelhantes de filtragem de ruído como este filtro IIR, e corresponder às frequências de corte 3dB para ser o mesmo, ao comparar os dois espectros, ele perceberá que a ondulação da banda de parada do filtro MA acaba 3dB abaixo do filtro IIR. Para obter a mesma ondulação de banda de parada (ou seja, a mesma atenuação de potência de ruído) como o filtro IIR as fórmulas podem ser modificadas da seguinte forma: Eu encontrei de volta o script Mathematica onde eu calculou o corte para vários filtros, incluindo o MA. O resultado foi baseado na aproximação do espectro MA em torno de f0 como uma parábola de acordo com MA (Omega) Sin (OmegaN2) Sin (Omega2) Omega 2piF MA (F) aproximadamente N16F2 (N-N3) pi2. E derivando o cruzamento com 1sqrt de lá. Ndash Massimo Jan 17 16 em 2:08

No comments:

Post a Comment