Page Page 11S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Créer des interfaces avec Matlab.
Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul Stromboni pour les élèves SI1
Ce que vous devez savoir après cette séance :
Savez vous répondre aux questions suivantes ?
Que réalise l'instruction Matlab : set(h,'Tag','toto') ?
Que réalise get(h,'String') ?
Énumérer cinq ‘uicontrols’ Comment fermer un GUI dans un bouton 'Quit' ?
Quel est le GUI créé par
h=plot(t,sin(t));
Comment utiliser la structure handles ?
Que réalisent les deux lignes :
g =findobj(gcf,'String','Tracé')
delete(g)
Qu’est ce qu’un Callback ?
Matlab permet de développer des GUI (ou graphic user interfaces) pour présenter les résultats aux utilisateurs.Un GUI est défini par deux fichiers de même nom, une figure et un scriptLes objets d’interface possèdent des propriétés et des callbacks, et sont accédés par des handlers.
Travaux dirigés : créer un GUI pour analyser la compression d’un son wave avec un banc de filtres
Page Page 22S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Vous pouvez construire avec Matlab des interfaces graphiques programmables Un GUI (Graphic User Interface) est constitué d'objets d'interface (uicontrols) dotés de méthodes et de propriétés programmables dans des scripts.
Pour décrire un GUI, Matlab utilise deux fichiers, un fichier figure (d’extension fig), qui contient le layout du GUI, ou disposition des objets d'interface, un fichier script (d’extension .m), qui contient les comportements de l'interface
Par exemple, le GUI two_axes ci-dessous est décrit par les deux fichiers two_axes.m et two_axes.fig :
Page Page 33S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Matlab contient un éditeur de GUI
GUIDE (pour Graphic User Interface Development Editor) contient les outils pour : 1. disposer les objets d'interface (layout)
2. adapter les valeurs de leurs propriétés
3. programmer les comportements (Callbacks)
On exécute GUIDE depuis la fenêtre Matlab : 1. avec la commande : >> guide
2. à l'aide du raccourci dans la barre d'outils
La fenêtre GUIDE appliquée au GUI two_axes : (cf. run, uicontrols, menus, edit, propedit, …)
Page Page 44S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Tous les objets d'interface sont dotés de propriétés accessibles et modifiables.
Voici une liste de propriétés (non exhaustive) :
Tag, est le nom de l'objet Style, son type, bouton, texte, panel … Name, Pointer, WindowStyle (figure) String, le texte qui apparaît (text, edit, …) ForegroundColor, … Max, Min, Step (slider) Value Callback, pour coder les comportements ButtonDownFcn, ResizeFcn, CreateFcn … FontSize, FontWeight, FontName, …
L’inspecteur de propriétés est appelé par GUIDE pour modifier les propriétés des objets d'interface
Page Page 55S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Pour atteindre les propriétés des objets d'interface, on utilise des 'handler'.
À tout objet d'interface, Matlab peut associer des pointeurs, ou handler, pour l’accès aux propriétés.Certains handlers sont définis par défaut :
gcf : handler de la figure courante (get current figure) gca : axes courants de tracé (get current axes) gcbf : la figure cliquée (get callback figure) gcbo : l'objet qui appelle (celui sur lequel on a cliqué) Le handler 0 est la fenêtre interpréteur Matlab Le handler 1 est la figure 1, …
Voici des instructions qui utilisent un handler : get et set, respectivement pour lire et pour changer les
valeurs des propriétés findobj, pour retrouver le handler d'un objet propedit, pour éditer les propriétés d'un objet. delete, pour effacer un objet
Exemples de programmation avec les handlersget(0) % qu'obtient-on ?
t=0:.1:100;
h=plot(t,t.*sin(t),t,t) % noter la valeur de h
get(h(1),'Color'))
set(h(2),'tag','toto')
set(h(2),'ButtonDownFcn', 'close')
g=findobj(gcf,'tag','toto')
delete(g)% efface quoi ?
propedit(h(2))
% définir un uicontrol
h=uicontrol('sty','pushbutton','str',…
'terminer','cal','close')
Page Page 66S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Comment programmer un GUI (cf. MonPremierGUI.zip)
dans la propriété ‘Callback’, on place : Soit une instruction : telle ‘grid’ ou ‘close(gcf)’ Soit un script Matlab placé dans le path, tel
'script.m' pour le bouton 'Tracé'
pour échanger des informations entre les objets d’interface, on utilise Workspace
Pour adresser un objet d’interface, on utilise findobj, cf. zone de texte éditable ci-dessous :
% script.m appelé par le bouton 'tracer'
t=0:.1:10;
h=findobj(gcf,'tag','edit1');
f=str2double(get(h,'String')); % 'str'suffit
stem(t,t.*sin(2*pi*f*t));
Page Page 77S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Une autre façon de programmer un GUI en utilisant le fichier scriptGUIDE génère automatiquement des méthodes vides pour les callbacks des objets d’interface, il les appelle dans la propriété Callback et leur transmet les deux arguments suivants :1. hObject, le handler de l'objet appelant
2. Handles, une structure qui contient les handlers de tous les objets d'interface, et permet ainsi l'accès à toutes leurs propriétés.
Pour programmer le GUI, il suffit de compléter ces méthodes créées par GUIDE dans le fichier script du GUI, ce qui évite de multiplier les scripts
Pour les échanges de variables entre les méthodes du GUI, il y a deux possibilités :
Soit on utilise la structure handles : % callback émetteur
handles.mydata=x % pour transmettre x
guidata(hObject,handles) % sauvegarde
% callback récepteur
y=handles.mydata % récupérer x dans y
Soit on utilise la déclaration global dans toutes les méthodes qui doivent partager une variable
global x
x= . . .
Page Page 88S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Une autre façon de programmer un GUI en utilisant le fichier scriptVoici le script MonSecondGUI.m :
l'outil f donne la liste des fonctions du script l'éditeur donne des diagnostics sur le script Dock/Undock, flêches en haut à droite
Page Page 99S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Voici l’exemple du GUI ‘Filtrer’: le layout (cf. Filtrer.zip)Voici le spectre de Piano.wav tracé par le GUI Filtrer (lancé en double cliquant sur Filtrer.fig)
Page Page 1010S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Exemple du GUI Filtrer (suite) : les scripts et instructions
%monload.m
[name,y,fe]=loadsig('./');
h=findobj(gcf,'tag','fe');
set(h,'string',num2str(fe))
h=findobj(gcf,'tag','slider1');
set(h,'Max',num2str(fe/2))
%montrace.m
t=[0:length(y)-1]/fe;
plot(t,y)
%spectre.m
f=[0:R-1]*fe/R-fe/2;
sp=fft(y(1:R),R);
stem(f,fftshift(abs(sp)))
axis([min(f),max(f),0,…
max(abs(sp))])
xlabel('fréquence (Hz)')
ylabel('signal filtré')
grid
% monfiltre.m
h=findobj(gcf,'tag','edit2')
fc=str2num(get(h,'string'))
h=findobj(gcf,'tag','edit4')
R=str2num(get(h,'string'))
K=round(f0*R/fe);
f0=K*fe/R;
%filtre générateur
N = fix(fc*R/fe);
% forme la plus arrondie
H=[ones(1,N-1),0.9,0.5,0.1,...
zeros(1,R-2*N-3),0.1,0.5,...
0.9,ones(1,N-2)];
h=fftshift(real(ifft(H)));
% réponse impulsionnelle du filtre
n=0:R-1;
bande= 2*cos(2*pi*[0:R-1]*f0/fe).*h;
%tracé réponse harmonique
fr=n*fe/R -fe/2;
spec=abs(fft(bande));
stem(fr,fftshift(spec))
xlabel('frequence (Hz)');
ylabel('réponse harmonique');
grid on
% monspectre.m
f=[0:R-1]*fe/R-fe/2;
sp=fft(s(1:R),R);
stem(f,fftshift(abs(sp)))
axis([min(f),max(f),0,…
max(abs(sp))])
xlabel('fréquence (Hz)')
ylabel('spectre filtré')
% bouton 'écouter'
wavplay(s,fe,'synch')
% monlire.m
wavplay(y,fe,'synch')
% bouton 'sauver'
wavwrite(s,fe,'signal.wav')Y
% bouton 'filtrer'
S=filter(bande,1,y)
%init.m
clear all
fe=8000
f0=0
R=8192
sigdir='./'
%monslider.m
h=findobj(gcbo,'tag','slider1');
f0=get(h,'value')
h=findobj(gcf,'tag','f0');
set(h,'string',num2str(f0))
monfiltre
Page Page 1111S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Concevoir un GUI pour compresser un signal avec un banc de filtres.
Représenter un croquis de l'interface sur cette page
Page Page 1212S.S.I. 2007 – 10 : Créer des interfaces avec MatlabS.S.I. 2007 – 10 : Créer des interfaces avec Matlab
Imaginer votre propre GUI pour TD n°8: Préciser ici les scripts nécessaires
Concevoir un GUI pour compresser un signal avec un banc de filtres.
Préciser les scripts et instructions de ce GUI ici :