Skip to main content

An educational module about digital filters

Project description

module digital_filter_tools

Outils pédagogiques pour l'étude des filtres numériques

Installation du module python digital_filter_tools

From Pypi repository :
https://pypi.org/project/digital-filter-tools

pip install digital-filter-tools

Fonctionnalités

Ce module propose des outils pédagogiques pour l'étude des filtres numériques :

  • passage de l'équation de récurrence aux transformées en z
  • passage de l'équation de récurrence à la fonction de transfert en z
  • écriture de la fonction de transfert en z en fonction des pôles et zéros
  • courbe des réponses impulsionnelle, indicielle, rampe, sinus
  • courbe de la réponse à une séquence d'entrée personnalisée
  • calcul des zéros et des pôles de la fonction de transfert en z
  • diagramme des pôles et zéros
  • étude de la stabilité
  • courbe de la réponse en fréquence (gain et phase)

Rappels sur les filtres numériques

Equation de récurrence

x(n) désigne l'entrée et y(n) la sortie.

L'équation de récurrence (algorithme) d'un filtre numérique a la forme générale suivante :

a0*y(n) +a1*y(n-1) +a2*y(n-2) + ... = b0*x(n) + b1*x(n-1) + b2*x(n-2) + ...

ou :

a0*y(n) = b0*x(n) + b1*x(n-1) + b2*x(n-2) + ...
          -a1*y(n-1) -a2*y(n-2) -a3*y(n-3) + ...

Par la suite, les paramètres a et b représentent les listes des coefficients (réels) de l'équation de récurrence :
a = [a0, a1, a2, ...] # avec a0 non nul
b = [b0, b1, b2, ...] # avec au moins un coefficient non nul

Exemple :

>>> from digital_filter_tools import *
>>> f = FiltreNumerique(a=[2, -0.2], b=[1, 0.5])

Transmittance en z

On peut aussi définir un filtre numérique par ses pôles et ses zéros.
La transmittance en z s'écrit alors :

          (z-z1).(z-z2)...(z-zm)
H(z) = k. _____________________________
          (z-p1).(z-p2).(z-p3)...(z-pn)

