Monday, 31 July 2017

Exponencial Moving Average Iir


A média móvel exponencial é um tipo de filtro IIR que é fácil de implementar em C e usa recursos mínimos. Ao contrário de uma média móvel simples, não requer uma memória RAM para armazenar amostras anteriores. Apenas tem que armazenar um valor (a média anterior). Uma média móvel exponencial é expressa como a seguinte equação: avgn (em alfa) avgn-1 (1-alfa). Implementar esta equação usando matemática de ponto flutuante é direto, mas usar variáveis ​​de ponto fixo é um pouco complicado. O trecho de código aqui usa inteiros assinados de 32 bits para a média e os valores de entrada. Os valores intermediários precisam usar matemática de 64 bits para evitar erros de transbordamento. Os valores alfa próximos a zero representam uma média pesada, enquanto um valor alfa de um não possui uma média. Na linha em que o temp0 é calculado, acredito que o fim da linha deve ser lido (65535 - alfa) Caso contrário, um alfa de 1 incluiria incorretamente a média anterior e o novo valor. Infelizmente, o código mostrado tem dois principais erros, devido à forma como a média é armazenada como um número inteiro. Para ver isso, escolha o alfa para ser 1024. Começamos com o adcvalor 0 e, em seguida, dspemai32 retornará 0 conforme o esperado. Em seguida, aumente o adcvalue para 1. tmp0 em dspemai32 será: tmp0 (int64t) 1 (1024) (int64t) 0 (65536 - 1024) 1024 0 64512 1024, então o valor retornado é: (int32t) ((tmp0 32768) 65536) ( 1024 32768) 65536 33792 65536 0 Então dspemai32 continuará retornando 0, enquanto deveria (após um tempo de filtragem suficiente) no final do retorno 1. O código efetivamente implementa um filtro com uma zona morta, não mudando até que a entrada seja diferente da Média por 32768alfa ou mais, ou difere por - (32768alfa) ou menos. Seguindo o exemplo acima, aumente o valor de adc em 31 (que é inferior a 32768alpha). Tmp0 em dspemai32 será: tmp0 (int64t) 31 (1024) (int64t) 0 (65536 - 1024) 31744 0 64512 31744 então o valor retornado é: (int32t) ((tmp0 32768) 65536) (31744 32768) 65536 64512 65536 0 Então dspemai32 continuará retornando 0. Ao aumentar o valor do adc em 32, o tmp0 no dspemai32 será: tmp0 (int64t) 32 (1024) (int64t) 0 (65536 - 1024) 32768 0 64512 32768 então o valor retornado é: ( Int32t) ((tmp0 32768) 65536) (32768 32768) 65536 65536 65536 1 Então, pelo menos, a média está se movendo em direção ao valor de entrada em 1. Isso é bom. Mas então: tmp0 (int64t) 32 (1024) (int64t) 1 (65536 - 1024) 32768 1 64512 97280 então o valor retornado é: (int32t) ((tmp0 97280) 65536) (97280 32768) 65536 130048 65536 1 Então dspemai32 Continuará retornando 1, nunca atingindo o valor de entrada de 32. Não é bom. O segundo erro é a divisão inteira (tmp0 32768) 65536. Em C C, a divisão inteira irá rodar em direção a 0, então, nessa situação, a zona morta é ainda maior. Muito melhor (e muito mais simples) é o algoritmo mostrado por david. prentice em avrfreaks. netcomment824765comment-824765: total longo 0 int médio 0 int N 0 número de trabalho de amostras. ADCW total adicionar ao total de execução se (N gt MAXSAMPLES) amostras suficientes total - média remover outra N N total médio N inteiroExponencial Filtro Esta página descreve a filtragem exponencial, o filtro mais simples e popular. Esta é parte da seção Filtragem que faz parte de um Guia de Detecção e Diagnóstico de Falhas. Visão geral, constante de tempo e equivalente analógico. O filtro mais simples é o filtro exponencial. Possui apenas um parâmetro de sintonia (diferente do intervalo de amostra). Exige o armazenamento de apenas uma variável - a saída anterior. É um filtro IIR (autoregressivo) - os efeitos de uma mudança de entrada se deterioram exponencialmente até que os limites de exibição ou a aritmética do computador ocultem. Em várias disciplinas, o uso deste filtro também é referido como o alívio exponencial de 82208221. Em algumas disciplinas, como a análise de investimentos, o filtro exponencial é chamado de Média de Movimento 8220 Exponencialmente Ponderada8221 (EWMA), ou apenas 8220 de Média de Mudança Exponencial8221 (EMA). Isso abusa a tradicional terminologia média média ARMA 8220moo 8221 da análise de séries temporais, uma vez que não há histórico de entrada que é usado - apenas a entrada atual. É o equivalente de tempo discreto da ordem de ordem 8220 lag8221 comumente usado na modelagem analógica de sistemas de controle de tempo contínuo. Nos circuitos elétricos, um filtro RC (filtro com um resistor e um capacitor) é um atraso de primeira ordem. Ao enfatizar a analogia com os circuitos analógicos, o parâmetro de sintonia única é a constante 8220time8221, geralmente escrita como a letra grega minúscula Tau (). De fato, os valores nos tempos de amostra discretos coincidem exatamente com o atraso de tempo contínuo equivalente com a mesma constante de tempo. A relação entre a implementação digital e a constante de tempo é mostrada nas equações abaixo. Equações de filtro exponencial e inicialização O filtro exponencial é uma combinação ponderada da estimativa anterior (saída) com os dados de entrada mais recentes, com a soma dos pesos iguais a 1 para que a saída corresponda à entrada no estado estacionário. Seguindo a notação de filtro já introduzida: y (k) ay (k-1) (1-a) x (k) onde x (k) é a entrada bruta no passo de tempo ky (k) é a saída filtrada no tempo ka É uma constante entre 0 e 1, normalmente entre 0,8 e 0,99. (A-1) ou a vezes é chamado de constante de deslocamento 82208221. Para sistemas com um passo de tempo fixo T entre amostras, a constante 8220a8221 é calculada e armazenada por conveniência apenas quando o desenvolvedor do aplicativo especifica um novo valor da constante de tempo desejada. Para sistemas com amostragem de dados em intervalos irregulares, a função exponencial acima deve ser usada com cada passo de tempo, onde T é o tempo desde a amostra anterior. A saída do filtro geralmente é inicializada para coincidir com a primeira entrada. À medida que a constante de tempo se aproxima de 0, a vai para zero, portanto, não há filtragem 8211, a saída é igual à nova entrada. À medida que a constante de tempo é muito grande, um aborda 1, de modo que a entrada nova é quase ignorada 8211 filtragem muito pesada. A equação do filtro acima pode ser rearranjada no seguinte preditor-corretor equivalente: Este formulário torna mais evidente que a estimativa variável (saída do filtro) é predita como inalterada da estimativa anterior y (k-1) mais um termo de correção baseado No inesperado 8220innovation8221 - a diferença entre a nova entrada x (k) e a predição y (k-1). Este formulário também é o resultado de derivar o filtro exponencial como um caso especial simples de um filtro de Kalman. Qual é a solução ideal para um problema de estimativa com um determinado conjunto de pressupostos. Etapa de resposta Uma maneira de visualizar a operação do filtro exponencial é traçar sua resposta ao longo do tempo para uma entrada de etapa. Ou seja, começando com a entrada e saída do filtro em 0, o valor de entrada é de repente mudado para 1. Os valores resultantes são traçados abaixo: no gráfico acima, o tempo é dividido pela constante de tempo do filtro tau para que você possa prever com mais facilidade Os resultados para qualquer período de tempo, para qualquer valor da constante de tempo do filtro. Após um tempo igual à constante de tempo, a saída do filtro sobe para 63.21 do seu valor final. Após um tempo igual a 2 constantes de tempo, o valor sobe para 86,47 de seu valor final. As saídas após tempos iguais a 3,4 e 5 constantes de tempo são 95.02, 98.17 e 99.33 do valor final, respectivamente. Uma vez que o filtro é linear, isso significa que essas porcentagens podem ser usadas para qualquer magnitude da mudança de passo, não apenas pelo valor de 1 usado aqui. Embora a resposta gradual em teoria tenha um tempo infinito, do ponto de vista prático, pense no filtro exponencial como 98 a 99 8220done8221 respondendo após um tempo igual a 4 a 5 constantes de tempo de filtro. Variações no filtro exponencial Existe uma variação do filtro exponencial chamado 8220nonlinear exponencial filter8221 Weber, 1980. destinado a pesadamente filtrar o ruído dentro de uma certa amplitude 8220typical8221, mas depois responder mais rapidamente a mudanças maiores. Copyright 2010 - 2013, Greg Stanley Compartilhe esta página: Assuma o primeiro filtro de ordem IIR: yn alfa xn (1 - alfa) yn - 1 Como posso escolher o parâmetro alpha s. t. O IIR aproxima o melhor possível o FIR, que é a média aritmética das últimas k amostras: Onde n em k, infty), o que significa que a entrada para o IIR pode ser maior do que k e ainda Id gostaria de ter a melhor aproximação da Significa as últimas entradas k. Eu sei que o IIR tem uma resposta de impulso infinita, daí estou procurando a melhor aproximação. Eu estou feliz por uma solução analítica, seja para ou. Como esses problemas de otimização podem ser solucionados, dado o único IIR de 1ª ordem. Perguntou 6 de outubro 11 às 13:15 Precisa seguir yn alfa xn (1 - alfa) yn - 1 precisamente ndash Phonon 6 de outubro 11 às 13:32 Isso é obrigado a se tornar uma aproximação muito pobre. Você pode pagar qualquer coisa mais do que um número de ordem IIR ndash leftaroundabout 6 de outubro 11 às 13:42 Você pode querer editar sua pergunta para que você não use yn para significar duas coisas diferentes, p. A segunda equação exibida poderia ler zn frac xn cdots frac xn-k1, e você pode querer dizer qual é exatamente o seu critério de cotas quanto possível, por exemplo, Você quer que o yn-znvert seja o mais pequeno possível para todos os n, ou vert yn-znvert2 para ser o menor possível para todos os n. Ndash Dilip Sarwate 6 de outubro 11 às 13:45 niaren Eu sei que este é um post antigo, então se você se lembrar: como sua função 39f39 derivou eu codificou uma coisa semelhante, mas usando as funções de transferência complexas para FIR (H1) e IIR (H2 ) E depois fazendo soma (abs (H1 - H2) 2). Eu comparei isso com sua soma (fj), mas obtive diferentes resultados resultantes. Pensei em perguntar antes de arar através da matemática. Ndash Dom Jun 7 13 às 13:47 OK, vamos tentar derivar o melhor: começar yn ampamp alpha xn (1 - alpha) yn - 1 ampamp alfa xn (1 - alfa) alfa xn-1 (1 - alfa) 2 yn - 2 ampamp alpha xn (1 - alfa) alfa xn-1 (1-alfa) 2 alfa xn-2 (1-alfa) 3 yn-3 fim para que o coeficiente de xn-m seja alfa (1-alfa) m . O próximo passo é tomar derivativos e equivaler a zero. Olhando para um enredo do derivado J para K 1000 e alfa de 0 para 1, parece que o problema (como eu configurei) é mal posado, porque a melhor resposta é alfa 0. Eu acho que há um erro aqui. A maneira como deve ser de acordo com os meus cálculos é: usar o código a seguir em MATLAB produz algo equivalente embora diferente: de qualquer forma, essas funções têm mínimo. Então, vamos assumir que realmente nos preocupamos com a aproximação sobre o suporte (comprimento) do filtro FIR. Nesse caso, o problema de otimização é apenas: Soma J2 (alfa) (alfa (1-alfa) m-frac) 2 Traçar J2 (alfa) para vários valores de K versus resultados alfa na data nas parcelas e tabela abaixo. Para K 8. alfa 0.1533333 Para K 16. alfa 0.08 Para K 24. alfa 0.0533333 Para K 32. alfa 0.04 Para K 40. alfa 0.0333333 Para K 48. alfa 0.0266667 Para K 56. alfa 0.0233333 Para K 64. alfa 0.02 Para K 72. alpha 0.0166667 As linhas tracejadas vermelhas são 1K e as linhas verdes são alfa, o valor de alfa que minimiza J2 (alfa) (escolhido de tt alfa 0: .01: 13). Há uma boa discussão sobre este problema no processamento de sinal incorporado com a arquitetura de micro-sinal. Aproximadamente entre as páginas 63 e 69. Na página 63, inclui uma derivação do filtro de média móvel recursiva exata (que Niaren deu em sua resposta), por conveniência em relação à seguinte discussão, corresponde à seguinte equação de diferença: A aproximação Que coloca o filtro na forma que você especificou exige assumindo que x aproximadamente y, porque (e cito a partir da página 68) y é a média das amostras xn. Essa aproximação nos permite simplificar a equação de diferença anterior da seguinte maneira: Configurando alfa, chegamos à sua forma original, y alfa xn (1-alfa) y, que mostra que o coeficiente que você deseja (em relação a essa aproximação) é exatamente 1 (Onde N é o número de amostras). Essa aproximação é a melhor em algum aspecto. É certamente elegante. Heres como a resposta de magnitude se compara a 44,1 kHz para N 3 e como N aumenta para 10 (aproximação em azul): Como a resposta de Peters sugere, aproximar um filtro FIR com um filtro recursivo pode ser problemático sob uma norma de mínimos quadrados. Uma ampla discussão sobre como resolver este problema em geral pode ser encontrada na tese JOSs, Técnicas para Design de Filtro Digital e Identificação do Sistema com Aplicação ao Violino. Ele defende o uso da Norma de Hankel, mas nos casos em que a resposta de fase não importa, ele também cobre o Método Kopecs, que pode funcionar bem neste caso (e usa uma norma L2). Uma ampla visão geral das técnicas na tese pode ser encontrada aqui. Eles podem render outras aproximações interessantes.

No comments:

Post a Comment