Les filtres IIR (et en particulier le filtre Butterworth) sont-ils causaux?

Aug 19 2020

Je suis nouveau dans le traitement du signal. J'apprends maintenant le filtrage et j'essaie de mettre en œuvre un filtre passe-haut (HPF), puis un filtre passe-bande (BPF). J'implémente les filtres Python 3.8avec NumPyet SciPy.

Pour le cas hors ligne (filtrage d'un temps préenregistré), j'ai conçu un filtre passe-haut Butterworth et appliqué sur le signal dans le domaine temporel en utilisant la signal.filtfiltfonction. Cependant, comme le montre la documentation, cette approche n'est bonne que pour les cas hors ligne et non en temps réel, car le filtre balaye le signal vers l'avant puis vers l'arrière. Je peux récupérer la réponse en fréquence du filtre en utilisant la signal.freqzfonction.

Maintenant, je veux que ce filtre fonctionne également en temps réel (il doit donc être causal, et je demande si cela est possible pour ce type de filtres. Voici mes questions:

  1. Si je comprends bien, les filtres Butterworth sont des filtres IIR (infinite impulse response). Est-ce vrai?
  2. Les filtres IIR sont-ils causaux? Il se peut que tous les filtres IIR ne soient pas causaux et que certains le soient et certains ne le soient pas. Dans quels cas les filtres IIR sont-ils causaux?
  3. Les filtres Butterworth sont-ils causaux? Si ce n'est pas toujours le cas, dans quel cas sont-ils causaux?
  4. Si la réponse à 3 est vraie, comment implémenter un filtre de Butterworth causal, à la fois dans le domaine temporel et dans le domaine fréquentiel? (Je peux utiliser des SciPyfonctions telles que signal.butter, signal.freqzetc.)

Liens pertinents:

  • Aide à la conception du filtre Butterworth
  • filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html

Je vous remercie.

Réponses

7 endolith Aug 19 2020 at 13:49
  1. Oui, Butterworth est IIR. La décroissance d'une impulsion dure techniquement pour toujours.
  2. Oui, tous les IIR [réalisables] sont causaux.
  3. Oui, à cause des # 1 et # 2.
  4. N'utilisez pas signal.filtfilt. Utilisez signal.lfilter. filtfiltfait la même chose que lfilter, sauf deux fois, dans des directions opposées, qui transforme un filtre causal en un filtre à phase nulle.

Cependant, comme le suggère la documentation de ces deux fonctions, pour une utilisation la plus pratique, vous devez en fait utiliser les variantes SOS à la place:

La fonction sosfilt(et la conception de filtre utilisant output='sos') doit être préférée lfilterà la plupart des tâches de filtrage, car les sections de second ordre ont moins de problèmes numériques.

Pour résumer les fonctions:

  • lfilter: Filtrage causal en une seule étape (commandes faibles uniquement)
  • filtfilt: Filtrage en un seul étage de phase zéro (commandes faibles uniquement)
  • sosfilt: Filtrage des sections causales de second ordre
  • sosfiltfilt: Filtrage des sections du second ordre en phase zéro

Vraiment la seule raison d'utiliser lfilterou filtfiltest si vos coefficients sont déjà au b, aformat, si vous implémentez quelque chose hors d'un manuel, etc.

Si vous concevez le filtre vous-même, utilisez simplement le formulaire SOS, ce qui réduit les erreurs numériques.

Notez que les filtfiltfonctions appliquent le filtre deux fois, il aura donc le double de l'ordre du filtre d'origine.

1 TimWescott Aug 19 2020 at 16:17

Les filtres IIR sont-ils causaux? Il se peut que tous les filtres IIR ne soient pas causaux et que certains le soient et certains ne le soient pas. Dans quels cas les filtres IIR sont-ils causaux?

Tous les vrais filtres IIR sont causaux. Tous les systèmes réels sont causaux, à moins que l'univers ne soit beaucoup plus étrange qu'il n'y paraît.

Vous pouvez définir un filtre qui agit sur les informations futures; c'est à dire que tu pourrais dire ça$y_n = 0.9 y_{n+1} + x_n$. Cela décrirait (avec beaucoup de mots pour surmonter le scepticisme du lecteur) un filtre dont la réponse impulsionnelle est$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$

Cependant, vous ne pouvez pas mettre en œuvre un tel filtre dans la vraie vie.