k est un nombre non nul (constante d'amplification)

zeros est la liste des m zéros de la transmittance :
zeros = [z1, z2, ..., zm]
poles est la liste des n pôles de la transmittance :
poles = [p1, p2, ..., pn]
avec les conditions suivantes :

  • n >= m
  • pôles et zéros réels ou complexes par paires conjuguées

Exemple :

>>> from digital_filter_tools import *
>>> f = FiltreNumerique(k=2, zeros=[0.5], poles=[0, 0.6-0.2j, 0.6+0.2j])

Un exemple complet : filtre à moyenne glissante

On s'intéresse à filtre à moyenne glissante sur 4 échantillons (sous forme récursive).

>>> from digital_filter_tools import *
>>> f = FiltreNumerique(a=[1, -1], b=[0.25, 0, 0, 0, -0.25])

Equation de récurrence

>>> f.afficher_equation_recurrence()
y(n) = 0.25*x(n) -0.25*x(n-4) 
       +y(n-1)

Ordre du filtre

>>> print(f.ordre())
4

Passage à la transformée en z

>>> f.afficher_transformee_en_z()
Y(z) = 0.25*X(z) -0.25*X(z)z⁻⁴ 
       +Y(z)z⁻¹

Transmittance (fonction de transfert) en z

Par définition : H(z) = Y(z)/X(z)

>>> f.afficher_transmittance_z()
        0.25 -0.25z⁻⁴
H(z) =  -------------
        1 -z⁻¹

Autre écriture avec puissances de z positives :

>>> f.afficher_transmittance_z_puissance_positive()
        0.25z -0.25
H(z) =  ------------
        z -z³

Pôles et zéros

>>> print(f.zeros)
[-1.0, (-0-1j), 1j, 1.0]
>>> print(f.poles)
[0.0, 0.0, 0.0, 1.0]

Pôles et zéros communs

>>> print(f.poles_zeros_commun())
[1.0]

Transmittance en z avec pôles et zéros

>>> f.afficher_transmittance_z_poles_zeros()
        0.25(z+1)(z+1j)(z-1j)(z-1)
H(z) =  --------------------------
        z.z.z(z-1)

Etude de la stabilité

>>> f.afficher_bilan_stabilite()

Etude de la stabilité
---------------------
Le filtre est récursif.
La transmittance en z possède 4 pôles.
En module :
|0| = 0
|0| = 0
|0| = 0
|1| = 1
Filtre stable car tous les pôles ont un module <= 1

Réponse impulsionnelle

>>> f.tracer_reponse_impulsionnelle()    

screenshot01

Réponse indicielle

>>> f.tracer_reponse_indicielle()   

screenshot02

Réponse en fréquence

>>> f.fs = 5000
>>> f.tracer_reponse_en_frequence(magnitude_unit='linear')

screenshot03

Fonction de transfert complexe H(jω) (transmittance complexe)

Diagramme des pôles et zéros

>>> f.tracer_diagramme_poles_zeros() 

screenshot04

Un deuxième exemple : lowpass iir elliptic order 5

>>> from digital_filter_tools import *
>>> k = 0.004691927277691961
>>> zeros = (-0.024456055354309697+0.9997009059496281j),
(-0.024456055354309697-0.9997009059496281j),
-1.0,
(0.39282986017485766+0.9196111683505163j),
(0.39282986017485766-0.9196111683505163j)
>>> poles = 0.7098495779640238,
(0.710102705797963+0.3470090677215467j),
(0.710102705797963-0.3470090677215467j),
(0.736600454346126+0.569377854177767j),
(0.736600454346126-0.569377854177767j)
>>> f = FiltreNumerique(fs=10000, k=k, zeros=zeros, poles=poles)

Equation de récurrence

>>> f.afficher_equation_recurrence()                                       
y(n) = 0.00469193*x(n) +0.00123516*x(n-1) +0.00574679*x(n-2) +0.00574679*x(n-3)
       +0.00123516*x(n-4) +0.00469193*x(n-5) 
       +3.60326*y(n-1) -5.63756*y(n-2) +4.69512*y(n-3) -2.0685*y(n-4) +0.38434*y(n-5)
>>> print(f.b)
[0.004691927277691961, 0.001235161071242554, 0.005746785676190226,
 0.0057467856761902235, 0.0012351610712425533, 0.004691927277691962]
>>> print(f.a)
[1.0, -3.603255898252202, 5.637563674261337, -4.695118791175536,
 2.0684985810278094, -0.38433981781115933]

Etude de la stabilité

>>> f.afficher_bilan_stabilite()  
                                                                                                             
Etude de la stabilité
---------------------
Le filtre est récursif.
La transmittance en z possède 5 pôles.
En module :
|0.70985| = 0.70985
|0.710103+0.347009j| = 0.790355
|0.710103-0.347009j| = 0.790355
|0.7366+0.569378j| = 0.931006
|0.7366-0.569378j| = 0.931006
Filtre stable car tous les pôles ont un module <= 1

Réponse impulsionnelle

>>> f.tracer_reponse_impulsionnelle(nfin=50)    

screenshot11

Réponse indicielle

>>> f.tracer_reponse_indicielle(nfin=50)   

screenshot12

Réponse en fréquence

>>> f.tracer_reponse_en_frequence(magnitude_unit='dB')

screenshot13

Diagramme des pôles et zéros

>>> f.tracer_diagramme_poles_zeros() 

screenshot14

Aide complète

>>> import digital_filter_tools
>>> help(digital_filter_tools)

Documentation complète

https://framagit.org/fsincere/digital-filter-tools

En particulier, des exemples d'utilisation ici.

TO DO

documentation : english translation...

Complément

L'utilitaire Python pyFDA

https://github.com/chipmuenk/pyFDA

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

digital-filter-tools-0.3.9.tar.gz (26.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

digital_filter_tools-0.3.9-py3-none-any.whl (26.6 kB view details)

Uploaded Python 3

File details

Details for the file digital-filter-tools-0.3.9.tar.gz.

File metadata

  • Download URL: digital-filter-tools-0.3.9.tar.gz
  • Upload date:
  • Size: 26.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/29.0 requests/2.22.0 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.60.0 importlib-metadata/4.0.1 keyring/18.0.1 rfc3986/1.5.0 colorama/0.4.3 CPython/3.8.10

File hashes

Hashes for digital-filter-tools-0.3.9.tar.gz
Algorithm Hash digest
SHA256 c6da2c675d148ce15ba1761905c6b741b8058d76eedc63198206a2b12e502e09
MD5 7b68150c164e99165adc69d90e995e7e
BLAKE2b-256 0543627860a232261428a87dd1f0ad3984974b19299d4d89be9601e075689e23

See more details on using hashes here.

File details

Details for the file digital_filter_tools-0.3.9-py3-none-any.whl.

File metadata

  • Download URL: digital_filter_tools-0.3.9-py3-none-any.whl
  • Upload date:
  • Size: 26.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/29.0 requests/2.22.0 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.60.0 importlib-metadata/4.0.1 keyring/18.0.1 rfc3986/1.5.0 colorama/0.4.3 CPython/3.8.10

File hashes

Hashes for digital_filter_tools-0.3.9-py3-none-any.whl
Algorithm Hash digest
SHA256 2f336db7681d5a200b1e876e87532ac8fec4c6d0fd792a161fbdbc592714d6f1
MD5 7984d3b7f767b113d2fd81c78d9b7a24
BLAKE2b-256 f4635953d7e5221b8ed2c78ed9c1da01febfdb859b28dee9348dddc3eb1c46d3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page