È numericamente più stabile implementare il filtraggio come moltiplicazione o convoluzione?


12

Sto scrivendo un programma per filtrare un segnale di 20.000 campioni con un filtro Butterworth di quinto ordine offline. Ho accesso a un'implementazione FFT. Sembra che ci siano due alternative per l'implementazione del filtro:

  • coinvolgendo il segnale con la risposta all'impulso nel dominio del tempo, o
  • moltiplicando il segnale con la risposta all'impulso nel dominio della frequenza e trasformando inversa il risultato

Questi metodi sarebbero identici nel caso FT teorico. Farlo nella vita reale con il DFT, tuttavia, suppongo che le cose siano diverse. Uno dei metodi è numericamente più stabile? Ci sono altri problemi di cui dovrei essere a conoscenza? Il numero di calcoli non è importante.


Il metodo FFT sarà molto più veloce da calcolare per la maggior parte delle lunghezze del segnale. Solo le brevi lunghezze sono più veloci con la convoluzione nel dominio del tempo.
endolith

Risposte:


5

Con convoluzione, non si verificheranno problemi di stabilità, perché non esiste un filtro ricorsivo, quindi non si accumuleranno errori. In altre parole, il sistema è tutto zeri, nessun polo. Ho sentito aneddoticamente, ma non verificato per me stesso, che la convoluzione basata su FFT ha un errore inferiore rispetto alla convoluzione nel dominio del tempo, semplicemente perché ha operazioni aritmetiche O (n log n) anziché O (n ^ 2).

In genere, per quanto ne so, i filtri Butterworth sono implementati come filtri ricorsivi (IIR), quindi questo è un argomento diverso. I filtri IIR hanno poli e zeri, quindi in pratica possono esserci problemi di stabilità. Inoltre, per i filtri IIR, i metodi basati su FFT non sono un'opzione, ma al rialzo, i filtri IIR tendono ad essere di ordine molto basso.

Per quanto riguarda i problemi di stabilità con i filtri IIR, tendono ad avere problemi a ordini più alti: lancerò un numero e dirò che circa il 6 ° ordine lo sta spingendo. Invece, sono tipicamente implementati come biquad in cascata (sezioni filtro del 2 ° ordine). Per il filtro del 5 ° ordine, scrivilo come una funzione di trasferimento del dominio z (sarà una funzione razionale di 5 ° grado), quindi fattorizzalo nei suoi 5 poli e 5 zeri. Raccogli i coniugati complessi e avrai due biquad e un filtro del primo ordine. In generale, i problemi di stabilità tendono a spuntare man mano che i poli si avvicinano al cerchio dell'unità.

Ci possono anche essere problemi con rumore e cicli limite nei filtri IIR, quindi ci sono diverse topologie di filtro (cioè forma diretta I, forma diretta II) che hanno proprietà numeriche diverse, ma non penserei troppo a questo punto - basta usare il doppio- precisione e quasi sicuramente sarà abbastanza buono.


Cosa intendi con funzionante solo per i filtri FIR? Supponevo che i filtri IIR avrebbero dovuto essere campionati in qualche modo. I filtri IIR sono generalmente implementati nel dominio del tempo per evitarlo?
Andreas,

1
Per quanto ne so, i filtri IIR sono sempre implementati nel dominio del tempo. Un filtro IIR (qui, ad esempio, un filtro del secondo ordine o "biquad") è definito da un'equazione di differenza come y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2). Si noti che questa è una combinazione dei precedenti campioni di input (i valori x) e dei precedenti campioni di output (i valori y). Un filtro FIR dipende solo dagli input passati, quindi ammette un'implementazione del dominio di frequenza efficiente. Un filtro IIR no, ma è comunque molto efficiente perché i filtri IIR tendono ad essere di ordine molto inferiore.
schnarf,

1
Il motivo per cui i filtri IIR tendono ad essere di ordine molto inferiore è che i poli (il feedback dei precedenti campioni di output) consentono al filtro di diventare molto più ripido con pochissimi coefficienti rispetto a un filtro FIR. Quando dico un ordine molto più basso, un tipico filtro IIR potrebbe essere di secondo ordine (5 coefficienti), mentre un tipico filtro FIR per lo stesso compito potrebbe avere migliaia di coefficienti.
schnarf,

