É numericamente mais estável implementar a filtragem como multiplicação ou convolução?


12

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.


O método FFT será muito mais rápido para calcular para a maioria dos comprimentos de sinal. Somente comprimentos curtos são mais rápidos com a convolução no domínio do tempo.
endolith

Respostas:


5

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.


O que você quer dizer com trabalhar apenas para filtros FIR? Eu assumi que os filtros IIR teriam que ser amostrados de alguma maneira. Os filtros IIR geralmente são implementados no domínio do tempo para evitar isso?
Andreas

1
Tanto quanto sei, os filtros IIR são sempre implementados no domínio do tempo. Um filtro IIR (aqui, por exemplo, um filtro de segunda ordem ou "biquad") é definido por uma equação de diferença como 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.
21411 schnarf

1
A razão pela qual os filtros IIR tendem a ser de ordem muito mais baixa é que os polos (o feedback das amostras de saída anteriores) permitem que o filtro fique muito mais íngreme com muito poucos coeficientes em comparação com um filtro FIR. Quando digo ordem muito mais baixa, um filtro IIR típico pode ser de segunda ordem (5 coeficientes), enquanto um filtro FIR típico para a mesma tarefa pode ter milhares de coeficientes.
2111 schnarf

4

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.

n = 2^16;  % filter length
fs = 44100; % sample rate
x = zeros(n,1); x(1) = 1;
f0 = 15; % cutoff frequency in Hz
% design with poles and zeroes
[z,p,k] = butter(5,f0*2/fs);
clf
plot(sosfilt(zp2sos(z,p,k),x));
% design with transfer function
[b,a] = butter(5,f0*2/fs);
hold on
plot(filter(b,a,x),'k');

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


Isso realmente não responde à pergunta sobre problemas numéricos, mas eu não estava ciente dos problemas com filter- obrigado! Meu ponto de corte passa-alto é de 0,5 Hz a 250 Hz. Qual o motivo dos problemas filter? Eu mesmo estou escrevendo a implementação.
Andreas

2

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:

x=randn(5,1);
y=randn(5,1);
X=fft(x,length(x)+length(y)-1);
Y=fft(y,length(x)+length(y)-1);

z1=conv(x,y);z2=ifft(X.*Y);
z1-z2

ans =

   1.0e-15 *

   -0.4441
   -0.6661
         0
   -0.2220
    0.8882
   -0.2220
         0
   -0.4441
    0.8882

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.


1
Eu acho que a pergunta original foi aprofundar os problemas de ponto flutuante inerentes à filtragem baseada em FFT versus a implementação direta do filtro no domínio do tempo. Isso pode ser uma preocupação real para o processamento de sinal de ponto fixo, se você tiver filtros realmente longos ou se a implementação de FFT for ruim, por exemplo. Você definitivamente não verá nenhum efeito para seqüências de comprimento 5 em ponto flutuante de precisão dupla.
Jason R

@JasonR Os erros ainda são de precisão da máquina se você estender o comprimento das seqüências para 1e6 no exemplo acima. Os erros que você menciona surgem principalmente devido ao design inadequado do filtro ou à má implementação da FFT. Se tudo estiver bem, não vejo por que a convolução no domínio do tempo deveria dar uma resposta diferente daquela no domínio da frequência.
precisa saber é o seguinte

1
Ele não deve fornecer uma resposta diferente com base em qual domínio você faz os cálculos. Meu único argumento é que as operações matemáticas reais diferem muito entre as duas abordagens, portanto, dependendo das implementações de cada uma que você tem disponível, é possível que você podia ver diferenças tangíveis. Para precisão dupla, supondo que você tenha boas implementações, eu não esperaria nenhuma diferença, exceto em casos extremos.
Jason R
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.