IV Expérimentation sur DSP TMS320C67

publicité
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 2ix
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 2ix x 
f
 nTe
fech
On trouverait alors aisément :
G ( x) 
 Gain pour f = 0 :
1 a
1  2a. cos(2x)  a 2
G ( f  0)  1
On fait x = 0 ou z = 1, il vient :
 Approximation pour x (ou f petit) :
On fait cos( 2x)  1 
1
4x 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  ahn1 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
2x
avec z  e
Il vient aisément:
G ( x) 
1  a1  a 2
1  a12  a 22  2a1 (1  a 2 ). cos 2x  2a 2 . cos 4x
 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 2x  2a2 .4 . cos 4x = 0
Or on connaît une formule magique : cos(2k) = 2sin(k)cos(k)
Donc pour :
sin( 2x).a1 (1  a2 )  4a2 cos 2x  0
Donc soit:
sin( 2x)  0 ou x  k / 2 , donc x = 0,5
(max utile avant repliement de spectre)
 a1 (1  a2 )
cos 2x 
ou a1 (1  a2 )  4a2 cos 2x  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(2x)  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
Téléchargement