4

In quasi tutti i casi la scelta migliore non è né convoluzione né FFT, ma semplicemente applicando direttamente il filtro IIR (usando ad esempio la funzione sosfilt ()). Ciò sarà notevolmente più efficiente in termini di consumo di CPU e memoria.

La differenza numerica dipende dal filtro specifico. L'unico caso in cui una certa differenza può insinuarsi è se i poli sono molto, molto vicini al cerchio dell'unità. Anche lì alcuni trucchi che possono aiutare. NON UTILIZZARE la rappresentazione e il filtro della funzione di trasferimento () ma utilizzare poli e zero con sosfilt (). Ecco un esempio per la differenza.

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 () si guasta con un cutoff di circa 15Hz @ 44.1kHz. Per sosfilt () il cutoff può essere ben al di sotto di 1/100 di Hz a 44,1 kHz senza problemi.

Se hai problemi di stabilità, anche la FFT non aiuta molto. Poiché il filtro è un filtro IIR, la risposta all'impulso è infinita e dovrebbe essere prima troncata. A queste frequenze molto basse la risposta all'impulso diventa così lunga che anche la FFT diventa poco pratica.

Ad esempio, se si desidera un taglio di 1/100 Hz a 44,1 kHz e si desidera un intervallo dinamico nella risposta all'impulso di 100 dB, sono necessari circa 25 milioni di campioni !!! Sono quasi 10 minuti a 44,1 kHz e molte, molte volte più lunghe del segnale originale


Questo in realtà non risponde alla domanda sui problemi numerici, ma non ero a conoscenza dei problemi con filter- grazie! Il mio cutoff passa alto è 0,5 Hz a 250 Hz. Qual è il motivo dei problemi filter? Sto scrivendo l'implementazione da solo.
Andreas,

2

Perché pensi che le cose saranno diverse? I concetti teorici dovrebbero tradursi in applicazioni pratiche, con l'unica differenza che è quella dei problemi in virgola mobile, a cui non possiamo sfuggire. Puoi facilmente verificare con un semplice esempio in 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

Come puoi vedere, gli errori sono dell'ordine della precisione della macchina. Non ci dovrebbero essere motivi per non usare il metodo FFT. Come menzionato da Endolith, è molto più comune utilizzare l'approccio FFT per filtrare / convolgere / correlare in modo incrociato, ecc. E molto più velocemente, tranne che per campioni molto piccoli (come in questo esempio). Non che l'elaborazione nel dominio del tempo non venga mai eseguita ... tutto si riduce all'applicazione, alle esigenze e ai vincoli.


1
Penso che la domanda originale fosse quella di approfondire le questioni in virgola mobile inerenti al filtro basato su FFT rispetto all'implementazione diretta del filtro nel dominio del tempo. Questa può essere una vera preoccupazione per l'elaborazione del segnale in virgola fissa, se ad esempio hai filtri molto lunghi o se hai una cattiva implementazione di FFT. Sicuramente non vedrai alcun effetto per sequenze di lunghezza 5 in virgola mobile a precisione doppia.
Jason R,

@JasonR Gli errori sono ancora di precisione della macchina se si estende la lunghezza delle sequenze a 1e6 nell'esempio sopra. Gli errori che menzioni spuntano principalmente a causa della cattiva progettazione del filtro o della cattiva implementazione di FFT. Se quelli vanno bene, non vedo perché la convoluzione nel dominio del tempo dovrebbe dare una risposta diversa da quella nel dominio della frequenza.
Lorem Ipsum,

1
Non dovrebbe dare una risposta diversa in base al dominio in cui si eseguono i calcoli. Il mio unico punto è che le effettive operazioni matematiche differiscono notevolmente tra i due approcci, quindi a seconda delle implementazioni di ciascuno che hai a disposizione, è possibile che tu potrebbe vedere differenze tangibili. Per una doppia precisione, supponendo che tu abbia buone implementazioni, non mi aspetto alcuna differenza se non in casi estremi.
Jason R,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.