Package: digital-filter-tools
module digital_filter_toolsOutils pédagogiques pour l'étude des filtres numériquesInstallation du module python digital_filter_toolsFrom Pypi repository :https://pypi.org/project/digital-filter-toolspip install digital-filter-toolsFonctionnalitésCe module propose des outils pédagogiques pour l'étude des filtres numériques :passage de l'équation de récurrence aux transformées en zpassage 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éroscourbe des réponses impulsionnelle, indicielle, rampe, sinuscourbe de la réponse à une séquence d'entrée personnaliséecalcul des zéros et des pôles de la fonction de transfert en zdiagramme 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ériquesEquation de récurrencex(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 nulExemple  :>>>fromdigital_filter_toolsimport*>>>f=FiltreNumerique(a=[2,-0.2],b=[1,0.5])Transmittance en zOn 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 >= mpôles et zéros réels ou complexes par paires conjuguéesExemple :>>>fromdigital_filter_toolsimport*>>>f=FiltreNumerique(k=2,zeros=[0.5],poles=[0,0.6-0.2j,0.6+0.2j])Un exemple complet : filtre à moyenne glissanteOn s'intéresse à un filtre à moyenne glissante sur 4 échantillons (sous forme récursive).>>>fromdigital_filter_toolsimport*>>>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())4Passage à 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 zPar 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.25H(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()Etudedelastabilité---------------------Lefiltreestrécursif.Latransmittanceenzpossède4pôles.Enmodule:|0|=0|0|=0|0|=0|1|=1Filtrestablecartouslespôlesontunmodule<=1Réponse impulsionnelle>>>f.tracer_reponse_impulsionnelle()Réponse indicielle>>>f.tracer_reponse_indicielle()Réponse en fréquencefs désigne la fréquence d'échantillonnage (en Hz).>>>f.fs=5000>>>f.tracer_reponse_en_frequence(magnitude_unit='linear')Fonction de transfert complexe H(jω) (transmittance complexe)>>>H=f.hw>>># help(H)>>>H.properties(600)# transmittance à 600 HzFrequency(Hz):600Angularfrequency(rad/s):3769.91Complexvalue:0.288584-0.613272jMagnitude:0.677778Magnitude(dB):-3.37825Phase(degrees):-64.8Phase(radians):-1.13097>>>H.db(600)# gain en dB à 600 Hz-3.37825>>>H.phase_deg(600)# déphasage en degrés à 600 Hz-64.8Diagramme des pôles et zéros>>>f.tracer_diagramme_poles_zeros()Un deuxième exemple : lowpass iir elliptic order 5>>>fromdigital_filter_toolsimport*>>>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()Etudedelastabilité---------------------Lefiltreestrécursif.Latransmittanceenzpossède5pôles.Enmodule:|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.931006Filtrestablecartouslespôlesontunmodule<=1Réponse impulsionnelle>>>f.tracer_reponse_impulsionnelle(nfin=50)Réponse indicielle>>>f.tracer_reponse_indicielle(nfin=50)Réponse en fréquence>>>f.tracer_reponse_en_frequence(magnitude_unit='dB')Diagramme des pôles et zéros>>>f.tracer_diagramme_poles_zeros()Aide complète>>>importdigital_filter_tools>>>help(digital_filter_tools)Documentation complètehttps://framagit.org/fsincere/digital-filter-toolsEn particulier, des exemples d'utilisationici.TO DOdocumentation : english translation...ComplémentL'utilitaire Python pyFDAhttps://github.com/chipmuenk/pyFDA