TRAITEMENT DU SIGNAL FILTRAGE
Edition 1 - 07/11/2017
Sommaire
A. Objectif global! _____________________________________________________________ 4
A.1.Mise en situation 4
A.2.Démarches de résolution 4
B. Notions préalables! _________________________________________________________ 5
B.1.Matrices 5
B.1.1. Opérations sur matrice
B.1.2. Résolution de système linéaire
B.2.Graphiques 2D 6
B.2.1. Lecture du fichier de mesure
B.2.2. Affichage de la courbe expérimentale
B.3.Ecriture du script 7
C. Filtrage du signal! __________________________________________________________ 8
C.1.Problématique 8
C.2.Présentation du filtre 8
C.2.1. Comportement du filtre
C.2.2. Influence de la constante de temps C.2.3. Implantation informatique du filtre
C.3.Calcul du signal filtré et de la valeur finale 10
C.3.1. Ecriture de la fonction calculant les valeurs du signal filtré C.3.2. Ecriture de la fonction calculant la valeur finale
C.4.Tracé des 2 figures 13
C.4.1. Tracé d’une figure avec plusieurs graphiques C.4.2. Tracé de la courbe du signal filtré
C.5.Validation de l’hypothèse de l’ordre du système 15
C.5.1. Principe de validation
C.5.2. Extraction des valeurs logarithmiques du signal C.5.3. Coefficients de la droite de régression linéaire
C.5.4. Tracé du logarithme du signal et de la droite de régression
C.6.Conclusion 18
D. Annexes! _________________________________________________________________ 19
D.1.Matrices 19
Sommaire Edition 1 - 07/11/2017
D.2.Graphiques 2D 20 D.2.1. Commande plot2d
D.2.2. Options complémentaire
Sommaire Edition 1 - 07/11/2017
A. Objectif global
A.1. Mise en situation
L’ambition de ce TD, sur 2 séances, est d’identifier les paramètres d’un système asservi du 1er ordre par analyse de sa réponse indicielle.
Vous avez à votre disposition le fichier de mesures expérimentales :
L’allure de cette réponse indicielle semble indiquer que le système est du 1er ordre (forme exponentielle, tangente à l’origine non horizontale, pas de dépassement). Nous chercherons donc à identifier :
•son gain
•sa constante de temps
Le signal mesuré est toutefois fortement «bruité», et il nous faudra au préalable filtrer ce signal afin de le rendre plus propre et exploitable
Les mesures sont enregistrées dans le fichier «signal.csv» à l’adresse : http://tsi.ljf.free.fr//ATS/docs/Info/TP/TP7/signal.csv
A.2. Démarches de résolution
Nous aurons besoin au préalable d’aborder quelques notions sur :
• la calcul matriciel
• la création de fonctions
• le filtrage numérique
• l’affichage de courbes
Puis nous utiliserons ces notions afin de créer des fonctions qui auront pour but : 1. de filtrer le signal
2. de trouver l’asymptote du signal
3. de déterminer la tangente à l'origine par régression linéaire
Notions préalables Edition 1 - 07/11/2017
B. Notions préalables
Créez un répertoire TP7 dans vos documents, et enregistrez-y le fichier «signal.csv»
Ouvrez Scilab, et placez-vous dans le répertoire TP créé
B.1. Matrices
B.1.1. Opérations sur matrice
Créer sur Scilab les matrice suivante :
A = 1 2 3 4 5 6 7 8
⎡
⎣ ⎢ ⎤
⎦ ⎥
,B = 2 4 6 8
⎡
⎣ ⎢ ⎤
⎦ ⎥
En vous aidant de l’annexe, effectuer les opérations suivantes : ➢ Transposition :
C =
TA
➢ Produit :
D = BA
➢ Inversion :
E = B
−1Construire les matrices
F =
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
⎡
⎣
⎢ ⎢
⎢ ⎢
⎤
⎦
⎥ ⎥
⎥ ⎥
= A A
⎡
⎣ ⎢ ⎤
⎦ ⎥
etG = 2 4 6 8
2 4 6 8
⎡
⎣ ⎢ ⎤
⎦ ⎥ = ⎡ ⎣ B B ⎤ ⎦
Effectuer le produit terme à terme de A et de G :
H = A ⋅G
B.1.2. Résolution de système linéaire
On souhaite résoudre le système linéaire suivant :
2x − y + 3z = 1 x + 2z = −2
−2 x + y + z = 0
⎧
⎨ ⎪
⎩ ⎪
Matriciellement, cette équation s’écrit
AX = B
avecA =
2 −1 3 1 0 2
−2 1 1
⎡
⎣
⎢ ⎢
⎢
⎤
⎦
⎥ ⎥
⎥
et
B = 1 2 0
⎡
⎣
⎢ ⎢
⎢
⎤
⎦
⎥ ⎥
⎥
Notions préalables Edition 1 - 07/11/2017
Il faut donc résoudre
X = A
−1B
, après s’être assuré que la matrice A est inversibleCalculer le déterminant de A, puis résoudre ce système sous Matlab Vérifier que X est solution de l’équation
det(A)
A=[2 -1 3;1 0 2;-2 1 1];
B=[1;-2;0];
X=A\B
B.2. Graphiques 2D
B.2.1. Lecture du fichier de mesure
A l’aide de l’éditeur de texte Windows, ouvrir le fichier «signal.csv». Quelle est sa structure (Nombre de colonnes, en-tête, séparateur de données, format de la virgule) ?
La lecture sous Scilab du fichier de mesures s’obtient par la commande csvRead (syntaxe à l’adresse https://
help.scilab.org/docs/5.4.1/fr_FR/csvRead.html)
Ecrire dans la console Scilab la commande qui permet de lire le fichier, en précisant sa structure et en ignorant l’en-tête. Le résultat de l’import sera stocké dans la variable mesure.
! mesure = csvRead('signal.csv', ';', ',', [], [], [], [], 1);
Quel est la nature de cette variable ?
Cette variable contient les valeurs de temps et de sortie.
Extraire de cette variable un vecteur colonne temps qui contiendra l’ensemble des valeurs de temps, et un vecteur colonne signal_brut qui contiendra l’ensemble des relevés de sortie
temps=mesure(:,1);
! signal_brut=mesure(:,2);
Notions préalables Edition 1 - 07/11/2017
B.2.2. Affichage de la courbe expérimentale
On cherche dans cette partie à afficher la courbe expérimentale dont les abscisses sont maintenant contenues dans votre variable temps, et les ordonnées dans votre variable sortie.
En vous aidant de l’annexe relative au tracé de courbes (fonction plot2d), écrire dans la console les fonctions permettant d’élaborer un graphique qui tracera cette courbe, avec les contraintes suivantes :
* la courbe doit être bleue
* la figure doit faire apparaître :
• la légende «Signal mesuré»
• un titre «Acquisition capteur»
• le label «Temps (s)» pour l’axe des abscisses, et «Signal (V)» pour l’axes des ordonnées
B.2. Ecriture du script
Une ébauche de script est fourni : fichier TD7_Etudiants.sce
Ouvrir ce fichier dans l’éditeur SciNotes. Il est découpé en plusieurs parties, dont vous pouvez à présent en remplir certaines.
Ecrire les instructions des parties suivantes, en reprenant les études précédentes :
• Partie 2 : Chargement du fichier de mesures signal.csv dans une variable mesure
• Partie 3 : Extraction des vecteurs colonne temps et signal_brut
• Partie 4 : Affichage de la courbe signal_brut fonction de temps
Enregistrer ce fichier en ajoutant votre nom au nom de fichier.
Notions préalables Edition 1 - 07/11/2017
C. Filtrage du signal
C.1. Problématique
Le signal issu du capteur est fortement bruité :
Afin de pouvoir exploiter ce signal, il faut au préalable le filtrer afin d’éliminer les signaux parasites.
Ces signaux sont manifestement à fréquence élevée. Il faut donc concevoir un filtre qui ne laisserait passer que les signaux de faible fréquence, et supprimerait les signaux de fréquence élevée : il s’agit du filtre passe-bas.
C.2. Présentation du filtre
Nous allons étudier un filtre du 1er ordre, dont la fonction de transfert s’écrit
H ( p) = S
f( p) E( p) = 1
1+ τ p
oùS
f( p)
désigne le signal filtré dans le domaine symbolique,E( p)
le signal d’entrée brut etτ
la constante de temps du filtre.C.2.1. Comportement du filtre
Ouvrir dans une fenêtre xcos le modèle Filtre passe bas1.zcos
La simulation montre l’influence du filtre sur des signaux sinusoïdaux d’amplitude 1, et de fréquences différentes.
Lancer la simulation
Quelle influence le filtre a-t-il sur l’amplitude du signal ?
Filtrage du signal Edition 1 - 07/11/2017
Ce filtre du 1er ordre est appelé filtre passe-bas : il n’influence pas l‘amplitude des basses fréquences, mais atténue fortement l’amplitude des hautes fréquence.
Nous verrons en S2I que la fréquence à laquelle l’amplitude commence à être atténuée, appelée fréquence de coupure
f
c, est égale àf
c= 1 / τ
C.2.2. Influence de la constante de temps
Ouvrir à présent le modèle Filtre passe bas2.zcos
La simulation montre l’influence de la constante de temps du filtre sur un signal fortement bruité.
Lancer la simulation
Quelle influence la constante de temps a-t-elle sur le signal ?
C.2.3. Implantation informatique du filtre
Nous allons donc filtrer le signal issu du capteur avec un filtre passe-bas du 1er ordre, de gain 1 et de constante de temps 0,5s :
H ( p) = S
f( p)
E( p) = 1 1 + 0,5 p
Dans le domaine temporel, cette fonction traduit l’équation différentielle du 1er ordre suivante :
s
f(t ) + 0,5 ds
f(t )
dt = e(t )
Or le signal est échantillonné à une fréquence de 200 Hz (le fichier du signal montre que l’intervalle entre 2 points de mesure, donc la période d’échantillonnage, est égal à 5 ms).
Avec un signal échantillonné avec la période d’échantillonnage
T
e , une dérivée est évaluée par l’expression suivante :
ds
f(t) dt
⎤
⎦⎥
t=ti→ s
f(t
i+ T
e) − s
f(t
i) T
eL’équation différentielle qui traduit le comportement du signal filtré devient alors :
s
f(t
i) + 0,5 s
f(t
i+ T
e) − s
f(t
i)
T
e= e(t
i)
Filtrage du signal Edition 1 - 07/11/2017
C.3. Calcul du signal filtré et de la valeur finale
C.3.1. Ecriture de la fonction calculant les valeurs du signal filtré
Nous allons à présent écrire une fonction qui sera appelée dans le script. Une fonction est une liste d’instructions qui sera stockée dans une librairie locale, pour ensuite être appelée dans un script.
Sous Scilab, les fonctions sont déclarées avec l’instruction function et se terminent par l’instruction endfunction. Ces fonctions peuvent retourner une ou plusieurs variables. S’il y en a plusieurs, elles sont alors retournéees dans un tableau.
Exemple :
Création de la fonction
function [x, y]=Nom_de_fonction(a, b)
x=a+b
y=a−b
endfunction
function [x, y]=Nom_de_fonction(a, b)
x=a+b
y=a−b
endfunction
Appel de la fonction
[t,u]=Nom_de_fonction(3,2) [t,u]=Nom_de_fonction(3,2)
Compléter l’algorithme page suivante qui traduit l’équation différentielle du filtre : à partir d’un vecteur colonne mesure, et en fonction d’une période d’échantillonnage Te et de la constante de temps tau, fournit en sortie un vecteur colonne s
Ouvrir ensuite le fichier Fonctions.sci, qui comporte les ébauches des fonctions que vous serez amené à utiliser dans votre script.
En vous aidant de l’algorithme précédemment établi, compléter les instructions de la «Fonction 1 : Sortie du filtre passe-bas».
Enregistrer le fichier .sci
Filtrage du signal Edition 1 - 07/11/2017
Lire Te Lire tau Fonction filtre(mesure,Te,tau)
Lire la taille du fichier mesure
i=1
Fin
Filtrage du signal Edition 1 - 07/11/2017
C.3.2. Ecriture de la fonction calculant la valeur finale
La fonction s_finale=Sinfiny(s) a pour objectif de calculer la valeur de l’asymptote d’un signal.
Le principe consiste à calculer la moyenne des n dernières valeurs qui n’évoluent plus à 2% près Les blocs d’instruction de cette fonction sont les suivants :
Lire la taille du vecteur n : Nb
Lire la dernière valeur de ce vecteur : s_f i=Nb
Tant que
s(i) − s _ f
s _ f < 0.02
i=i-1 Fin
s_finale=moyenne de s(i)
A l’aide de ces blocs d’instruction, compléter les instructions de la «Fonction 2 : Recherche de la valeur finale».
Enregistrer le fichier .sci
Filtrage du signal Edition 1 - 07/11/2017
C.4. Tracé des 2 figures
C.4.1. Tracé d’une figure avec plusieurs graphiques
A la fin de ce TD, vous aurez construit 4 courbes :
Il faut donc indiquer la position relative de chaque graphe, un utilisant subplot(mnp) où m est le nombre de lignes, n le nombre de colonnes, et p le numéro de figure.
Ecrire dans votre script .sce la commande subplot(221) avant les lignes d’instruction qui ont permis de construire le graphe des mesures brutes au B.2 de ce TD .
Lancer le script et vérifier l’affichage du graphe
Filtrage du signal Edition 1 - 07/11/2017
C.4.2. Tracé de la courbe du signal filtré
En seconde position (2e ligne et 2e colonne), nous allons tracer le graphe qui superposera en vert les mesures brutes, et en rouge le signal filtré.
En partie 5 du fichier TD7_Etudiant.sce, écrire l’instruction faire appel à la fonction filtre(mesure, te, tau) pour construire la variable signal_filtre, en précisant la période d’échantillonnage et la constante de temps
τ = 0,5 s
:signal_filtre=filtre(signal, 0.05, 0.5);
Il faut à présent afficher un second graphique sur lequel nous tracerons 3 courbes :
• les valeurs brutes du vecteur signal_brut (en vert)
• Les valeurs filtrées du vecteur signal_filtre (en rouge)
• la droite correspondant à la valeur finale s_f
Toujours dans la partie 5 du fichier de script .sce, et sans oublier d’indiquer la position de ce second graphique avec l’instruction suplot(222), écrire la liste d’instructions permettant de tracer ces trois courbes.
La légende indiquera «mesures brutes» et «mesures filtrées». Le titre sera «Mesures brutes et filtrées».
L’axe des abscisses aura le label «Temps (s)» et l’axe des ordonnées «Signal (V)» :
subplot(222)
s_f=Sinfiny(signal_filtre)
(Tracé des valeurs brutes et filtrées) plot2d([temps(1),temps($)},[s_f,s_f]) (légende)
(titre) (label X) (label Y)
Enregistrer et tester le programme
Filtrage du signal Edition 1 - 07/11/2017
C.5. Validation de l’hypothèse de l’ordre du système
C.5.1. Principe de validation
Au vu de l’allure de la réponse indicielle, nous avons fait dès le départ l’hypothèse d’un système du 1 er ordre.
Nous devons à présent valider cette hypothèse avant de calculer le gain et la constante de temps correspondant.
Si le système est du premier ordre, alors le signal doit vérifier l’expression générale suivante :
s(t ) = s
f1− e
−t
⎛
τ⎝⎜
⎞
⎠⎟
Cette équation peut s’écrire, en passant par le logarithme :
ln ( s
f− s(t ) ) = ln(s
f) − τ t
Par conséquent, si le système est effectivment du 1er ordre, alors la courbe
s(t)
tracée en échelle logarithmique doit être une droite.S’il s’agit bien d’une droite, alors sa pente vaut
− 1
τ
et l’ordonnée à l’origineln(s
f)
C.5.2. Extraction des valeurs logarithmiques du signal
Afin de s’assurer de n’avoir que des valeurs positives pour
s
f− s(t )
, nous en ferons l’étude que pour des valeurs de signal inférieures à 90% de la valeur finaleLa fonction S_log=Slog(s) est donnée. Cette fonction extrait sous forme de vecteur colonne le logarithme des valeurs qui restent inférieures ou égales à 90% de la valeur finale calculée grâce à la fonction Sinfiniy
Il faudra donc dans le script faire appel à cette fonction pour construire un vecteur signal_log : signal_log=Slog(signal_filtre)
Ecrire cette instruction dans la partie 6 du script .sce
Il faut à présent vérifier que les points de ce vecteur définissent effectivement une droite. Dans l'affirmative nous pourrons alors valider l'hypothèse d’un système du 1er ordre, et calculer sa constante de temps.
Filtrage du signal Edition 1 - 07/11/2017
C.5.3. Coefficients de la droite de régression linéaire
Nous allons créer une fonction regression(x,y) qui aura pour objectif de calculer la pente
a
et l’ordonnée à l’origineb
de la droite qui passe au mieux par le nuage de points (t,S_log(t)).On rappelle ci-dessous les formules permettant de déterminer les coefficients
a
etb
de la droite de régression linéaire passant parn
points :
a =
n x
i.y
i∑
i− x
i∑
i. y
i∑
in x
i2∑
i− x
i∑
i⎛
⎝⎜
⎞
⎠⎟
2
b = 1
n y
i∑
i− a. 1 n x
i∑
i= y
i− a.x
iOn donne les blocs d’instruction de la fonction regression(x,y) qui permettront de calculer ces coefficients : Déterminer la taille du vecteur x : n
Sommer terme à terme les composantes de x et de y : Sxy Sommer les composantes de x : Sx
Sommer les composantes de y : Sy Calculer a
Calculer b
En vous appuyant sur ce bloc d’instructions, compléter alors dans le fichier Fonctions.sci la fonction «Fonction 4 : Coefficients de la droite de régression linéaire»
C.5.4. Tracé du logarithme du signal et de la droite de régression
Le script .sce doit maintenant afficher le nuage de points et la droite de régression linéaire.
Les instructions suivantes sont ) placer dans la partie 6 du script
signal_log=Slog(signal_filtre) Réponse en échelle logarithmique [nb_ele, c]=size(signal_log) Détermination du nombre d’éléments
t=temps(1:nb_ele) Construction d’un nouveau vecteur colonne de temps [a,b]=regression(t,signal_log) Appel de votre fonction regression
subplot(223) Définition de la sous-zone de graphique plot2d(t,[signal_log,a*t+b]) Construction des courbes (signal log et droite) legende1="$\log(s_\infty-s(t))$" Affichage des légendes et textes
legende2="$a\cdot t + b$"
format(5) tta=string(-1/a)
Filtrage du signal Edition 1 - 07/11/2017
texte1=textetau xstring(0.1,-0.4,texte1) xstring(0.5,-0.4,tta) texte2="b="+ttb xstring(0.1,-0.6,texte2) legend([legende1,legende2]) tt_tau="$\tau$"
tt_titre="détermination de"+ tt_tau title(tt_titre)
xlabel(legende1) ylabel("y")
Ecrire ces instructions.
Enregistrer et lancer le programme
Conclure sur la validité de l’hypothèse d’un système du 1er ordre Quelle est la valeur de la constante de temps de ce système ?
Filtrage du signal Edition 1 - 07/11/2017
C.6. Conclusion
Il nous reste pour finir à construire la courbe correspondant au modèle du 1er ordre, afin de déterminer ses éléments caractéristiques (valeur finale, temps de réponse)
Il s’agit dans un 4e et dernier graphique de tracer pour les 800 premières valeurs de temps
• la courbe du modèle théorique
s(t ) = s
f1− e
−t
⎛
τ⎝⎜
⎞
⎠⎟
• la courbe du signal filtré
• l’asymptote
• la zone
±5%
de l’asymptote• la tangente à l’origine
• le temps de réponse
subplot(224) t2=temps(1:800) t800=t2($)
(construction de la variable modele) tau=-1/a
(Affichage du modèle et du signal filtré)
(Affichage de la droite 0,95s_f et de la droite 1,05s_f) (Affichage de la droite s_f)
(Affichage de la droite du temps de réponse, passant par les points
( 3τ ,0 )
et( 3 τ ,0.95s _ f )
)(Affichage de la tangente, passant par les points
( ) 0,0
et( τ , s _ f )
)(Titre : «Modèle du 1er ordre et signal filtré») (Label X : «Temps (s)»»)
(label Y : «Signal (V)» )»
Filtrage du signal Edition 1 - 07/11/2017
D. Annexes
Un formulaire synthétique des fonctions de Scilab est disponible sur la page de Marc Derumaux : http://marc.derumaux.free.fr/formulaire.html
D.1. Matrices
D.1.1. Création d’une matrice
On souhaite définir la matrice
1 2 3 4 5 6
⎡
⎣ ⎢ ⎤
⎦ ⎥
;Sous Scilab, cette matrice s’écrira : A=[1 2 3;3 4 6] ou A=[1,2,3;3,4,6]
Les termes d’une ligne sont séparés d’une virgule ou d’un espace, la fin d’une ligne est identifiée par un point- virgule
D.1.2. Matrices particulières Vecteur colonne : V=[1;2;3]
Vecteur ligne : V=[1 2 3]
Vecteur ligne composé de valeurs régulièrement espacées : * incrément imposé : V=1:2:10
! ! V = 1. 3. 5. 7. 9.
! * Nombre d’intervalles imposé : V=linspace(1,10,3)
! ! V = 1. 5.5 10.
Matrice identité : eye(2,3)
Matrice composée exclusivement de ‘1’ : ones(2,3) Matrice composée exclusivement de ‘0’ : zeros(2,3) D.1.3. Opérations sur les matrices
Taille d’une matrice : size(A)
Transposition : ! ! B=A’ (apostrophe)
Produit : C=B*A
Inverse : B=inv(A)
Résolution A.X=B : X=A\B
Opérations terme à terme A.*B A./B A.^B
Déterminant : det(A)
Vecteur propre : spec(A)
Trace : trace(A)
Somme des éléments : sum(A) Moyenne des éléments :mean(A)
Annexes Edition 1 - 07/11/2017
D.2. Graphiques 2D
D.2.1. Commande plot2d
La commande générique pour tracer des figures 2d est (voir la syntaxe détaillée (syntaxe à l’adresse https://
help.scilab.org/docs/5.4.1/fr_FR/plot2d.html) :
plot2d([logflag,][x,],y[,style[,strf[,leg[,rect[,nax]]]]])
➢ logflag : échelle linéaire ou logarithmique (‘nn’, ‘nl’, ‘nl’,’ll’). Par défaut linéaire ‘nn’
➢ x : vecteur ou matrice contenant les valeurs des abscisses. Dans le cas d’une matrice,
chaque colonne représente une courbe différente
➢ y : vecteur ou matrice contenant les valeurs des ordonnées. Dans le cas d’une matrice,
chaque colonne représente une courbe différente
➢ style : vecteur contenant les paramètres de style pour chaque courbe. Si positif, il s’agit d’une ligne pour laquelle on définit une couleur, si négatif il s’agit de points pour dont
on définit la nature
➢ strf : chaîne de 3 caractères ‘xyz’ définissant l’affichage des axes. Voir sur l’‘aide l’influence des valeurs de x, y et z. Par défaut ‘081’.
➢ leg : chaîne de caractéres définissant le nom de la légende. Cette légende est toujours
positionnée sous l’axe des abscisses
➢ nax : vecteur-ligne de 4 entiers définissant les marquages sur les axes
Exemple
-->teta=[0:.05:2*%pi]';
-->plot2d('nl',teta,[exp(sin(teta)) exp(cos(2*teta))],style=[12 -1],leg="sin(teta) cos(2teta)")
D.2.2. Options complémentaire
Ces options complémentaires sont des instructions à définir après avoir tracé le graphique D.2.2.1. Afficher une légende
legend([‘string1’;...;‘stringi’],pos=[j],box=[%bool])
! ➢ ‘stringi’ : chaîne de caractéres définissant le nom de la légende de l ième courbe
! ➢ j : entier définissant la position de la légende
Annexes Edition 1 - 07/11/2017
D.2.2.2. Afficher un titre title(‘titre’,<Property>)
!
Les propriétés optionnelles (police de caractère, couleur, fond, ...) sont à définir dans <Property>. Voir l’aide pour le détail
D.2.2.3. Label des axes
xlabel([axis_handle], label, [property_name, property_value,...]) ylabel([axis_handle], label, [property_name, property_value,...]) zlabel([axis_handle], label, [property_name, property_value,...])
Annexes Edition 1 - 07/11/2017