Tuesday 28 November 2017

Movimento média filtro microcontrolador


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 um único pólo. 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, 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ídos, 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 segue apenas a entrada. Valores úteis estão no meio. Em sistemas pequenos você escolhe FF para ser 12 N de modo que a multiplicação por FF pode ser realizada como uma mudança para a direita por N bits. Por exemplo, FF pode ser 116 e a multiplicação 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 AD 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 dBoctave acima da freqüência rolloff. No entanto, para as leituras AD seu geralmente mais relevante para olhar para o filtro no domínio do tempo, considerando a 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 executar este através do meu script wrapper PLOTFILT. Isso executa FILTBITS, que faz um arquivo CSV, em seguida, traça o arquivo CSV. Por exemplo, aqui está o resultado de PLOTFILT 4 4: Os dois parâmetros para PLOTFILT significam 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 FF são, portanto, 116 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 tempo de resolução, 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 aleatória do ruído. Parece que nenhuma amostra individual causará mais de 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 na versão de software do PIC Development Tools na minha página de downloads de Software. Adicionado sobre a 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 12 N de modo 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 de processadores. Por exemplo, se você estiver filtrando leituras de AD de 10 bits e N 4 (FF 116), então você precisará de 4 bits de fração abaixo das leituras de AD de 10 bits. Um processadores mais, youd estar fazendo operações inteiras de 16 bits devido às leituras de AD de 10 bits. Neste caso, você ainda pode fazer exatamente as mesmas operações de integer de 16 bits, mas comece com as leituras AD desviadas 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ê considera que eles são 12,4 ponto fixo ou verdadeiros inteiros 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 sub-rotina 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 o subrotina, que atualiza FILT, mas também carrega isso para o mesmo estado de arranhão NOVO foi dentro Isso torna mais fácil para aplicar vários pólos desde o FILT atualizado de um pólo é o NOVO Da próxima. 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-baixo de um único pólo uma vez, depois aplicá-lo várias vezes. Na verdade eu costumo escrever uma sub-rotina para levar um ponteiro na memória para o estado do filtro, em seguida, fazê-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 - todos eles. 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 mudanças 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 duas, por exemplo: O OP pensou que 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 do problema de 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 requerem uma operação de divisão, elas são igualmente incompletas, uma vez que não mostram como efetivamente conseguir isso em um PIC16. 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 de 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 entrada de alta taxa de amostragem e calculando a média para uso em um processo de baixa taxa), então um filtro CIC 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 de processamento de sinal digital (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 da memória.) Este filtro aproxima uma média móvel de Os últimos K amostras, definindo o valor de alfa para 1K. 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 um estágio, você terá que ajustar DecayFactor (como se relaciona com o 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 rampa 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. (CutoffFrequencySampleRate) 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ê precisa 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: dspguidech19.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 16 e DecayFactor para (1,0 - AmplitudeFactor). Respondida 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ê mantiver N um poder de dois, toda a divisão é um ciclo de 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 SUMN. Tampão de anel IIR modificado: mantenha uma SUM corrente dos últimos N valores. Cada vez que uma nova amostra entra, SUM - SUMN, adicione a nova amostra e a saída SUMN. 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 render 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) do 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. Scott Scott Seidman: Não há necessidade de multiplicações se um tiver simplesmente cada estágio do FIR ou a saída da média da entrada para esse estágio e seu valor armazenado anterior e, em seguida, armazenar a entrada (se houver 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 d2dt desagradável quando a mudança de entrada, e novamente 1ms mais tarde, mas terá o mínimo Possível ddt para um filtro com um atraso total de 1ms). 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 qualquer 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 biastruncation). Assumindo que N é uma potência de dois, e apenas aritmética inteira é utilizada, o direito de deslocamento sistematicamente elimina os LSBs da nova amostra. Isso significa que quanto tempo a série poderia ser, a média nunca vai levá-los 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 fazê-la mudar. Claro, você pode corrigir o viés, adicionando 12N2, 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-12 (N2). 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 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 Um Filtro Exponencial Moving Average IIR Filtragem de variáveis ​​medidas microcontrolador embutido circuitos baseados é necessário para rastrear o valor médio dos sinais e para reduzir a sua variabilidade. Como os sinais variam em seu valor médio ao longo do tempo, o filtro precisa ter um meio para descartar medições antigas ao incorporar novas amostras. O filtro de resposta de impulso infinito de média móvel exponencial (IIR) tem sido bem compreendido por muitas décadas e é amplamente utilizado na análise estatística. Ele fornece um meio computacionalmente simples de determinar o valor médio de uma variável quando o modelo subjacente da variável é desconhecido. Se v n é a variável que está sendo filtrada, então um n-ésimo estimador para o valor médio é: onde a é o coeficiente de peso cujo valor determina a quantidade de suavização. Quanto mais próximo a é 0, maior a quantidade de suavização. Em alguns casos, o algoritmo desta forma produz resultados intermediários que podem se tornar grandes. Para implementar isso usando uma aritmética de inteiros de precisão finita, ele é reformulado em uma forma ligeiramente diferente em que os resultados intermediários são delimitados por um valor conhecido. O coeficiente de peso é representado como um 1-1c. Onde c é uma potência de 2. A potência k pode ser aumentada para aumentar a quantidade de suavização, enquanto que a restrição a uma potência de 2 permitirá que as multiplicações e divisões sejam implementadas usando operações de deslocamento rápido e esquerdo muito rápidas num microprocessador. A quantidade cv av (n) é rastreada para manter a precisão: Se, por exemplo, as amostras são quantidades de 8 bits (como usado em muitos dos algoritmos descritos para os circuitos SMPS aqui descritos) e k é escolhido como sendo 8, então a quantidade Cv av (n) pode ser representado como um valor de 16 bits sem perda de informação (precisamente: 8k bits, veja abaixo). Uma vez que isto foi determinado, a quantidade vv (n) é obtida por um simples deslocamento para a direita por k lugares. Neste ponto há uma perda de informação de menos de 1 lsb magnitude que pode ser absorvida pelas incertezas de v n (note no entanto que pode haver correlações nesta perda de informação que pode causar erros sistemáticos). Assumindo que as variáveis ​​v i são estatisticamente independentes, a análise de variância mostra que é reduzida por um fator 1 (2c). Para mudanças de passo em v n, a constante de tempo é c intervalos de cálculo. O rastreio do valor médio torna-se menos preciso à medida que a constante de tempo aumenta para se tornar comparável à frequência mais baixa no modelo de sinal subjacente. Limite superior para o valor médio O filtro começa com v av (0) 0. Todas as medições v n estão entre 0 e menor que B (onde B é normalmente 256 em nossos exemplos). Assim, trabalhando de volta para o início da seqüência (que na prática é sempre finito), que é apenas B. Assim, o valor máximo da média amplificada cv av (n) é cB que está dentro de um número de 16 bits no exemplo acima. No caso em que as amostras têm importância estatística diferente, isto é, algumas têm uma maior probabilidade de erro do que outras, os pesos podem ser aplicados para criar uma forma mais geral do filtro. Estes pesos seriam escolhidos para ter uma relação inversa com a probabilidade de erro. Se w n forem os pesos a serem aplicados, o seguinte filtro pode ser usado: A segunda equação produz uma estimativa IIR da média dos pesos, que é usada na primeira equação. Isto pode ser mostrado para produzir uma estimativa unbassed da média de v n com um fator de esquecimento de (1-a). Como antes as médias modificadas cw av (n) e cw av (n) v av (n) dadas no lado esquerdo seriam rastreadas, e as quantidades desejadas extraídas por divisão simples. FIR Filter Basics 1.1 O que são filtros quotFIR filtros FIR São um dos dois principais tipos de filtros digitais utilizados em aplicações de processamento de sinal digital (DSP), sendo o outro tipo IIR. 1.2 O que quotFIR significa quotFIR significa quotFinite Impulse Responsequot. Se você colocar um impulso, isto é, uma única amostra de 1 quot seguida de muitas quot0quot amostras, os zeros sairão depois que a amostra de quot1quot tiver feito seu caminho através da linha de atraso do filtro. 1.3 Por que a resposta ao impulso é quotfinita? No caso comum, a resposta ao impulso é finita porque não há feedback no FIR. A falta de feedback garante que a resposta ao impulso será finita. Portanto, o termo resposta ao impulso quotfinito é quase sinônimo de "feedback". No entanto, se o feedback é empregado ainda a resposta ao impulso é finito, o filtro ainda é um FIR. Um exemplo é o filtro de média móvel, no qual a N-ésima amostra anterior é subtraída (retrocedida) cada vez que uma nova amostra entra. Este filtro tem uma resposta de impulso finito mesmo que utilize feedback: após N amostras de um impulso, a saída Será sempre zero. 1.4 Como faço para pronunciar quotFIRquot Algumas pessoas dizem que as letras F-I-R outras pessoas pronunciam como se fosse um tipo de árvore. Nós preferimos a árvore. (A diferença é se você fala sobre um filtro F-I-R ou um filtro FIR.) 1.5 Qual é a alternativa aos filtros FIR Os filtros DSP também podem ser QuotInfinite Impulse Response (IIR). (Veja dspGurus IIR FAQ.) Os filtros IIR usam feedback, então quando você insere um impulso, a saída, teoricamente, toca indefinidamente. 1.6 Como os filtros FIR se comparam aos filtros IIR Cada um tem vantagens e desvantagens. Em geral, porém, as vantagens dos filtros FIR ultrapassam as desvantagens, por isso são usadas muito mais do que IIRs. 1.6.1 Quais são as vantagens dos filtros FIR (em comparação com os filtros IIR) Em comparação com os filtros IIR, os filtros FIR oferecem as seguintes vantagens: Podem ser facilmente concebidos para serem fase quotlinear (e normalmente são). Posto simplesmente, os filtros da fase linear atrasam o sinal de entrada mas donrsquot distorcem sua fase. Eles são simples de implementar. Na maioria dos microprocessadores DSP, o cálculo FIR pode ser feito através de uma única instrução. Eles são adequados para aplicações multi-taxa. Por multi-taxa, quer dizer quotdecimationquot (redução da taxa de amostragem), quotinterpolationquot (aumento da taxa de amostragem), ou ambos. Seja decimando ou interpolando, o uso de filtros FIR permite que alguns dos cálculos sejam omitidos, proporcionando assim uma importante eficiência computacional. Em contraste, se forem usados ​​filtros IIR, cada saída deve ser calculada individualmente, mesmo que a saída seja descartada (assim o feedback será incorporado no filtro). Eles têm propriedades numéricas desejáveis. Na prática, todos os filtros DSP devem ser implementados usando aritmética de precisão finita, ou seja, um número limitado de bits. O uso de aritmética de precisão finita em filtros IIR pode causar problemas significativos devido ao uso de feedback, mas os filtros FIR sem retorno podem ser implementados usando menos bits eo designer tem menos problemas práticos a resolver relacionados à aritmética não ideal. Eles podem ser implementados usando aritmética fracionária. Ao contrário dos filtros IIR, é sempre possível implementar um filtro FIR usando coeficientes com magnitude inferior a 1,0. (O ganho global do filtro FIR pode ser ajustado na sua saída, se desejado.) Esta é uma consideração importante ao usar DSP de ponto fixo, porque torna a implementação muito mais simples. 1.6.2 Quais são as desvantagens dos filtros FIR (em comparação com os filtros IIR) Em comparação com os filtros IIR, os filtros FIR têm, por vezes, a desvantagem de exigirem mais memória e / ou cálculo para obter uma determinada característica de resposta do filtro. Além disso, certas respostas não são práticas para implementar com filtros FIR. 1.7 Quais termos são usados ​​na descrição de filtros FIR Resposta de Impulso - A resposta de resposta de um filtro FIR é apenas o conjunto de coeficientes FIR. (Se você colocar um quotimplusequot em um filtro FIR que consiste em uma amostra quot1quot seguida por muitas quot0quot amostras, a saída do filtro será o conjunto de coeficientes, como a amostra 1 passa passado cada coeficiente, por sua vez, para formar a saída.) Tap - Um quottapquot FIR é simplesmente um par de coeficientes de delay. O número de torneiras FIR (frequentemente designado como quotNquot) é uma indicação de 1) a quantidade de memória necessária para implementar o filtro, 2) o número de cálculos necessários, e 3) a quantidade de quotfilteringquot o filtro pode fazer com efeito, Multiplicar-acumular (MAC) - Em um contexto de FIR, uma quotMACquot é a operação de multiplicar um coeficiente pela amostra de dados atrasada correspondente e acumular o resultado. As FIRs geralmente requerem um MAC por toque. A maioria dos microprocessadores DSP implementa a operação MAC em um único ciclo de instrução. Banda de Transição - A faixa de freqüências entre as bordas passband e stopband. Quanto mais estreita for a banda de transição, mais torneiras serão necessárias para implementar o filtro. (Uma banda de transição quotsmallquot resulta em um filtro quotsharpquot.) Delay Line - O conjunto de elementos de memória que implementam os elementos de retardo quotZ-1quot do cálculo FIR. Buffer circular - Um tampão especial que é quotcircular porque incrementar na extremidade faz com que ele envolva ao redor para o início, ou porque decrementing desde o início faz com que ele envolva ao redor para o fim. Os buffers circulares são frequentemente fornecidos por microprocessadores DSP para implementar a quotmoformação das amostras através da linha de retardo FIR sem ter de mover literalmente os dados na memória. Quando uma nova amostra é adicionada ao buffer, ela substitui automaticamente a mais antiga. Um Filtro IIR Exponencial em Movimento Médio Filtragem de variáveis ​​medidas de circuitos embutidos baseados em microcontrolador é necessário para rastrear o valor médio dos sinais e reduzir sua variabilidade. Como os sinais variam em seu valor médio ao longo do tempo, o filtro precisa ter um meio para descartar medições antigas ao incorporar novas amostras. O filtro de resposta de impulso infinito de média móvel exponencial (IIR) tem sido bem compreendido por muitas décadas e é amplamente utilizado na análise estatística. Ele fornece um meio computacionalmente simples de determinar o valor médio de uma variável quando o modelo subjacente da variável é desconhecido. Se v n é a variável a ser filtrada, então um n-ésimo estimador para o valor médio é: onde a é o coeficiente de peso cujo valor determina a quantidade de suavização. Quanto mais próximo a é 0, maior a quantidade de suavização. Em alguns casos, o algoritmo desta forma produz resultados intermediários que podem se tornar grandes. Para implementar isso usando uma aritmética de inteiros de precisão finita, ele é reformulado em uma forma ligeiramente diferente em que os resultados intermediários são delimitados por um valor conhecido. O coeficiente de peso é representado como um 1-1c. Onde c é uma potência de 2. A potência k pode ser aumentada para aumentar a quantidade de suavização, enquanto que a restrição a uma potência de 2 permitirá que as multiplicações e divisões sejam implementadas usando operações de deslocamento rápido e esquerdo muito rápidas num microprocessador. A quantidade cv av (n) é rastreada para manter a precisão: Se, por exemplo, as amostras são quantidades de 8 bits (como usado em muitos dos algoritmos descritos para os circuitos SMPS aqui descritos) e k é escolhido como sendo 8, então a quantidade Cv av (n) pode ser representado como um valor de 16 bits sem perda de informação (precisamente: 8k bits, veja abaixo). Uma vez que isto foi determinado, a quantidade vv (n) é obtida por um simples deslocamento para a direita por k lugares. Neste ponto há uma perda de informação de menos de 1 lsb magnitude que pode ser absorvida pelas incertezas de v n (note no entanto que pode haver correlações nesta perda de informação que pode causar erros sistemáticos). Assumindo que as variáveis ​​v i são estatisticamente independentes, a análise de variância mostra que é reduzida por um fator 1 (2c). Para mudanças de passo em v n a constante de tempo é c intervalos de cálculo. O rastreio do valor médio torna-se menos preciso à medida que a constante de tempo aumenta para se tornar comparável à frequência mais baixa no modelo de sinal subjacente. Limite superior para o valor médio O filtro começa com v av (0) 0. Todas as medições v n estão entre 0 e menor que B (onde B é normalmente 256 em nossos exemplos). Assim, trabalhando de volta para o início da seqüência (que na prática é sempre finito), que é apenas B. Assim, o valor máximo da média amplificada cv av (n) é cB que está dentro de um número de 16 bits no exemplo acima. No caso em que as amostras têm importância estatística diferente, isto é, algumas têm uma maior probabilidade de erro do que outras, os pesos podem ser aplicados para criar uma forma mais geral do filtro. Estes pesos seriam escolhidos para ter uma relação inversa com a probabilidade de erro. Se w n forem os pesos a serem aplicados, o seguinte filtro pode ser usado: A segunda equação produz uma estimativa IIR da média dos pesos, que é usada na primeira equação. Isto pode ser mostrado para produzir uma estimativa unbassed da média de v n com um fator de esquecimento de (1-a). Como antes, as médias modificadas cw av (n) e cw av (n) v av (n) dadas no lado esquerdo seriam rastreadas, e as quantidades desejadas extraídas por divisão simples.

No comments:

Post a Comment