12
Page Page 1 S.S.I. 2007 – 10 : Créer des S.S.I. 2007 – 10 : Créer des interfaces avec Matlab 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 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 script Les 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

S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

Embed Size (px)

Citation preview

Page 1: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 2: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 3: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 4: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 5: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 6: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 7: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 8: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 9: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 10: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 11: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 12: S.S.I. 2007 – 10 : Créer des interfaces avec Matlab Page 1 Créer des interfaces avec Matlab. Cours S.S.I. n°10, mai 2007, durée : 1 heure, écrit par Jean-Paul

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 :