Tsn_3 DUT 1 CNAM GEII TP3 Traitement Numérique du Signal Sur DSP (processeurs de signaux) : Filtres IIR (Réponse impulsionnelle Infinie, récursif) Exemple : Filtre Moyenneur IIR I Rappels sur filtres IIR I1 Description Décrits par l’équation de récurrence : N 1 M 1 k 0 k 1 yn xn k .bk yn k .ak an, bn xn yn Nommés filtre Récursifs Attention, peuvent être instables (du fait de la rétroaction) ! Fonction de transfert en fonction de la fréquence, en écriture rapide en Z, avec : z e 2ix et x N 1 G( z) Yn Xn f fech z k .bk k 0 M 1 1 z k .ak k 1 N 1 Gain pour f = 0 : on fait x = 0 ou z = 1, il vient : G ( f 0) b k 0 M 1 k 1 .ak k 1 I2 Avantage et inconvénient des IIR Avantage : filtres raides possibles avec peu de coefficient, du fait de la rétroaction, la durée de la réponse impulsionnelle peut être longue mais avec très peu de coefficients. Inconvénient : Par construction, un filtre IIR ne peut pas être à phase linéaire (la réponse impulsionnelle est forcement dissymétrique). ed 2009 Tsn_3 DUT 2 CNAM GEII II filtre de base du premier ordre, passe bas II 1 Relation temporelle et Fonction de transfert G( z) yn = (1+a)xn - a yn-1 |a |< 1 et Yn 1 a Xn 1 a.z 1 cas utile a < 0 Avec z e 2ix x f nTe fech On trouverait alors aisément : G ( x) Gain pour f = 0 : 1 a 1 2a. cos(2x) a 2 G ( f 0) 1 On fait x = 0 ou z = 1, il vient : Approximation pour x (ou f petit) : On fait cos( 2x) 1 1 4x 2 , il vient facilement : G ( x) 2 1 C’est le module d’une fonction de transfert du premier ordre De fréquence de coupure à 3dB xc 1 a ou x2 (1 a) 2 (4a 2 ) 1 1 j fc fech x xc 1 a 2 a 2 a Attention à notation sans dimension x = f/fech, en fait la fréquence réelle de coupure en Hz reste proportionnelle à fech. Exemple pour différentes valeurs de a, et pour deux cas le filtre analogique du premier ordre équivalent au début. a = -0,1 a = -0,5 1 1 0.9 0.9 0.8 0.8 0.7 0.7 0.6 0.6 0.5 0.5 0.4 0.4 Premier ordre analogique 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ed 2009 Tsn_3 DUT 3 CNAM GEII a = -0,900 a = -0,990 1 1 0.9 0.9 0.8 0.8 0.7 0.7 0.6 0.6 0.5 0.5 0.4 0.4 Premier ordre analogique 0.3 0.3 0.2 0.2 0.1 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Cas particulier En réglant a de plus en plus proche de -1 (|a| restant inférieur à 1), on peut donc très facilement affaiblir très fortement même des fréquences très basses, pour ne laisser que la composante continue ! D’ou le nom de moyenneur en réglant a très voisin de -1. II 2 Régime transitoire, stabilité II 2 a Réponse impulsionnelle h Si on envoi une seule impulsion x0=1, on calcule aisément d’après la relation de récurrence hn (1 a) xn ahn1 et en partant de hn-1 = 0 : h0 = 1+a h1 = (1+a)(-a) h2 = (1+a)(-a)2 … et donc : hn (1 a )( a) n x1,x2… = 0 Entrée x0=1, Réponse pour a = -0,5 1 0.5 0.9 0.45 0.8 0.4 0.7 0.35 0.3 0.6 0.25 0.5 0.2 0.4 0.15 0.3 0.1 0.2 0.05 0.1 0 0 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 8 9 10 11 12 13 14 a = -0.9 a = -0,99 0.012 0.1 0.09 0.01 0.08 0.07 0.008 0.06 0.006 0.05 0.04 0.004 0.03 0.02 0.002 0.01 0 0 0 50 100 150 200 250 300 350 400 0 50 100 150 200 250 300 350 400 ed 2009 Tsn_3 DUT 4 CNAM GEII Durée du régime transitoire : La durée de la réponse impulsionnelle est celle du régime transitoire, donc théoriquement infini ! Si on raisonne comme en analogique, on peut dire que le régime transitoire est fini quand on arrive à 95% de la valeur finale, donc pour : hn (1 a)( a) n 1,3 0,05 (a) n donc n.log(-a )= log(0,05) et n y0 (1 a) log( a) 1,3 Durée transitoi re(de 0 à 95%) fech. log( a) Il est évident que plus le filtre coupe en basse fréquence (a proche de -1) plus la réponse impulsionnelle est longue et plus le régime transitoire est long (comme pour un filtre FIR). Stabilité : D’après la formule hn (1 a )( a) n on voit bien que si |a| > 1, la réponse impulsionelle hn tend vers l’infini et donc instabilité ! Condition de stabilité : II 2 b |a |< 1 et donc pour le cas utile -1 < a < 0 Réponse à un échelon (réponse indicielle) Une étude mathématique est faisable, on peut par contre en utilisant très simplement un tableur tel qu’Excel tracer les réponses impulsionnelles (en faisant x0 = 1 seulement) et indicielle (tous les xn à 1) pour une valeur de a et les comparer : Réponse impulsionnelle pour a = -0,5 Répponse indicielle pour a = -0,5 1,2 1,2 1 1 0,8 0,8 xn 0,6 hn xn échelon 0,6 0,4 0,4 0,2 0,2 yn, réponse indicielle 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 5 7 9 11 13 15 On voit que, comme pour tout filtre, la durée de la réponse impulsionnelle est égale au temps de montée de la réponse à un échelon. Les allures (oscillantes ou non) sont également ressemblantes) ed 2009 Tsn_3 DUT 5 CNAM GEII III Filtre de base du second ordre III 1 Relation de récurrence et fonction de transfert yn (1 a1 a2 ) xn a1 yn 1 a2 yn 2 G( z) et Yn 1 a1 a2 Xn 1 a1 z 1 a2 z 2 Avec a1 < 0 et a2 > 0 cas usuels 2x avec z e Il vient aisément: G ( x) 1 a1 a 2 1 a12 a 22 2a1 (1 a 2 ). cos 2x 2a 2 . cos 4x Gain pour f = 0 On fait z = 1, il vient directement : G ( f 0) 1 Etude des extremums On obtient les extremums en dérivant par rapport à x, donc pour : 2a1 (1 a2 ).2 . cos 2x 2a2 .4 . cos 4x = 0 Or on connaît une formule magique : cos(2k) = 2sin(k)cos(k) Donc pour : sin( 2x).a1 (1 a2 ) 4a2 cos 2x 0 Donc soit: sin( 2x) 0 ou x k / 2 , donc x = 0,5 (max utile avant repliement de spectre) a1 (1 a2 ) cos 2x ou a1 (1 a2 ) 4a2 cos 2x 0 donc 4a 2 Donc deux régimes possibles selon que cette équation peut se résoudre ou non : III 1 a Régime sans maximum, donc sans résonance si a1= -1,2 La courbe est « maximalement plate » à la 4a 2 limite : a1 1 a2 (A rapprocher d’un Filtre de Butterworth en analogique). a1 (1 a 2 ) 1 4a 2 a2 =0,4286 max plat 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ed 2009 Tsn_3 DUT III 1 b 6 CNAM GEII a1 (1 a 2 ) 1 4a 2 Régime avec résonance si Alors la fréquence de résonance x0 réduite ou f0 s’écrit : x0 f a (1 a 2 ) 1 . Arc cos 1 0 2 4a 2 fech On trouverait facilement alors le module du gain G0 à la résonance. On voit que ce gain peut tendre vers l’infini pour la valeur toute simple a2 1, et cela veut dire que l’on s’approche alors de l’instabilité ! 4a 2 1 G0 (1 a1 a2 ) . 1 a 2 4a2 a12 Exemple : a1 = –1,2 et a2 = 0.95 a1 = -1,2 et a2 = 0.6 1.8 20 1.6 18 1.4 16 1.2 14 1 12 0.8 10 0.6 8 0.4 6 4 0.2 2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 Gain à la résonnance: 1.6 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Gain à la résonnance: environ 19 On peut obtenir très aisément de très fortes surtensions (gain à la résonnance) avec a2 proche de 1 (des valeurs de 100 ou même 400 sont possibles). Si a2 > 1 on atteint l’instabilité en mode oscillant la surtension devient infinie. III 2 Réponse impulsionnelle, réponse indicielle et Stabilité Comme en analogique, on peut avoir un régime apériodique, critique et pseudo périodique. On atteint l’instabilité si la réponse impulsionnelle tend vers l’infini, en oscillant ou non. Remarque : nous n’avons étudié plus haut que la limite de stabilité en mode oscillant. L’étude complète selon a1 et a2 n’est pas étudiée ici (on trouverait en fait un triangle dans un plan a2, a1). Nous ne donnons donc ici que des exemples. Quelques figures dans différents cas : ed 2009 Tsn_3 DUT 7 CNAM GEII Différents cas stables a1 = -1,2 a2 = 0,38 Non oscillant a1 = -1,2 a2 = 0,4286 Maximalement plat en fréquence, mais déjà un peu oscillant en transitoire (Normal, comme en analogique, à rapprocher d’un filtre de Butterworth) 1,2 1 0,8 1,2 xn echelon yn 0,6 1 0,4 0,8 0,2 0,6 0 0,4 1 3 5 7 9 11 13 15 17 19 21 xn echelon yn 0,2 0 1 3 a1 = -1,2 a2 = 0,6 oscillant 1,6 1,4 1,2 1 0,8 0,6 0,4 0,2 0 5 7 9 11 13 15 17 19 21 a1 = -1,2 a2 = 0,95 très oscillant 2,5 2 1,5 yn yn 1 0,5 0 1 4 7 10 13 16 19 22 25 28 31 34 37 40 1 4 7 10 13 16 19 22 25 28 31 34 37 40 Différents cas instables Instabilité mode non oscillant Instabilité mode oscillant a1= -1,47 a2 = 0,44 0 -1 1 3 5 7 9 111315171921232527293133353739 -2 -3 -4 -5 -6 -7 a1= -1,2 a2 = 1,3 50 40 30 20 10 0 -10 1 -20 -30 -40 4 7 10 13 16 19 22 25 28 31 34 37 40 Relation classique en mode oscillant: Surtension (en fonction de la fréquence) et Stabilité : Comme pour tout filtre, si le coefficient de surtension augmente (ici a2 proche de 1), le régime transitoire est de plus en plus oscillant et long. A la limite, on peut très aisément en numérique faire a2 = 1. On obtient alors un simple et très utile générateur sinusoïdal ! (méthode différente de la technique de synthèse directe de fréquence qui fait appel à une table de sinus, et un accumulateur de phase). ed 2009 Tsn_3 IV DUT 8 CNAM GEII Expérimentation sur DSP TMS320C67 Pour toute cette partie, et les suivantes, la fréquence d’échantillonnage sera fixée à : Fech 48 KHz donc limite Shannon Fech/2 24 kHz Tous les calculs en virgule flottante. IV 1 IV 1 a Passe bas du premier ordre : yn = (1+a)xn – ayn-1 -1 < a < 0 Travail préalable théorique 1) Retrouver la formule donnant le module du gain : G ( x) 1 a 1 2a. cos(2x) a 2 2) Pour a = -0,5 calculer : Le gain continu ou très basse fréquence G(0) La fréquence de coupure à 3dB (en assimilant cette fonction de transfert à un premier ordre analogique, voir le rappel de cours correspondant. G(0,5) Tracer alors l’allure de G(f), avec donc des fréquences en abscisse ! IV 1 b Vérification pratique Au moyen du « Code composeur Studio » de Texas, et dans le répertoire dsp_c67 ini GEII que vous indiquera l’enseignant, Ouvrir le projet : dsk_c67.pjt Aller dans sources, il vous faudra les fichiers C principaux (et seulement ceux ci) : dsk_c67.c le noyau de l’application, ne rien modifier ! aic23.c fonctions de l’interface analogique, ne rien modifier demo.c Le fichier C de travail (si ce fichier n’est pas présent dans le projet, ou si il y en a un autre, l’ajouter et ne garder comme fichiers.C dans le projet que ces trois fichiers. Ne rien modifier d’autre évidemment ! On reprend donc le demo.c du premier TP, on le modifiera. 1) Modification de la fonction traitement_echantillons On reconnaît le TP N°1, la sortie étant égale à l’entrée multipliée par 1.5 void traitement_echantillons(int *I, int *O) // [0] voie G [1] voie D (rouge) { O[1] = 1.5 *(float) I[1]; // voie droite, indice 1 } void periodic_log(void) {} // POUR AFFICHER DES VALEURS Tout en s’interdisant d’utiliser une variable globale (on sait qu’un bon programmeur non bidouilleur les réduit au strict minimum nécessaire !), il faut tout de même conserver l’ancienne valeur de yn pour calculer la nouvelle. Vous devez connaitre l’astuce ! Déclarer yn de cette façon, et utilisez une variable locale xn. Sachant que si on écrit en C : yn = fonction(yn,…), le yn de droite est en réalité l’ancienne valeur soit yn-1, écrire alors le programme tout simple de filtrage (2 ou 3 lignes, il n’est donc pas utile d’avoir une variable pour yn-1). 2) Vérifier alors pratiquement le module (de F faible, jusqu’à Fech/2) de la fonction de transfert du filtre obtenu, avec toujours la bonne mesure de quelques points ed 2009 Tsn_3 DUT 9 CNAM GEII caractéristiques et quelques points supplémentaires On comparera très pertinemment théorie et pratique, si vous constater des différences, les expliquer correctement ! (voir le TP précédent). IV 1 c Application : Mesure de valeur efficace Comme notre maquette DSK C67 comporte hélas une liaison capacitive en entrée, on ne peut évidemment pas mesurer une valeur moyenne qui serait toujours nulle ! On mesurera donc une valeur efficace. Veff 1 N N 1 x 2 n 0 1) Théorie On veut réaliser un voltmètre numérique EFFICACE de cahier des charges identique au TP précédent, à savoir : Echantillonnage à Fech = 48 KHz (comme précédemment). Calcul de la valeur efficace, ondulations résiduelles 1% pour F 50 Hz On filtrera non pas xn mais xn*xn. Il faut trouver a, mais il faut toujours réfléchir pour éviter de s’embarquer bêtement dans un calcul à priori simple, mais en fait long et délicat à cause de valeurs numériques particulières, et absolument inutile ! On est dans le cas ou x est petit, l’approximation faite dans le rappel du cours (développement limité du cos) est tout a fait justifiée ! (sinon on ne sait pas résoudre analytiquement …. ) D’autre part, comme a est très proche de –1, la résolution exacte de l’équation du second ordre que l’on devrait trouver serait très délicate (nécessitant des valeurs numériques intermédiaires très précises), donc autant l’éviter ! Courbe du module du gain On effectuera la démarche suivante : 0.05 Comme x est petit, on choisit l’approximation de la fonction classique du premier ordre analogique : G ( x) 100Hz 1 1 x2 xc2 Pourquoi faut-il considérer le point à 100Hz et non pas 50Hz ? En déduire alors la valeur numérique approchée de xc. D’après la formule de xc en fonction de a du rappel de cours, en déduire alors la valeur de a (très proche de –1, donc surtout ne pas résoudre d’équation du second degré, a est alors proche de quelque chose … ! ). Bien prendre pour a 6 à 7 chiffres significatifs ! IV 1 d a=? 0.01 0 0 x Vérification pratique 1) Modifier la fonction traitement_échantillons pour obtenir en yn la valeur efficace (pour l’instant non convertie en volts). 2) On veut afficher cette valeur après conversion en Volt. On dispose pour cela de la fonction d’interruption void periodic_log(void), qui est cadencée toutes les quelques secondes. ed 2009 Tsn_3 DUT 10 CNAM GEII On se servira de la fonction LOG_printf qui travaille avec les mêmes paramètres que la fonction printf classique du C, et qui permet d’afficher des résultats dans la fenêtre « Log message ». La syntaxe sera : LOG_printf(&trace, "Veff = %f v", ?????????? ); // Affichage de Veff en Compléter cette ligne sachant que l’excursion de tension du CAN ou du CNA est de 1,3v crête à presque +1,3v crête pour un échantillon de 16 bits, donc de -32768 à 32767. Pourquoi Veff (en float) doit-elle être obligatoirement une variable globale ? 3) Essai pour une valeur de a de –0,5 Pour ouvrir la fenêtre de messages, faire : DSP/BIOS | Message Log Puis faire click droit et Property page et cocher ‘Automatically scroll end of buffer’. Pour F = 500 Hz et 1Vcrète (1Vpp pour des générateurs qui supposent une charge de 50), observer rapidement le signal à l’oscilloscope. Expliquez ce que l’on observe. Expliquer alors les valeurs numériques qui s’affichent sur la fenêtre de Log Message. 4) Remplacer alors a par la valeur calculée précédemment. Qu’observe-t-on à l’oscilloscope ? Qu’observe-t-on sur la fenêtre de messages. Etes vous satisfait quand à la bonne mesure de Veff et à la stabilité de cette mesure ? Mettre maintenant F à 50Hz. Vérifier la stabilité de l’affichage. Etes vous satisfait par rapport au cahier des charges quant à la stabilité de la mesure (ici, ne pas répondre seulement oui, une petite mesure visuelle peut se faire !) Toujours pour 50Hz, on peut constater cependant que la valeur efficace indiquée est plus faible que la réalité. A votre avis d’où cela peut-il provenir ? Votre programme en est-il la cause ? (on rappelle que l’affichage est correct pour des fréquences de 200, 500 HZ …). ed 2009 Tsn_3 IV 2 DUT CNAM GEII Passe bas du second ordre : yn = (1+a1+a2)xn – a1yn-1 - a2yn-2 11 0<a2 <1 a1 < 0 IV 2 a Filtre obtenu avec : a1 = -1,2 et a2 = 0,6 et fech = 48000 Hz 1) Etude théorique Montrer que le régime est « avec résonance ». Donner G(0) (fréquence) Calculer la fréquence de résonance x0 (réduite) puis f0 (en Hz) Calculer le module du gain G(f0) = G0 à la résonance, ainsi que le facteur de résonance ou de surtension : G( f f 0 ) Coeff de Surtension G ( f 0) 2) Mise en œuvre sur la maquette DSP On introduira en flottant les coefficients : a1 = -1.2 et a2 = 0.6 Modifier votre programme en utilisant quatre variables flottantes xn, yn, yn_1, et yn_2. On doit ici conserver à chaque appel de la fonction yn_1 et yn_2 (même astuce que précédemment, SANS UTILISER DE VARIABLES GLOBALES INUTILEMENT ! ). Calculez : yn = (1+a1+a2).xn –a1.yn_1 – a2.yn_2 Sortir vers O[1] cet yn Réactualiser yn_2, puis yn_1 Vérifier le fonctionnement, avec une sinusoïde à l’entrée de 1 volt crête. En comparant pour chaque cas avec la théorie (commentaires pertinents), mesurez rapidement: - Gain en BF. - Fréquence de résonance. - Gain à la résonance. (Ce gain étant > 1, si on déborde, limiter le signal sinusoïdal d’entrée !). IV 2 b Filtre à forte résonance Faire : a2 = 0,95 Pour la même tension d’entrée de 1 volt crête, que constate-t-on sur la sortie autour de la résonance f0 cela vous étonne-t-il ? (remarque : ce f0 est un peu différente du cas précédent, mais on ne demande pas de la recalculer).? Diminuer alors la tension d’entrée pour visualiser la forte résonance autour de la f0, mesurer alors cette fréquence f0. Mesurer rapidement le nouveau gain à la résonnance (facteur de surtension). Est-ce correct par rapport à la courbe fournie dans le rappel de cours ? Que se passe-t-il si a2 se rapproche de 1, intérêt ? IV 2 c Et si on faisait a2 = 1 ! On est à la limite de la stabilité avec un régime oscillant. Donc sans autre calcul on peut dire que (un peu comme an analogique) la réponse impulsionnelle est une sinusoïde d’amplitude stable, de fréquence f0. En analogique, on ne peut rester juste à la limite d’oscillation (en dessous, l’amplitude diminue, au delà elle augmente indéfiniment). Ici en numérique, on peut évidemment coder ed 2009 Tsn_3 DUT CNAM GEII 12 a2 = 1 sans erreur ! Si a2 diffère de 1 même de très peu, l’amplitude de la sinusoïde diminuera (système limite stable) ou au contraire augmentera (limite instable) On crée donc un générateur sinusoïdal, c’est totalement mâgique …. ! (Remarque : une autre technique numérique existe pour effectue une synthèse sinusoïdale, par accumulation de phase et accès à une table, totalement différente et non étudiée ici !) Faire donc a2 = 1 On veut que le programme génère sa réponse impulsionnelle : il faut initialiser xn à une valeur avant la boucle, pour aussitôt le mettre à zéro dans celle ci. Modifier le programme de la façon suivante : Jusqu’à présent xn était égal à I[1] afin de récupérer chaque échantillon entrant. Initialiser maintenant xn à par exemple 16384 (donc la moitié de la valeur max possible). Ecrire xn = 0 juste après la ligne calculant yn, ainsi pour les échantillons suivant xn vaudra 0. Vérifier le fonctionnement Calculer théoriquement la nouvelle valeur de f0 de résonance (avec a2 = 1). Mesurer la fréquence générée, est ce correct ? Fixer a2 à 0.99999 puis a2 à 1.00001 et observer et commenter pour chacun des cas le signal généré. En particulier quelle est la durée du transitoire quand a2 = 1 ? ed 2009