Estou codificando algo no momento em que eu estou tendo um monte de valores ao longo do tempo de uma bússola de hardware Esta bússola é muito precisa e atualiza com muita freqüência, com o resultado de que se ele jiggles ligeiramente, eu acabar com o valor estranho que s wildly Inconsistente com seus vizinhos Eu quero alisar esses valores out. Having feito alguma leitura ao redor, parece que o que eu quero é um filtro passa-alta, um filtro passa-baixa ou uma média móvel Meio móvel eu posso começar para baixo com, apenas Manter um histórico dos últimos 5 valores ou o que quer que seja, e usar a média desses valores a jusante no meu código onde eu estava uma vez apenas usando o valor mais recente. Isso deve, eu acho, suavizar os jiggles muito bem, mas me parece que Provavelmente é bastante ineficiente, e este é provavelmente um daqueles Problemas Conhecidos a Programadores Adequados aos quais há uma solução de Matemática Inteligente realmente limpa. Eu sou, no entanto, um daqueles programadores autodidacta horríveis sem um pedaço de educação formal em qualquer coisa mesmo Vagamente relacionado com CompSci ou Math Leitura em torno de um pouco sugere que este pode ser um filtro de alta ou baixa passagem, mas eu não posso encontrar qualquer coisa que explica em termos compreensíveis para um hack como eu o que o efeito desses algoritmos seria sobre uma matriz de valores, deixe Sozinho como a matemática funciona A resposta dada aqui, por exemplo, tecnicamente responde a minha pergunta, mas apenas em termos compreensíveis para aqueles que provavelmente já sabem como resolver o problema. Seria uma pessoa muito bonita e inteligente quem poderia explicar a Tipo de problema que é, e como as soluções funcionam, em termos compreensíveis para um graduado Arts. asked setembro 21 10 at 13 01.Se a sua média móvel tem que ser longo, a fim de atingir o alisamento necessário, e você realmente não precisa Qualquer forma particular de kernel, então você está melhor se você usar uma média móvel exponencial decadência. Onde você escolher minúsculo para ser uma constante adequada, por exemplo, se você escolher minúsculo 1- 1 N, ele terá a mesma quantidade de média como uma janela De tamanho N, Mas distribuído de forma diferente sobre pontos mais antigos. De qualquer forma, uma vez que o próximo valor da média móvel depende apenas do anterior e seus dados, você não tem que manter uma fila ou qualquer coisa E você pode pensar nisso como fazer algo como, Bem, Tenho um novo ponto, mas não confio muito nisso, então vou manter 80 da minha velha estimativa da medição, e só confiar neste novo ponto de dados 20 Isso é praticamente o mesmo que dizer, Bem, eu Apenas confiar neste novo ponto 20, e eu vou usar 4 outros pontos que eu confio na mesma quantidade, exceto que em vez de tomar explicitamente os 4 outros pontos, você está supondo que a média que você fez na última vez foi sensato para que você possa usar o seu anterior Eu sei que este é 5 anos de atraso, mas obrigado por uma resposta incrível Estou trabalhando em um jogo onde o som muda com base na sua velocidade, mas devido à execução do jogo em um lento - ass computador, a velocidade iria flutuar descontroladamente, o que era bom para a direção, mas super irritante in ter Ms do som Esta foi uma solução realmente simples e barata para algo que eu pensei que seria um problema realmente complexo Adam Mar 16 15 às 20 20.Se você está tentando remover o valor ímpar ocasional, um filtro passa-baixa é o melhor do Três opções que você identificou Os filtros de passagem baixa permitem mudanças de baixa velocidade, como as causadas pela rotação de uma bússola à mão, ao mesmo tempo em que rejeitam mudanças de alta velocidade, como as causadas por solavancos na estrada, por exemplo. Provavelmente não será suficiente, uma vez que os efeitos de um único blip em seus dados afetará vários valores subseqüentes, dependendo do tamanho de sua janela média móvel. Se os valores ímpares são facilmente detectados, você pode até ser melhor com um glitch - O primeiro gráfico é o sinal de entrada, com uma falha desagradável O segundo gráfico mostra o efeito de uma média móvel de 10 amostras O gráfico final é uma combinação do algoritmo de 10- Amostra média e E algoritmo de detecção de falha simples mostrado acima Quando a falha é detectada, a média de 10 amostras é usada em vez do valor real. Média de movimento Eu posso começar para baixo com mas me parece que é provavelmente bastante ineficiente. Não há realmente nenhuma razão a A média móvel deve ser ineficiente Você mantém o número de pontos de dados que você deseja em algum buffer como uma fila circular Em cada novo ponto de dados, você pop o valor mais antigo e subtraí-lo de uma soma e empurrar o mais novo e adicioná-lo à soma So Cada novo ponto de dados realmente só envolve um impulso pop, uma adição e uma subtração Sua média móvel é sempre esta soma deslocada dividida pelo número de valores em seu buffer. It fica um pouco mais complicado se você estiver recebendo dados simultaneamente de vários segmentos, mas Desde que seus dados estão vindo de um dispositivo de ferragem que pareça altamente duvidoso me. Oh e também os programadores autodidacta terríveis unem-se. A média movente me pareceu ineficaz porque você tem que armazenar um amortecedor de valores - melhor fazer apenas Alguns Clever Maths com seu valor de entrada e valor de trabalho atual Eu acho que é como funciona a média móvel exponencial Uma otimização que eu vi para este tipo de média móvel envolve o uso de uma fila de comprimento fixo um ponteiro para onde você está nessa fila e apenas Envolvendo o ponteiro ao redor com ou um Voila Nenhum impulso caro empurrar para os amadores, irmão Henry Cooke Sep 22 10 em 0 54. Henry Para um straight-up média móvel você precisa do buffer simplesmente para que você saiba o valor obtém estourou Quando o próximo valor é empurrado Dito isto, a fila de comprimento fixo um ponteiro que você está descrevendo é exatamente o que eu quis dizer por fila circular Isso é por que eu estava dizendo que não é ineficiente O que você acha que eu quis dizer E se a sua resposta é uma matriz Que muda seus valores de volta em cada remoção indexada como vetor std em C bem, então, estou tão magoado nem quero mais falar com você Dan Tao 22 Set 10 a 1 58. Henry Eu não sei sobre AS3, mas Um programador Java tem coleções como CircularQueue A sua disposição Eu não sou um desenvolvedor Java, então eu tenho certeza que existem melhores exemplos lá fora, que é apenas o que eu encontrei a partir de uma pesquisa rápida do Google, que implementa precisamente a funcionalidade estamos falando sobre Eu estou bastante confiante a maioria dos média - E linguagens de baixo nível com bibliotecas padrão têm algo semelhante, por exemplo, lá é fila T De qualquer forma, eu era filosofia-me, então tudo é perdoado Dan Tao Sep 22 10 em 12 44.Uma média móvel exponencial decadente pode ser calculada manualmente com apenas o Se você usar os valores apropriados Veja para uma idéia sobre como fazer isso rapidamente com uma caneta e papel se você está procurando exponencialmente suavizada média móvel com 10 suavização Mas desde que você tem um computador, você provavelmente quer fazer deslocamento binário como Oposto ao deslocamento decimal. Desta forma, tudo que você precisa é uma variável para o seu valor atual e um para a média A próxima média pode então ser calculada a partir de that. answered Sep 21 10 em 14 39.There sa técnica chamada um intervalo de porta t Hat funciona bem com amostras espúrias de baixa ocorrência assumindo o uso de uma das técnicas de filtro mencionadas acima média móvel, exponencial, uma vez que você tem história suficiente uma constante de tempo você pode testar a nova amostra de dados para a razoabilidade, antes de ser adicionado a O conhecimento computacional é necessário para que a amostra bruta seja comparada com o valor suavizado mais recente e se o valor absoluto dessa diferença for maior do que o intervalo permitido, essa amostra é lançada Out ou substituído por alguma heurística, por exemplo, uma previsão baseada no diferencial de declive ou o valor de predição de tendência a partir do duplo suavização exponencial. sugerido Apr 30 16 at 6 56. O Guia do Cientista e do Engenheiro para o Processamento de Sinal Digital Por Steven W Smith, Ph D. Capítulo 15 Moving Average Filters. Relatives da média móvel Filter. In um mundo perfeito, filtro designers só teria de lidar com o domínio do tempo ou freqüência de informações codificadas pelo domínio, mas Nunca uma mistura dos dois no mesmo sinal Infelizmente, existem algumas aplicações onde ambos os domínios são simultaneamente importantes Por exemplo, os sinais de televisão caem nesta categoria desagradável Informações de vídeo é codificado no domínio do tempo, ou seja, a forma da forma de onda corresponde Para os 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 som são adicionadas, a restauração de eliminação da componente DC, etc. , A interferência eletromagnética é melhor compreendida no domínio da freqüência, mesmo se a informação do sinal é 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 de Uma fonte de alimentação de comutação, ou 1320 kHz de uma estação de rádio AM local Os parentes do filtro de média móvel têm melhor performa de domínio de frequência Nce e podem ser úteis nestas aplicações de domínio misturado. 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. Passagens são equivalentes a usar um kernel de filtro triangular um kernel de filtro retangular convolveu com si mesmo Depois de quatro ou mais passes, o kernel de filtro equivalente parece um Gaussian lembrar o Teorema de Limite Central Como mostrado em b, múltiplas passagens produzem uma resposta de passo em forma de s, Em comparação com a linha reta da passagem única As respostas de freqüência em c e d são dadas pela Eq. 15-2 multiplicada por si mesma para cada passagem Isso é, cada vez que a convolução do domínio resulta em uma multiplicação dos espectros de freqüência. A Figura 15-4 mostra A resposta de freqüência de dois outros 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 Gaussiana, conforme discutido no Capítulo 11 T Por exemplo, um breve pulso de luz que entra em uma longa linha de transmissão de fibra óptica 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 as convoluções bidimensionais rápidas, veja o Capítulo 24 A segunda resposta de freqüência na Fig. 15-4 corresponde ao uso de uma janela de Blackman como um kernel de filtro. Significando aqui é simplesmente parte do nome aceito desta curva A forma exata da janela de Blackman é dada no Capítulo 16 Eq 16-2, Fig. 16-2 no entanto, se parece muito com um Gaussiano. Como são esses parentes do movimento Filtro médio melhor do que o próprio filtro de média móvel 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 kernels de filtro cônico para um Menor amplitude 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 são dadas menos peso do que aqueles perto de Terceiro, As respostas 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 em Reduzindo o ruído aleatório enquanto mantém uma resposta de passo nítida A ambiguidade reside na forma como o tempo de subida da resposta de passo é medido Se o tempo de subida é medido de 0 a 100 do passo, o filtro de média móvel é o melhor que pode fazer, Comparação, a medição do risetime de 10 a 90 faz a janela de Blackman melhor do que o filtro de média móvel O ponto é, isto é apenas disputas teóricas considerar estes filtros iguais em Este parâmetro. A maior diferença entre estes filtros é a velocidade de execução Usando um algoritmo recursivo descrito a seguir, o filtro de média móvel será executado como um raio no seu computador Na verdade, é o mais rápido filtro digital disponível Várias passagens da média móvel será correspondentemente mais lento , Mas ainda muito rápido 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 de filtro com base na multiplicação sendo cerca de 10 vezes mais lento do que a adição Por exemplo, espere Um 100 ponto gaussiano para ser 1000 vezes mais lento do que uma média móvel usando recursão. Como outros têm mencionado, você deve considerar um IIR filtro de resposta de impulso infinito, em vez do FIR filtro de resposta de impulso finito que você está usando agora Há mais a ele, Primeiro olhar filtros FIR são implementadas como convolutions explícita e filtros IIR com equações. O filtro IIR especial eu uso muito no microfone Rocontrollers é um filtro de passa-baixo de pólo único Este é o equivalente digital de um filtro analógico RC simples Para a maioria das aplicações, estas 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 resultado de Alguém que não presta atenção na classe de processamento de sinal digital, não como resultado da necessidade de suas características específicas Se você só quer atenuar as altas freqüências que você sabe que são ruído, um filtro de passa-baixo de um único pólo é melhor A melhor maneira de implementar um digitalmente em um Microcontrolador é geralmente. FILT - 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 é o filtro Fração que ajusta o peso do filtro Olhe para este algoritmo e veja que para FF 0 o filtro é infinitamente pesado desde que a saída nunca muda Para FF 1, é realmente nenhum filtro em Todos desde que a saída apenas segue a entrada Os valores úteis estão entre os pequenos sistemas que você escolhe FF para ser 1 2 N para 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 eo Multiplicar por FF, portanto, um deslocamento para a direita de 4 bits. Caso contrário, este filtro precisa apenas de uma subtração e um adicionar, embora os números geralmente precisam ser mais amplos do que o valor de entrada mais precisão numérica em uma seção separada abaixo. Que são necessários e aplicar dois destes filtros em cascata Este é o equivalente digital de dois filtros RC em série, e atenua por 12 dB oitava acima da freqüência rolloff No entanto, para leituras AD é geralmente mais relevante para olhar para o filtro na Tempo, considerando a sua resposta passo Isto diz-lhe quão rápido seu sistema vai ver uma mudança quando a coisa que você está medindo changes. To facilitar a concepção destes filtros que só significa escolher FF e decidir quantos de Eles para a cascata, eu uso o meu programa FILTBITS Você especifica o número de bits de mudança para cada FF na série de filtros em cascata, e ele calcula a resposta de passo e outros valores Na verdade eu costumo correr isso através do meu script wrapper PLOTFILT Isso executa FILTBITS, Faz um arquivo CSV, então 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 deslocamento para Perceber a multiplicar por FF Os dois valores FF são, portanto, 1 16 neste caso. O traço vermelho é a resposta da etapa unitária e é a principal coisa a olhar. Por exemplo, isso informa que se a entrada muda instantaneamente, a saída de O filtro combinado irá resolver 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 cheio Amplitude E spike Isto dá-lhe alguma idéia da supressão de ruído aleatório Parece que nenhuma amostra única causará mais do que uma mudança de 2 5 na saída. O traço azul é dar uma sensação subjetiva do que este filtro faz com ruído branco Isso não é Um teste rigoroso desde que não há nenhuma garantia o que exatamente o índice era dos números aleatórios escolhidos como a entrada branca do ruído para esta execução de PLOTFILT É 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 PIC Development Tools software release na minha página de downloads de software. Added sobre precisão numérica. I ver a partir dos comentários e agora uma nova resposta que há Interesse em discutir o número de bits necessários para implementar este filtro Note que a multiplicar por FF irá 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 é ac Por exemplo, se você estiver filtrando as leituras de AD de 10 bits e N 4 FF, por exemplo, se você estiver filtrando leituras de AD de 10 bits e N 4 FF 1 16, então você precisa de 4 bits de fração abaixo do valor inteiro de 10 bits AD Leituras Uma maioria de processadores, você estará fazendo operações inteiras de 16 bits devido às leituras AD de 10 bits Neste caso, você ainda pode fazer exatamente as mesmas operações de 16 bits inteiros , Mas comece com as leituras AD esquerda deslocado por 4 bits O processador doesn t sabe a diferença e doesn t necessidade de fazer a matemática inteira inteiros de 16 bits funciona se você considerá-los a ser 12 4 ponto fixo ou verdadeiro 16 bits inteiros 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 que ter 10 4 4 18 bits para não perder Na prática, em uma máquina de 8 bits que significa yo Ud 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 Execute uma operação de pólo de filtro e, em seguida, aplique isso a cada pólo Se uma subrotina ou macro depende se ciclos ou memória de programa são mais importantes nesse projeto específico De qualquer maneira, eu uso algum estado de zero para passar NOVO para a macro de subrotina, , Mas também carrega isso para o mesmo estado de arranhão NOVO estava em Isto 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 em O caminho, que é atualizado para logo após FILT no caminho para fora Que maneira a sub-rotina opera automaticamente em consecutivos filtros na memória se chamado várias vezes Com uma macro você don t precisa de um ponteiro desde que você passar o 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 esses exemplos são implementados como macros usando meu montador PIC Pré-processador, que é mais capaz do que qualquer das instalações macro incorporadas. Clabacchio Outra questão que eu deveria ter mencionado é a implementação de firmware Você pode escrever uma única subpasta de filtro de passagem de pólo único uma vez, em seguida, aplicá-lo várias vezes Na verdade eu costumo escrever uma sub-rotina para levar um ponteiro na memória para o estado de filtro, O ponteiro para que possa ser chamado em sucessão facilmente para realizar filtros multi-polo 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 Standard LowPass Filter, 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 do hardware que eu queria tomar uma média, a fim de ser capaz de reagir a estes Hardware Mudanças específicas automaticamente sensslen maio 21 12 em 12 06.If você pode viver com a restrição de um poder de dois número de itens para 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 Baixo desempenho micro sem divisão dedicada porque pode ser feito como um deslocamento de bit Cada turno direito é uma potência de dois eg. O OP pensou que ele tinha dois problemas, dividindo em um PIC16 e memória para seu buffer anel Esta resposta mostra que a divisão Não é difícil Reconhecidamente não aborda o 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 s Como algumas das outras respostas exigem uma operação de divisão, eles São igualmente incompletos, uma vez que eles não mostram como efetivamente conseguir isso em um PIC16 Martin Apr 20 12 at 13 01.There é 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 It s Chamado de cascata integrador-comb filtro CIC A idéia é que você tem um integrador que você tomar as diferenças de um período de tempo, ea chave dispositivo de economia de memória é que por downsampling, você don t tem que armazenar eve Ry valor do integrador Ele pode ser implementado usando o seguinte pseudocódigo. Seu comprimento médio móvel eficaz é decimationFactor statesize, mas você só precisa manter em torno de amostras statesize Obviamente, você pode obter melhor desempenho se o seu statesize e decimationFactor são poderes de 2, Divisão e restante operadores são substituídos por mudanças 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ê don t necessidade a freqüência-nulos de um filtro de vagão, um pólo Ou filtro passa-baixo de 2 pólos provavelmente funcionará bem. Por outro lado, se você estiver filtrando para fins de decimação, tendo uma entrada de alta taxa de amostragem e calculando a sua média para uso por um processo de baixa taxa, em seguida, um filtro CIC Pode ser apenas o que você está procurando, especialmente se você pode usar statesize 1 e evitar o ringbuffer completamente com apenas um valor único integrador anterior. Há alguma análise em profundidade da matemática por trás usando o primeiro ord Er IIR filtro que Olin Lathrop já descreveu mais sobre a Digital Signal Processing pilha intercâmbio inclui lotes de belas imagens A equação para este IIR filtro is. This pode ser implementado usando apenas inteiros e nenhuma divisão usando o código a seguir pode precisar de depuração como eu Estava a escrever a partir da memória. Este filtro aproxima uma média móvel das últimas amostras K, 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 Vou verificar o código listado aqui, logo que eu recebo uma alteração e editar esta resposta, se needed. answered Jun 23 12 at 4 04.Here sa um filtro polar de passo único média móvel, com Freqüência de corte CutoffFrequency Muito simples, muito rápido, funciona muito bem, e quase nenhuma memória overhead. Note Todas as variáveis têm escopo além da função de filtro, exceto o passado in newInput. Note Este é um filtro de estágio único Vários estágios podem ser cascata juntos para aumentar a Nitidez de O filtro Se você usar mais de uma fase, você terá que ajustar DecayFactor como se relaciona com o Cutoff-Frequency para compensar. E, obviamente, tudo o que você precisa é que as duas linhas colocadas em qualquer lugar, eles don t precisa 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. 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 simples são bons o suficiente para a maioria das coisas, eu só prefiro dobros 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 é uma potência de 2 inteiros para que você possa bit-shift para a direita como o denominador, em vez de ter que dividir durante o loop de filtro para Exemplo, se 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 este, um excelente livro que Para o paradigma Mudando Média, uma abordagem diferente para definir DecayFactor e AmplitudeFactor que podem ser mais relevantes para as suas necessidades, vamos dizer que você quer o anterior, cerca de 6 itens média tog Você pode adicionar 6 itens e dividir por 6, então você pode definir o AmplitudeFactor para 1 6, e DecayFactor para 1 0 - AmplitudeFactor. answered 14 de maio 12 em 22 55.Everyone mais tem comentado completamente sobre o utilitário De IIR vs FIR, e na potência de dois divisão I d apenas 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 É single-cycle bit-shifting. Botor FIR ring buffer manter um buffer de execução dos últimos N valores, e uma soma corrente de todos os valores no buffer Cada vez que uma nova amostra vem, subtrair o mais antigo valor no buffer de SUM , Substitua-a pela nova amostra, adicione a nova amostra à SUM e a saída SUM. O buffer de anel IIR modificado mantém uma Soma corrente dos últimos N valores Cada vez que uma nova amostra entra, SUM - SUM N, adicione a nova amostra Amostra e saída SOMA N. resposta agosto 28 13 em 13 45.Se eu estou lendo-o direito, você está descrevendo uma primeira ordem IIR filtro o valor que você está subtraindo isn t o valor mais antigo que está caindo, mas é, em vez disso, a média dos valores anteriores Filtros de primeira ordem IIR pode certamente ser útil, mas não tenho certeza o que você quer dizer quando você sugere que a saída É a mesma para todos os sinais periódicos A uma taxa de amostragem de 10KHz, alimentar 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 fica baixo Para 30 Um filtro de IIR de primeira ordem supercat Aug 28 13 at 15 31. produzirá uma onda que começa bruscamente a subir e gradualmente nivela próximo mas não ao máximo de entrada, então começa bruscamente a cair e gradualmente nivela próximo mas não na entrada Mínimo Um comportamento muito diferente supercat Aug 28 13 at 15 32.One 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 dar-lhe um Retângulo no tempo - a sinc in Freq - e você não pode gerenciar os lóbulos laterais Pode ser bem vale a pena jogar em alguns inteiros multiplica para torná-lo uma simpática simétrica sintonizável FIR se você pode poupar o relógio carrapatos Scott Seidman agosto 29 13 em 13 50. ScottSeidman Não Necessidade de multiplicações se um simplesmente tem cada estágio da FIR ou saída a média da entrada para essa fase e seu valor armazenado anterior e, em seguida, armazenar a entrada se um tiver o intervalo numérico, pode-se usar a soma em vez de média Se isso S 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 1ms supercat Aug 29 13 at 15 25.As mikeselectricstuff disse, se você realmente precisa reduzir suas necessidades de memória, e você don t mente sua resposta ao impulso sendo um exponencial em vez de um pulso retangular, eu Iria para uma ave movendo exponencial Rage filter Eu uso-os extensivamente Com esse tipo de filtro, você não precisa de nenhum buffer Você não precisa armazenar N amostras passadas Apenas um Assim, seus requisitos de memória são cortados por um fator de N. Também, 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 muda para a direita No entanto, estamos em 2017, e eu recomendo que você use compiladores e MCUs que permitem Para trabalhar 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 a maneira como a natureza se comporta, na maioria dos casos. Uma questão 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 bias truncamento supondo que N i Uma potência de dois, e somente a aritmética inteira é usada, a direita do turno sistematicamente elimina os LSBs da nova amostra. Isso significa que quanto tempo a série poderia ser, a média nunca levará isso em consideração. Diminuindo a série 8,8,8 8,7,7,7 7,6,6 e suponha que a média é de fato 8 no início A amostra do punho 7 trará a média para 7, independentemente da intensidade do filtro Apenas para uma amostra Same História para 6, etc. Agora pense no oposto que a série vai acima A média permanecerá em 7 para sempre, até que a amostra seja grande bastante para fazê-la mudar. Naturalmente, você pode corrigir o viés adicionando 1 2 N 2, mas Que 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 N 4, por exemplo, qualquer amostra acima de zero manterá a média inalterada. Que implicaria para segurar um acumulador dos LSBs perdidos Mas eu didn t torná-lo longe o suficiente para ter código pronto, E eu não tenho certeza que não iria prejudicar o poder IIR em alguns outros casos de séries, 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.
Comments
Post a Comment