O Guia de cientistas e engenheiros para processamento de sinal digital Por Steven W. Smith, Ph. D. Capítulo 14: Introdução aos Filtros Digitais Filtros de Passagem Alta, Passagem de Banda e Rifa de Banda Os filtros de passagem de alta, passagens de banda e rejeição de bandas são projetados começando com um filtro passa-baixa e depois convertendo-o na resposta desejada . Por esse motivo, a maioria das discussões sobre o design do filtro apenas fornece exemplos de filtros passa-baixa. Existem dois métodos para a conversão passa-baixa para conversão passa alta: inversão espectral e inversão espectral. Ambos são igualmente úteis. Um exemplo de inversão espectral é mostrado em 14-5. A Figura (a) mostra um kernel de filtro de passagem baixa chamado windowed-sinc (o tópico do Capítulo 16). Este kernel de filtro tem 51 pontos de duração, embora muitas das amostras tenham um valor tão pequeno que parecem ser zero neste gráfico. A resposta de freqüência correspondente é mostrada em (b), encontrada adicionando 13 zeros ao kernel de filtro e tomando uma FFT de 64 pontos. Duas coisas devem ser feitas para alterar o kernel do filtro passa-baixa em um kernel de filtro de passagem alta. Primeiro, altere o sinal de cada amostra no kernel de filtro. Em segundo lugar, adicione um à amostra no centro da simetria. Isso resulta no kernel do filtro passa alto mostrado em (c), com a resposta de freqüência mostrada em (d). A inversão espectral dispara a resposta de freqüência de cima para baixo. Alterando as passas em batentes de batente e as batentes para as passas. Em outras palavras, ele muda um filtro de passagem baixa para passe alto, passe alto para passe baixo, passagem de banda para rejeição de banda ou rejeição de banda para banda passada. A Figura 14-6 mostra por que essa modificação de dois passos para o domínio do tempo resulta em um espectro de freqüência invertido. Em (a), o sinal de entrada, x n, é aplicado em dois sistemas em paralelo. Um desses sistemas é um filtro passa-baixa, com uma resposta de impulso dada por h n. O outro sistema não faz nada ao sinal e, portanto, tem uma resposta de impulso que é uma função delta, delta n. A saída global, y n, é igual à saída do sistema all-pass menos a saída do sistema passa-baixa. Uma vez que os componentes de baixa frequência são subtraídos do sinal original, apenas os componentes de alta frequência aparecem na saída. Assim, é formado um filtro passa-alto. Isso pode ser executado como uma operação em dois passos em um programa de computador: execute o sinal através de um filtro passa-baixa e, em seguida, subtraia o sinal filtrado do original. No entanto, toda a operação pode ser realizada em um estágio de sinal combinando os dois kernels de filtro. Conforme descrito no Capítulo 7, sistemas paralelos com resultados adicionados podem ser combinados em uma única etapa, adicionando suas respostas de impulso. Conforme mostrado em (b), o kernel de filtro para o filtro passa-alto é dado por: delta n-h n. Ou seja, altere o sinal de todas as amostras e, em seguida, adicione uma à amostra no centro da simetria. Para que esta técnica funcione, os componentes de baixa freqüência que saem do filtro de passagem baixa devem ter a mesma fase que os componentes de baixa freqüência saindo do sistema de passagem total. Caso contrário, uma subtração completa não pode ocorrer. Isso coloca duas restrições sobre o método: (1) o kernel de filtro original deve ter simetria esquerda-direita (ou seja, uma fase zero ou linear) e (2) o impulso deve ser adicionado no centro da simetria. O segundo método para passagem baixa para conversão de passagem alta, inversão espectral. Está ilustrado na Fig. 14-7. Assim como antes, o kernel do filtro de passagem baixa em (a) corresponde à resposta de freqüência em (b). O kernel de filtro passa alto, (c), é formado alterando o sinal de cada outra amostra em (a). Conforme mostrado em (d), isso alterna o domínio de freqüência para a esquerda para a direita. 0 torna-se 0,5 e 0,5 torna-se 0. A frequência de corte do exemplo filtro passa-baixa é 0,15, resultando na frequência de corte do filtro passa-alto sendo 0,35. Alterar o sinal de cada outra amostra equivale a multiplicar o kernel do filtro por uma sinusoide com uma freqüência de 0,5. Conforme discutido no Capítulo 10, isso tem o efeito de mudar o domínio da freqüência em 0,5. Veja (b) e imagine as freqüências negativas entre -0,5 e 0 que são de imagem espelhada das freqüências entre 0 e 0,5. As frequências que aparecem em (d) são as frequências negativas de (b) deslocadas em 0,5. Por fim, Figs. 14-8 e 14-9 mostram como os kernels de filtro passa-alto e passa-alto podem ser combinados para formar filtros de banda passada e de rejeição de banda. Em suma, a adição de kernels de filtro produz um filtro de rejeição de banda, ao mesmo tempo em que convolver os kernels de filtro produz um filtro passa-banda. Estes são baseados na forma como os sistemas em cascata e paralelos são combinados, conforme discutido no Capítulo 7. Podem também ser utilizadas múltiplas combinações destas técnicas. Por exemplo, um filtro de passagem de banda pode ser projetado adicionando os dois kernels de filtro para formar um filtro passa-banda e, em seguida, use inversão espectral ou inversão espectral conforme descrito anteriormente. Todas essas técnicas funcionam muito bem com poucas surpresas. A remoção remove as variações de curto prazo ou quotnoisequot para revelar a forma subestimada subjacente importante dos dados. A operação suave da Igoracutes realiza caixa, quotbinomialquot e suavização Savitzky-Golay. Os diferentes algoritmos de suavização convolvem os dados de entrada com diferentes coeficientes. O suavização é um tipo de filtro passa-baixa. O tipo de suavização e a quantidade de suavização alteram a resposta de frequência do filtro: a média móvel (também conhecido como Suavização de caixa) A forma mais simples de suavização é a média de quotmoving que simplesmente substitui cada valor de dados pela média de valores vizinhos. Para evitar a mudança dos dados, é melhor calcular a mesma quantidade de valores antes e depois, onde a média está sendo calculada. Na forma de equação, a média móvel é calculada por: Outro termo para esse tipo de alisamento é quotsliding averagequot, quotbox smoothingquot ou quotboxcar smoothingquot. Ele pode ser implementado convolvendo os dados de entrada com um pulso em forma de caixa de valores 2M1 todos iguais a 1 (2M1). Nós chamamos esses valores o quotcoefficientsquot do quotmoothing kernelquot: Binomial Smoothing Binomial suavização é um filtro gaussiano. Ele convence seus dados com coeficientes normalizados derivados do triângulo Pascalacutes em um nível igual ao parâmetro Smoothing. O algoritmo é derivado de um artigo de Marchand e Marmet (1983). Savitzky-Golay Smoothing Savitzky-Golay suavização usa um conjunto diferente de coeficientes précomputados populares no campo da química. É um tipo de alisamento polinomial de Menos Quadrados. A quantidade de suavização é controlada por dois parâmetros: a ordem polinomial e o número de pontos utilizados para calcular cada valor de saída suavizado. Referências Marchand, P. e L. Marmet, filtro de suavização binomial: uma maneira de evitar algumas armadilhas de alisamento polinomial de mínimos quadrados, Rev. Sci. Instrum. . 54. 1034-41, 1983. Savitzky, A. e M. J.E. Golay, Suavização e diferenciação de dados por procedimentos simplificados de mínimos quadrados, Química Analítica. 36. 1627-1639, 1964. Estou codificando algo no momento em que estou levando um monte de valores ao longo do tempo a partir de uma bússola de hardware. Esta bússola é muito precisa e atualiza-se com muita frequência, com o resultado de que, se ela for ligeiramente leve, acabo com o valor estranho que é extremamente incompatível com seus vizinhos. Eu quero suavizar esses valores. Tendo feito alguma leitura ao redor, parece que o que eu quero é um filtro passa-alto, um filtro passa-baixa ou uma média móvel. Mudar a média com que consigo descer, mantenho um histórico dos últimos 5 valores ou o que quer que seja e use a média desses valores a jusante no meu código, onde acabei de usar o valor mais recente. Isso deve, penso eu, suavizar esses jiggles bem, mas isso me parece que é provavelmente bastante ineficiente, e este é provavelmente um desses Problemas Conhecidos para Programadores Aprovados para o qual existe uma solução de Matemática inteligente inteligente. Eu sou, no entanto, um daqueles horríveis programadores autodidatas sem um pingo de educação formal em qualquer coisa, mesmo vagamente relacionada com CompSci ou Matemática. Ler em torno de um pouco sugere que este pode ser um filtro de passagem alta ou baixa, mas não consigo encontrar nada que explique em termos compreensíveis para um hack como eu, qual seria o efeito desses algoritmos em uma série de valores, e muito menos como as matemáticas trabalho. A resposta dada aqui. Por exemplo, tecnicamente responde a minha pergunta, mas apenas em termos compreensíveis para aqueles que provavelmente já saberiam como resolver o problema. Seria uma pessoa muito adorável e inteligente, de fato, quem poderia explicar o tipo de problema que isso é, e como funcionam as soluções, em termos compreensíveis para um graduado em artes. Perguntou 21 de setembro às 13:01 Se sua média móvel deve ser longa para conseguir o alisamento necessário e você realmente não precisa de nenhuma forma específica de kernel, então você estará melhor se usar uma média móvel exponencialmente decadente: onde você Escolha minúsculo para ser uma constante apropriada (por exemplo, se você escolher um pequeno 1- 1N, ele terá a mesma quantidade de média como uma janela de tamanho N, mas distribuído de maneira diferente em pontos mais antigos). De qualquer forma, uma vez que o próximo valor da média móvel depende apenas do anterior e de seus dados, você não precisa manter uma fila ou qualquer coisa. E você pode pensar nisso como fazendo algo como, Bem, eu tenho um novo ponto, mas eu realmente não confio nisso, então eu vou manter 80 da minha antiga estimativa da medição, e só confio neste novo ponto de dados 20. Isso é Praticamente o mesmo que dizer: Bem, eu só confio neste novo ponto 20, e eu uso 4 outros pontos que eu confio na mesma quantidade, exceto que em vez de tomar explicitamente os outros 4 pontos, você assumirá que a média que você fez na última vez Foi sensato para que você possa usar seu trabalho anterior. Respondeu 21 de setembro 10 às 14:27 Ei, eu sei que isso é 5 anos de atraso, mas obrigado por uma ótima resposta. Estou trabalhando em um jogo onde o som muda com base em sua velocidade, mas, devido ao funcionamento do jogo em um computador de câmera lenta, a velocidade flutuaria selvagemente, o que era bom para a direção, mas super irritante em termos de som. Esta foi uma solução muito simples e barata para algo que pensei que seria um problema realmente complexo. Ndash Adam Mar 16 15 at 20:20 Se você está tentando remover o valor ímpar ocasional, um filtro passa-baixa é a melhor das 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 que rejeitam mudanças de alta velocidade, como as causadas por solavancos na estrada, por exemplo. Uma média móvel provavelmente não será suficiente, uma vez que os efeitos de uma única descarga em seus dados afetarão vários valores subsequentes, dependendo do tamanho da sua janela média móvel. Se os valores estranhos forem facilmente detectados, você pode até estar melhor com um algoritmo de remoção de falhas que os ignora completamente: Aqui está um gráfico de guick para ilustrar: 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 da média de 10 amostras e do 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. Respondeu 21 de setembro 10 às 13:38 Bem explicado e pontos de bônus para o gráfico) ndash Henry Cooke 22 de setembro 10 às 0:50 Wow. Seldemente vi uma resposta tão agradável ndash Muis Jun 4 13 às 9:14 A média móvel é um filtro passa-baixa. Ndash nomen 21 de outubro às 19:36 Experimente uma mediana de fluxo de ar em vez disso. Ndash kert 25 de abril 14 às 22:09 Mover média com a qual posso descer. Mas parece-me que é provavelmente bastante ineficiente. Realmente, nenhum motivo para uma média móvel deve ser ineficiente. Você mantém o número de pontos de dados desejados em algum buffer (como uma fila circular). Em cada novo ponto de dados, você exibe o valor mais antigo e subtrai-lo de uma soma, e empurre o mais novo e adicione-o à soma. Portanto, cada novo ponto de dados realmente só envolve um poppush, uma adição e uma subtração. Sua média móvel é sempre essa soma de mudança dividida pelo número de valores em seu buffer. Isso fica um pouco mais complicado se você estiver recebendo dados simultaneamente de vários tópicos, mas como seus dados são provenientes de um dispositivo de hardware que parece muito duvidoso para mim. Ah, e também: os horríveis programadores autodidatas se unem) A média móvel pareceu ineficiente para mim porque você precisa armazenar um buffer de valores - melhor para fazer algumas Matemáticas Inteligentes com seu valor de entrada e valor de trabalho atual Eu acho que isso é como a média móvel exponencial trabalho. Uma otimização que eu vi para este tipo de média móvel envolve o uso de um amplificador de espera de comprimento fixo, um ponteiro para onde você está na fila, e apenas empacotando o ponteiro ao redor (com ou um if). Voila Não há pushpop caro. Poder para os amadores, irmão ndash Henry Cooke 22 de setembro 10 às 0:54 Henry: Para uma média móvel direta, você precisa do buffer simplesmente para que você saiba o valor que aparece quando o próximo valor é empurrado. Dito isto, o amplo amplificador de espera de comprimento fixo que você está descrevendo é exatamente o que eu quis dizer com uma fila quotcircular. Por isso, eu estava dizendo que isso não é ineficiente. O que você achou que eu quis dizer E se sua resposta é uma matriz quotan que muda seus valores de volta em cada remoção indexada (como std :: vector em C). Bem, então, eu já estou doente, nem quero falar com você mais) ndash Dan Tao 22 de setembro 10 às 1:58 Henry: Eu não sei sobre AS3, mas um programador de Java tem coleções como CircularQueue em sua disposição (I39m não é um Desenvolvedor de Java, então eu tenho certeza de que há exemplos melhores lá fora, esse é o que eu encontrei a partir de uma busca rápida do Google), que implementa precisamente a funcionalidade em que estamos falando. Estou bastante confiante de que a maioria das linguagens de nível médio e baixo com bibliotecas padrão tem algo semelhante (por exemplo, no. NET there39s QueueltTgt). Enfim, eu também era filosofia. tudo é perdoado. Ndash Dan Tao 22 de setembro 10 às 12:44 Uma média móvel exponencialmente decadente pode ser calculada manualmente com apenas a tendência se você usar os valores apropriados. Veja quatromilab. chhackdiete4 para uma idéia sobre como fazer isso rapidamente com uma caneta e papel, se você estiver procurando uma média móvel suavemente exponencial com 10 suavização. Mas, como você tem um computador, você provavelmente deseja fazer mudanças binárias em oposição à mudança decimal). Desta forma, tudo que você precisa é uma variável para seu valor atual e outra para a média. A próxima média pode então ser calculada a partir disso. Respondeu 21 de setembro 10 às 14:39 há uma técnica chamada de portão de alcance que 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ê tenha um histórico suficiente (uma Constante de Tempo), você pode testar a nova amostra de dados recebidos por razoabilidade, antes de ser adicionada à computação. É necessário algum conhecimento da taxa de mudança máxima razoável do sinal. A amostra bruta é comparada ao valor mais liso e se o valor absoluto dessa diferença é maior que o intervalo permitido, essa amostra é descartada (ou substituída por alguma heurística, por exemplo, uma previsão baseada no diferencial de inclinação ou na tendência Valor de previsão de suavização exponencial dupla) 30 de abril 16 às 6:56
Комментариев нет:
Отправить комментарий