Estou escrevendo um programa para filtrar um sinal de 20.000 amostras com um filtro Butterworth de quinta ordem offline. Eu tenho acesso a uma implementação da FFT. Parece haver duas alternativas para implementar a filtragem:
- convolver o sinal com a resposta ao impulso no domínio do tempo, ou
- multiplicando o sinal pela resposta ao impulso no domínio da frequência e transformando inversamente o resultado
Esses métodos seriam idênticos no caso teórico do TF. Ao fazê-lo na vida real com a DFT, suponho que as coisas sejam diferentes. Um dos métodos é numericamente mais estável? Existem outros problemas que eu deveria estar ciente? O número de cálculos não é importante.
Respostas:
Com a convolução, você não terá problemas de estabilidade, porque não há filtragem recursiva, portanto não acumulará erros. Em outras palavras, o sistema é todo zeros, sem pólos. Eu ouvi anedoticamente, mas não verifiquei por mim mesmo, que a convolução baseada em FFT tem um erro menor que a convolução no domínio do tempo, simplesmente porque ela possui operações aritméticas O (n log n) em vez de O (n ^ 2).
Normalmente, até onde sei, os filtros Butterworth são implementados como filtros recursivos (IIR), de modo que esse é um tópico diferente. Os filtros IIR têm pólos e zeros, portanto, pode haver problemas de estabilidade na prática. Além disso, para filtros IIR, os métodos baseados em FFT não são uma opção, mas, de cabeça para baixo, os filtros IIR tendem a ser de ordem muito baixa.
No que diz respeito aos problemas de estabilidade dos filtros IIR, eles tendem a ter problemas em ordens mais altas - vou apenas lançar um número e dizer que aproximadamente a 6ª ordem está pressionando. Em vez disso, eles geralmente são implementados como biquads em cascata (seções de filtro de 2ª ordem). Para o seu filtro de 5ª ordem, escreva-o como uma função de transferência de domínio z (será uma função racional de 5º grau) e, em seguida, leve-o em 5 polos e 5 zeros. Colete os conjugados complexos e você terá dois biquads e um filtro de primeira ordem. Em geral, os problemas de estabilidade tendem a surgir à medida que os pólos se aproximam do círculo unitário.
Também pode haver problemas com ruído e ciclos de limite nos filtros IIR, portanto, existem diferentes topologias de filtro (ou seja, formulário direto I, formulário direto II) que possuem propriedades numéricas diferentes, mas eu não pensaria demais nesse ponto - basta usar precisão e quase certamente será bom o suficiente.
fonte
y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)
. Observe que esta é uma combinação das amostras de entrada anteriores (os valores x) e as amostras de saída anteriores (os valores y). Um filtro FIR depende apenas das entradas anteriores, portanto, admite uma implementação eficiente no domínio da frequência. Um filtro IIR não funciona, mas é muito eficiente de qualquer maneira, porque os filtros IIR tendem a ser muito mais baixos.Em quase todos os casos, sua melhor opção não é a convolução nem a FFT, mas simplesmente a aplicação direta do filtro IIR (usando, por exemplo, a função sosfilt ()). Isso será muito mais eficiente em termos de CPU e consumo de memória.
A diferença numérica depende do filtro específico. O único caso em que alguma diferença pode surgir é se os pólos estiverem muito, muito próximos do círculo unitário. Mesmo existem alguns truques que podem ajudar. NÃO USE representação de função de transferência e filtro (), mas use pólos e zeros com sosfilt (). Aqui está um exemplo para a diferença.
filter () fica ruim com um ponto de corte de cerca de 15Hz a 44,1kHz. Para sosfilt (), o ponto de corte pode ficar bem abaixo de 1/100 de Hz a 44,1kHz, sem problemas.
Se você tiver problemas de estabilidade, a FFT também não ajuda muito. Como o filtro é IIR, a resposta ao impulso é infinita e precisa ser truncada primeiro. Nessas frequências muito baixas, a resposta ao impulso é tão longa que a FFT também se torna impraticável.
Por exemplo, se você deseja um corte de 1/100 Hz a 44,1 kHz e deseja uma faixa dinâmica na resposta ao impulso de 100 dB, precisará de aproximadamente 25 milhões de amostras !!! São quase 10 minutos a 44,1 kHz e muitas, muitas vezes mais que o sinal original
fonte
filter
- obrigado! Meu ponto de corte passa-alto é de 0,5 Hz a 250 Hz. Qual o motivo dos problemasfilter
? Eu mesmo estou escrevendo a implementação.Por que você acha que as coisas serão diferentes? Os conceitos teóricos devem ser traduzidos para aplicações práticas, com a única diferença entre as questões de ponto flutuante, da qual não podemos escapar. Você pode verificar facilmente com um exemplo simples no MATLAB:
Como você pode ver, os erros são da ordem da precisão da máquina. Não deve haver motivo para não usar o método FFT. Como o Endolith mencionou, é muito mais comum usar a abordagem FFT para filtrar / convolver / correlacionar, etc. e muito mais rápido, exceto em amostras muito pequenas (como neste exemplo). Não que o processamento no domínio do tempo nunca seja feito ... tudo se resume ao aplicativo, necessidades e restrições.
fonte