I filtri IIR (e in particolare il filtro Butterworth) sono causali?

Aug 19 2020

Sono nuovo nell'elaborazione del segnale. Sto imparando ora a filtrare e sto cercando di implementare il filtro passa alto (HPF) e successivamente il filtro passa banda (BPF). Implemento i filtri in Python 3.8con NumPye SciPy.

Per il caso offline (filtrando un tempo preregistrato) ho progettato un filtro passa-alto Butterworth e applicato sul segnale nel dominio del tempo utilizzando la signal.filtfiltfunzione. Tuttavia, come mostra la documentazione, questo approccio è valido solo per i casi offline e non in tempo reale, poiché il filtro esegue la scansione del segnale in avanti e poi all'indietro. Posso recuperare la risposta in frequenza dal filtro usando la signal.freqzfunzione.

Ora voglio che questo filtro funzioni anche in tempo reale (quindi deve essere causale, e chiedo se questo è possibile per questo tipo di filtri. Ecco le mie domande:

  1. Se ho capito bene, i filtri Butterworth sono filtri IIR (infinite impulse response). È vero?
  2. Il filtro IIR è causale? È possibile che tutti i filtri IIR non siano causali e che alcuni lo siano e altri no. Quali sono i casi in cui i filtri IIR sono causali?
  3. I filtri Butterworth sono causali? Se non sempre, in questo caso sono causali?
  4. Se la risposta a 3 è vera, come implementare un filtro Butterworth causale, sia nel dominio del tempo che nel dominio della frequenza? (Posso usare SciPyfunzioni come signal.butter, signal.freqzecc.)

Link rilevanti:

  • Aiuta a progettare il filtro Butterworth
  • filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html

Grazie.

Risposte

7 endolith Aug 19 2020 at 13:49
  1. Sì, Butterworth è IIR. Il decadimento di un impulso tecnicamente dura per sempre.
  2. Sì, tutte le IIR [implementabili] sono causali.
  3. Sì, a causa di # 1 e # 2.
  4. Non usare signal.filtfilt. Usa signal.lfilter. filtfiltfa la stessa cosa lfilter, tranne due volte, in direzioni opposte, che trasforma un filtro causale in un filtro a fase zero.

Tuttavia, come suggerisce la documentazione per entrambe queste funzioni, per un utilizzo più pratico, dovresti effettivamente utilizzare invece le varianti SOS:

La funzione sosfilt(e l'utilizzo del design del filtro output='sos') dovrebbe essere preferita rispetto lfilteralla maggior parte delle attività di filtro, poiché le sezioni di secondo ordine hanno meno problemi numerici.

Per riassumere le funzioni:

  • lfilter: Filtraggio causale a stadio singolo (solo ordini bassi)
  • filtfilt: Filtraggio monostadio fase zero (solo ordini bassi)
  • sosfilt: Filtraggio causale di sezioni di secondo ordine
  • sosfiltfilt: Filtraggio sezioni di secondo ordine a fase zero

Davvero l'unico motivo per usare lfiltero filtfiltè se i tuoi coefficienti sono già in b, aformato, se stai implementando qualcosa da un libro di testo, ecc.

Se stai progettando il filtro da solo, usa semplicemente il modulo SOS, che riduce l'errore numerico.

Notare che le filtfiltfunzioni applicano il filtro due volte, quindi avrà il doppio dell'ordine del filtro originale.

1 TimWescott Aug 19 2020 at 16:17

Il filtro IIR è causale? È possibile che tutti i filtri IIR non siano causali e che alcuni lo siano e altri no. Quali sono i casi in cui i filtri IIR sono causali?

Tutti i filtri IIR reali sono causali. Tutti i sistemi reali sono causali, a meno che l'universo non sia molto più strano di quanto sembri.

È possibile definire un filtro che agisce sulle informazioni future; cioè potresti dirlo$y_n = 0.9 y_{n+1} + x_n$. Questo descriverebbe (con molte parole per superare lo scetticismo del lettore) un filtro la cui risposta all'impulso è$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$

Tuttavia, non è possibile implementare effettivamente un tale filtro nella vita reale.