TD 1 : Introduction à Octave Ce TD à pour objectif de présenter le logiciel de calcul numérique Octave. Ce gratuiciel fonctionne sous Linux et peut être télécharger à l’adresse suivante : http://www.octave.org/ L’essentiel de la syntaxe et des commandes d’Octave est compatible avec le logiciel Matlab très largement répandu pour le développement d’applications dans le domaine du calcul et du traitement numérique. I. Aide en ligne La commande help permet d'obtenir une aide sur l'ensemble des commandes disponibles sous octave. Octave:1> help Appelée avec en paramètre une nom de commande, elle renvoie une explication sur le fonctionnement de cette commande. Par exemple : Octave:2> help help II. Vecteurs et Matrices Initialisation d'un vecteur : octave:1> x=(1:10); construit la liste des valeurs entières comprises entre 1 et 10 et l'associe à la variable x. octave:2> x=(2:3:11); construit la liste des valeurs entières comprises entre 2 et 11 en progressant de 3 en 3 et l'associe à la variable x = 2 5 8 11 octave:3> x=[ 5 3 9 45 4 5 9 ]; initialise la variable x avec la liste des valeurs passées en paramètre. Récupération d'une valeur d'un vecteur : x(2) représente la seconde valeur du vecteur. ATTENTION : sous Octave, le premier indice d'un vecteur est toujours 1 Exemple : octave:4> x=[ 5 3 9 45 4 5 9 ] x = 5 3 9 45 4 5 9 octave:5> x(2) ans = 3 octave:6> x(1) ans = 5 Initialisation d'une matrice La liste des valeurs est donnée ligne par ligne, les lignes étant séparées par des points-virgule. Exemple : octave:7> y = [1 2 3; 4 5 6; 7 8 9; 10 11 12] y = 1 2 3 4 5 6 7 10 8 11 9 12 Initialisation partielle octave:8> % recopie de la 2eme colonne de y dans la 3eme colonne de y octave:9> y(:,3)=y(:,2); octave:10> y y = 1 2 2 4 5 5 7 8 8 10 11 11 III. Expressions Suppression de la sortie écran des résultats Pour éviter qu'une commande ou une initialisation renvoie une ou plusieurs valeurs à l'écran, on ajoute un point-virgule en fin de ligne. Exemple : octave:11> a=1 a = 1 octave:12> b = a + 1 b = 2 octave:13> c = b + 1; Commentaires Pour signaler un commentaire, il suffit de placer un symbole de pourcentage "%" en début de ligne Opérateurs et constantes arithmétiques Constantes : • • pi, i, j (imaginaires pour les complexes) Exemple octave:14> pi pi = 3.1416 octave:15> i i = 0 + 1i octave:16> j j = 0 + 1i Opérateurs d'addition, soustractions, multiplication, division, puissance, et modulo : +, -, *, /, ^, mod Exemple octave:17> mod(5,2) ans = 1 octave:18> 5/2 ans = 2.5000 Toncature : arrondi à l’entier inférieur, supérieur, le plus proche floor, ceil, round Exemple octave:19> floor(5/2) ans = 2 Opérateurs de comparaison <, >, <=, >=, = =, ~= (différent) Les valeurs de conditions sont : Vrai = 1 et Faux = 0 Exemple : octave:20> a~=b ans = 1 octave:21> a==b ans = 0 Opérateurs logiques & : ET | : OU ~ : NON Exemple : octave:22> (a==b)&(a~=b) ans = 0 octave:23> (a==b)|(a~=b) ans = 1 octave:24> ~(a==b) ans = 1 Opérations sur les matrices • • • • Transposée : A' Addition, Multiplication : A + B, A * B Multiplication par un scalaire : A * k, A / k multiplication et division élément par élément : A .* B, A ./ B Exemple : octave:25> y=[1 2]’ y = 1 2 Structures algorithmiques Exemples de boucles for i=1:longueur_signal p=sig(i) end for i=1:largeur_image for j=1:hauteur_image p=img(i,j); end end i=1; while i<largeur_image j=1; while j<hauteur_image p=img(i,j); j=j+1; end i=i+1; end Exemples de branchements conditionnels if condition action; endif ou encore if condition action1; else action2; endif ou encore if condition1 action1; elseif condition2 action2; endif IV Quelques commandes zeros : crée un tableau initialisé avec des zéros Exemple % matrice 3x3 octave:26> zeros(3) ans = 0 0 0 0 0 0 0 0 0 % matrice 1x3 octave:27> zeros(1,3) ans = 0 0 0 ones : idem que zeros en initialisant le tableau avec des uns rand : idem que zeros en initialisant avec des nombres tirés aléatoirement de manière uniforme entre 0 et 1. Exemple octave:28> rand(1,3) ans = 0.9501 0.2311 0.6068 sqrt : racine carrée (square root) Exemples octave:29> sqrt(9) ans = 3 octave:30> sqrt(-1) ans = 0 + 1.0000i abs : valeur absolue ou module d'un nombre complexe Exemples : octave:31> abs(-1) ans = 1 octave:32> abs(0 + 1.0000i) ans = 1 exp, log, log10, sin, cos,tan : fonctions logarithmiques et trigonométriques de base size : dimensions d'un vecteur ou d'une matrice Exemple : octave:33> m=zeros(2,3) m = 0 0 0 0 0 0 octave:34> size(m) ans = 2 3 octave:35> a = [ 1 2 3 74 5 ] a = 1 2 3 octave:36> size(a) ans = 1 5 74 5 fft : transformée de Fourier Exemples : octave:37> fft([1 2 1 2 1 2 1 2]) ans = 12 0 0 0 -4 0 0 0 octave:38> fft([56 123 45 789 65 0 784 554]) ans = 1.0e+003 * Columns 1 through 4 2.4160 -0.0882 + 0.4859i -0.7080 + 1.2200i 0.0702 - 0.9921i Columns 5 through 8 -0.5160 0.0702 + 0.9921i -0.7080 - 1.2200i 0.0882 - 0.4859i cov : calcul de la matrice de covariance Exemple : octave:39> cov([1 2 ; 2 1]) ans = 0.5000 -0.5000 -0.5000 0.5000 std : écart-type octave:40> std([ 1 5 1 5 1 5 1 5]) ans = 1.5119 clear : supprime de la mémoire une ou toutes les variables Exemple : octave:41> a=1; octave:42> b=2; octave:43> a a = 1 octave:44> clear a octave:45> a error : `a’ undefined near line 18 column 1 octave:46> b b = 2 octave:47> clear octave:48> b error : `b’ undefined near line 20 column 1 - V Function Il est possible de créer des programmes de manière à ce qu'ils se comportent comme une commande Octave par la suite. Pour cela : • dans un fichier texte, écrire l'entête permettant d'assurer le passage des paramètres suivi du programme de la commande. L'entête est de la forme : function nom_de_la_commande(liste des paramètres envoyés à la commande) suivi du programme de la commande Par exemple : function res=essai(x) n=size(x); a=n(1); b=n(2); res=[a b]; endfunction • sauvegarder ensuite le fichier dans le "répertoire courant" d’Octave avec l'extension .m (par exemple essai.m). Si le fichier n'est pas sauvegardé dans le répertoire courant, il faut le signaler à l'environnement de programmation Octave avant de faire appel à la nouvelle commande. Il est ainsi possible de créer un répertoire regroupant toutes les commandes que vous souhaitez en signalant à chaque ouverture de session Octave que le répertoire courant est celui que vous indiquerez au système en utilisant la commande cd. Exemple octave:49>cd /home/chezmoi/octave/mescommandes/ Par défaut, Octave explore également tous les répertoires répertoriés dans la variable $PATH de l’environnement LINUX/UNIX de l’utilisateur pour trouver le code correspondant à une commande appelée. VI Fonctions graphiques plot : affiche les données sous forme de courbes Exemple : » a=[1 5 8; 5 6 9; 7 5 1] a= 1 5 5 6 7 5 » plot(a) » 8 9 1 En sortie, un graphique apparaît ou chaque colonne est associée à une courbe de couleur différente. hold on : A chaque fois qu'on lance une commande graphique, l'ancienne figure est effacée pour être remplacée par la nouvelle. Pour superposer les graphiques, on peut utiliser la commande hold on. Par exemple, pour afficher sur la même figure les vecteurs a et b : » a=[1 5 9]; » b=[8 4 3]; » plot(a); » hold on; » plot(b); Exercice 1 : Indiquer comment, sous Octave, on peut produire un signal numérique sinusoïdal de 256 échantillons dont les valeurs sont comprises entre 3 et 12, à raison de 8 échantillons par période. Exercice 2 : Indiquer comment modifier ce signal pour simuler un bruit aléatoire additionnel d’amplitude +/- 3. Exercice 3 : Un Convertisseur Numérique Analogique parfaitement linéaire génère un signal électrique de tension variable comprise entre 0 et 10 volts. Question 1 : Ecrire la fonction « quantum(b) » sous Octave qui, étant donné le nombre de bit b sur lequel s’exprime les valeurs numériques en entrée, renvoie la tension correspondant à la valeur 1. Question 2 : Ecrire la fonction « tension(s) » sous Octave qui, à partir du signal numérique s, produit les tensions successives du signal électrique correspondant. Le nombre de bit utilisé pour le codage du signal électrique est déterminé comme étant la puissance de 2 immédiatement supérieure au maximum du signal numérique (on suppose que les valeurs numériques sont toutes des entiers positifs ou nuls). Question 3 : Un lissage des tensions est appliqué sur le signal électrique de sortie du CNA en remplaçant chaque valeur par la moyenne de la valeur qui la précède et qui la suit dans le signal. Ecrire la fonction « lissage(t) » sous Octave qui réalise cette opération sur le signal électrique t. Exercice 4 : on s’intéresse maintenant à un Convertisseur Analogique Numérique parfaitement linéaire. Ecrire la fonction CAN(t,b) qui, étant donnée les valeurs successives (positives ou nulles) de la tension du signal électrique t en entrée, et le nombre de bits b des valeurs numériques en sortie, renvoie le signal numérique correspondant de manière à ce que la tension maximale de t corresponde à la valeur maximale qui peut être codée sur b bits. Exercice 5 : Ecrire une fonction « weber(r, imin, imax) » sous octave qui, étant donné la valeur du r du ratio de Weber, le niveau d’intensité minimale imin et le niveau d’intensité maximale imax du dispositif de restitution, renvoie le nombre de bits nécessaires pour coder l’information d’intensité sur ce dispositif. imin et imax sont ici des valeurs entières. TP 1 : Prise en main d’Octave Le but de ce TP est de mieux appréhender le logiciel Octave. Pour cela, après vous être connecté, lancer octave dans une fenêtre système, puis tester les exemples du support de TD. Reprendre ensuite les exercices en apportant les modifications suivantes : Exercices 1 et 2 : en utilisant la commande randn, produire un bruit additionnel gaussien (suivant une loi normale). Utiliser l’aide en ligne si besoin est. Exercice 3 : afficher sur une même figure la courbe représentant la tension avant et après lissage. Exercice 4 : afficher sur une même figure la courbe représentant le signal numérique pour différentes valeurs de b