Thursday 26 October 2017

Aplicações de filtragem média móvel


Filtro médio ou Categoria de filtro médio. Processamento digital de sinais e imagens (DSP e DIP). Abstrato. O artigo é um guia prático para filtro médio, ou entendimento e implementação de filtro médio. Artigo contém teoria, código-fonte C, instruções de programação e aplicação de exemplo. 1. Introdução ao filtro médio, ou filtro médio Filtro médio. Ou filtro médio é o filtro de janela da classe linear, que suaviza o sinal (imagem). O filtro funciona como low-pass um. A idéia básica por trás do filtro é para qualquer elemento do sinal (imagem) ter uma média em toda a sua vizinhança. Para entender como isso é feito na prática, vamos começar com a idéia da janela. 2. Filtre a janela ou a máscara Imagine, você deve ler uma letra e o que você vê no texto restringido pelo furo no stencil especial como este. Assim, o resultado da leitura é t sadio. Ok, vamos ler a carta novamente, mas com a ajuda de outro estêncil: Agora o resultado da leitura t é som 240. Vamos fazer a terceira tentativa: Agora você está lendo a letra t como som 952. O que acontece aqui Para dizer que Na linguagem matemática, você está fazendo uma operação (leitura) sobre o elemento (letra t). E o resultado (som) depende do elemento vizinhança (letras ao lado de t). E esse estêncil, que ajuda a pegar a vizinhança do elemento, é janela Sim, a janela é apenas um estêncil ou padrão, por meio do qual você está selecionando o elemento vizinhança 0151 um conjunto de elementos em torno do dado 0151 para ajudá-lo a tomar uma decisão. Outro nome para a janela de filtro é máscara 0151 máscara é um estêncil, que esconde elementos que não estão prestando atenção. No nosso exemplo, o elemento em que estamos operando está posicionado à esquerda da janela, na prática no entanto sua posição usual é o centro da janela. Vejamos alguns exemplos de janelas. Em uma dimensão. FIG. 4. Janela ou máscara de tamanho 5 em 1D. Em duas dimensões. FIG. 5. Janela ou máscara de tamanho 3times3 em 2D. Em três dimensões. Pense em construir. E agora mdash sobre quarto nesse edifício. O quarto é como janela 3D, que corta alguns subespaço de todo o espaço do edifício. Você pode encontrar janela 3D em volume (voxel) processamento de imagem. 3. Compreender filtro médio Agora vamos ver, como ldquotake uma média através de elementos neighborhoodrdquo. A fórmula é simples 0151 resumir elementos e dividir a soma pelo número de elementos. Por exemplo, vamos calcular uma média para o caso, ilustrada na fig. 7. FIG. 7. Tomando uma média. E isso é tudo. Sim, nós apenas filtraram o sinal 1D pelo filtro médio Deixe-nos fazer o resumo e escrever para baixo instruções passo a passo para processar pelo filtro médio. Filtro médio ou algoritmo de filtro médio: Coloque uma janela sobre o elemento Pegue uma média 0151 somando elementos e divida a soma pelo número de elementos. Agora, quando temos o algoritmo, é hora de escrever algum código mdash vamos descer para a programação. 4. 1D média filtragem programação Nesta seção desenvolvemos 1D média filtro com janela de tamanho 5. Vamos ter 1D sinal de comprimento N como entrada. O primeiro passo é colocar a janela 0151 fazemos isso alterando o índice do elemento principal: Preste atenção, que estamos começando com o terceiro elemento e terminando com o último mas dois. O problema é que não podemos começar com o primeiro elemento, porque neste caso a parte esquerda da janela de filtro está vazia. Discutiremos abaixo, como resolver esse problema. O segundo passo é tomar a média, ok: Agora, vamos escrever o algoritmo como função: Tipo de elemento pode ser definido como: 5. Tratar bordas Para todos os filtros de janela há algum problema. Isso é tratamento de borda. Se você colocar a janela sobre o primeiro (último) elemento, a parte esquerda (direita) da janela estará vazia. Para preencher a lacuna, o sinal deve ser estendido. Para o filtro médio há uma boa idéia para estender sinal ou imagem simetricamente, como este: Então, antes de passar sinal para a nossa função de filtro média o sinal deve ser estendido. Vamos escrever o invólucro, que faz todos os preparativos. Como você pode ver, nosso código leva em conta algumas questões práticas. Primeiro de tudo, verificamos os nossos parâmetros de entrada 0151 sinal não deve ser NULL, eo comprimento do sinal deve ser positivo: Segundo passo 0151, verificamos caso N1. Este caso é especial, porque para construir a extensão precisamos de pelo menos dois elementos. Para o sinal de 1 comprimento de elemento o resultado é o próprio sinal. Também preste atenção, nosso filtro médio funciona no local, se o resultado do parâmetro de saída for NULL. Agora vamos alocar memória para extensão de sinal. E verificar a alocação de memória. O cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Filtros de Filtros Móveis Filtros do Filtro de Média Móvel Em um mundo perfeito, os designers de filtros só teriam que lidar com informações de domínio de tempo ou de domínio de freqüência codificadas, mas nunca uma mistura dos dois no mesmo sinal. Infelizmente, existem algumas aplicações em que ambos os domínios são simultaneamente importantes. Por exemplo, os sinais de televisão caem nesta categoria desagradável. As informações de vídeo são codificadas no domínio do tempo, ou seja, a forma da forma de onda corresponde aos padrões de brilho na imagem. No entanto, durante a transmissão, o sinal de vídeo é tratado de acordo com a sua composição de frequência, tal como a sua largura de banda total, como as ondas portadoras para a cor do amplificador de som são adicionadas, a restauração do amplificador de eliminação da componente de corrente contínua, etc. É melhor compreendida no domínio da frequência, mesmo se a informação de sinais é codificada no domínio do tempo. Por exemplo, o monitor de temperatura em uma experiência científica pode estar contaminado com 60 hertz das linhas de energia, 30 kHz a partir de uma fonte de alimentação comutada, ou 1320 kHz de uma estação de rádio AM local. Os parentes do filtro de média móvel têm um melhor desempenho no domínio da frequência, e podem ser úteis nestas aplicações de domínio misto. Os filtros de média móvel de passagem múltipla envolvem passar o sinal de entrada através de um filtro de média móvel duas ou mais vezes. A Figura 15-3a mostra o núcleo de filtro global resultante de uma, duas e quatro passagens. Duas passagens são equivalentes à utilização de um kernel de filtro triangular (um núcleo de filtro retangular convolveu-se consigo mesmo). Após quatro ou mais passagens, o kernel do filtro equivalente parece um Gaussiano (lembre-se do Teorema do Limite Central). Como mostrado em (b), passagens múltiplas produzem uma resposta de passo em forma de s, em comparação com a linha reta da passagem simples. As respostas de freqüência em (c) e (d) são dadas pela Eq. 15-2 multiplicado por si para cada passagem. Isto é, cada vez que a convolução do domínio resulta numa multiplicação dos espectros de frequência. A Figura 15-4 mostra a resposta de freqüência de outros dois parentes do filtro de média móvel. Quando um Gaussiano puro é usado como um kernel de filtro, a resposta de freqüência é também um Gaussiano, como discutido no Capítulo 11. O Gaussiano é importante porque é a resposta de impulso de muitos sistemas naturais e artificiais. Por exemplo, um breve pulso de luz que entra numa longa linha de transmissão de fibra óptica irá sair como um pulso Gaussiano, devido aos diferentes caminhos tomados pelos fótons dentro da fibra. O kernel de filtro gaussiano também é usado extensivamente no processamento de imagens porque possui propriedades únicas que permitem a rápida convolução bidimensional (ver Capítulo 24). A segunda resposta de freqüência na Fig. 15-4 corresponde a usar uma janela de Blackman como um kernel de filtro. (A janela do termo não tem nenhum significado aqui é simplesmente parte do nome aceitado desta curva). A forma exata da janela de Blackman é dada no Capítulo 16 (Equação 16-2, Fig. 16-2) no entanto, se parece muito com um Gaussiano. Como são esses parentes do filtro de média móvel melhor do que o filtro de média móvel em si Três maneiras: Primeiro, e mais importante, esses filtros têm melhor atenuação de banda de interrupção do que o filtro de média móvel. Em segundo lugar, os grãos de filtro diminuem para uma amplitude menor perto das extremidades. Lembre-se de que cada ponto no sinal de saída é uma soma ponderada de um grupo de amostras da entrada. Se o kernel do filtro diminui, as amostras no sinal de entrada que estão mais distantes recebem menos peso do que as próximas. Em terceiro lugar, as respostas de passo são curvas suaves, ao invés da linha recta abrupta da média móvel. Estes dois últimos são geralmente de benefício limitado, embora você possa encontrar aplicações onde eles são verdadeiras vantagens. O filtro de média móvel e seus parentes são todos aproximadamente o mesmo na redução de ruído aleatório, mantendo uma resposta passo agudo. A ambiguidade reside na forma como o tempo de subida da resposta ao passo é medido. Se o tempo de subida é medido de 0 a 100 do passo, o filtro de média móvel é o melhor que você pode fazer, como mostrado anteriormente. Em comparação, a medição do tempo de subida de 10 para 90 torna a janela Blackman melhor do que o filtro de média móvel. O ponto é, isto é apenas disputas teóricas considerar estes filtros iguais neste parâmetro. A maior diferença entre esses filtros é a velocidade de execução. Usando um algoritmo recursivo (descrito a seguir), o filtro de média móvel será executado como relâmpagos em seu computador. Na verdade, é o mais rápido filtro digital disponível. Várias passagens da média móvel serão correspondentemente mais lentas, mas ainda assim muito rápidas. Em comparação, os filtros Gaussiano e Blackman são extremamente lentos, porque eles devem usar convolução. Pense um fator de dez vezes o número de pontos no kernel do filtro (com base na multiplicação sendo cerca de 10 vezes mais lento que a adição). Por exemplo, espere que um Gaussian de 100 pontos seja 1000 vezes mais lento do que uma média móvel usando a recursão. Movendo os filtros médios As médias moventes são propensas aos whipsaws, quando o preço cruza para a frente e para trás através da média movente em um mercado de variação. Traders desenvolveram uma série de filtros ao longo dos anos para eliminar sinais falsos. O sistema de média móvel mais simples gera sinais quando o preço cruza a média móvel: Ir longo quando o preço cruza acima da média móvel de abaixo. Ir curto quando o preço cruza para abaixo da média móvel de cima. Os filtros são adicionados para medir objetivamente quando o preço atravessou a média móvel. Os filtros mais comuns são: Preço de Encerramento - um, dois ou três dias sucessivos devem todos fechar acima / abaixo da média móvel A barra inteira deve atravessar a média móvel Duas ou três barras (em sucessão) devem estar todas desobstruídas da média móvel A média móvel deve inclinar-se na direção do preço típico do comércio. O preço médio ou o fechamento ponderado também podem ser usados ​​como substitutos do preço de fechamento. Trades só são introduzidos se a média móvel inclina na direção do comércio. Este filtro não funcionará com médias móveis exponenciais porque a média móvel exponencial sempre inclina-se para cima quando o preço fecha acima da média móvel e inclina-se para baixo se fechar abaixo. Sair quando o preço re-cruza a média móvel. Moving Average Slope pode ser usado em conjunto com outros filtros, como preço de fechamento. Exemplo A média móvel simples é usada com dois filtros: Passe o mouse sobre legendas de gráfico para exibir os sinais de negociação. Ir curto - dois fecha abaixo de uma queda média móvel. Go longa - média móvel está subindo agora e preço fechou acima da média móvel por 2 dias. O seguinte mergulho abaixo da média móvel (no início de janeiro) é filtrado para fora. O comércio longo é saído porque há dois fechamentos abaixo da média movente. Nenhum comércio de curto é inserido como a média móvel está inclinada para cima. Vá longo - dois fecha acima de uma média móvel em ascensão. Vá curta como há dois fecha abaixo uma queda média móvel. Vá longo - dois fecha acima de uma média móvel em ascensão. Ir curto - dois fecha abaixo de uma queda média móvel. Go longa - média móvel está subindo novamente e há 2 fecha acima dela. Observe quão lucrativo o longo comércio 2 é durante a forte tendência ascendente, em comparação com quando whipsaws preço em torno da média móvel relativamente plana. Freqüentemente comutação você dentro e fora de comércios. Os indicadores de tendência normalmente não são lucrativos, e devem ser evitados, durante os mercados de alcance. Junte-se a nossa lista de discussão Leia Colin Twiggsrsquo Trading Diary newsletter, oferecendo análise fundamental da economia e análise técnica dos principais índices de mercado, ouro, petróleo bruto e forex. Como outros já mencionaram, você deve considerar um IIR (infinito impulso resposta) filtro em vez de O 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: 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 2017, 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 deste Smoothing dados remove variação aleatória e mostra tendências e componentes cíclicos Inerente na coleta de dados levados ao longo do tempo é alguma forma de variação aleatória. Existem métodos para reduzir o cancelamento do efeito devido a variação aleatória. Uma técnica freqüentemente usada na indústria é suavizar. Essa técnica, quando corretamente aplicada, revela mais claramente a tendência subjacente, os componentes sazonais e cíclicos. Existem dois grupos distintos de métodos de alisamento Métodos de média Métodos de suavização exponencial Tomar médias é a maneira mais simples de suavizar os dados Vamos primeiro investigar alguns métodos de média, como a média simples de todos os dados passados. Um gerente de um armazém quer saber o quanto um fornecedor típico oferece em unidades de 1000 dólares. Ele / ela toma uma amostra de 12 fornecedores, aleatoriamente, obtendo os seguintes resultados: A média computada ou média dos dados 10. O gerente decide usar isto como a estimativa para despesa de um fornecedor típico. Esta é uma boa ou má estimativa O erro quadrático médio é uma maneira de julgar o quão bom é um modelo Vamos calcular o erro quadrático médio. O valor verdadeiro do erro gasto menos o valor estimado. O erro ao quadrado é o erro acima, ao quadrado. O SSE é a soma dos erros quadrados. O MSE é a média dos erros quadrados. Resultados do MSE por exemplo Os resultados são: Erro e esquadrado Erros A estimativa 10 A questão surge: podemos usar a média para prever a renda se suspeitarmos de uma tendência? Um olhar para o gráfico abaixo mostra claramente que não devemos fazer isso. A média pondera todas as observações passadas igualmente Em resumo, afirmamos que A média simples ou média de todas as observações passadas é apenas uma estimativa útil para previsão quando não há tendências. Se houver tendências, use estimativas diferentes que levem em conta a tendência. A média pesa todas as observações passadas igualmente. Por exemplo, a média dos valores 3, 4, 5 é 4. Sabemos, é claro, que uma média é calculada adicionando todos os valores e dividindo a soma pelo número de valores. Outra forma de calcular a média é adicionando cada valor dividido pelo número de valores, ou 3/3 4/3 5/3 1 1.3333 1.6667 4. O multiplicador 1/3 é chamado de peso. Em geral: barra fração soma esquerda (fratura direita) x1 esquerda (fratura direita) x2,. ,, Esquerda (frac direito) xn. O (esquerda (frac direito)) são os pesos e, naturalmente, somam a 1.

No comments:

Post a Comment