MATLAB est un outil de calculs numériques permettant de tester des modèles mathématiques.

Vous pouvez télécharger et utiliser notre licence Campus avec votre adresse @institutoptique.fr. Cette licence est à usage uniquement pédagogique.

Une version en ligne est également disponible à l’adresse suivante : https://fr.mathworks.com/products/matlab-online.html

Autres ressources

Un très bon document sur le traitement du signal avec Matlab, écrit par JOHN W. LEIS (University of Southern Queensland) : DIGITAL SIGNAL PROCESSING

Utiliser des scripts

Matlab est également un langage interprété. Il est donc possible d’exécuter des lignes de code dans une fenêtre de commande (intégrée au logiciel Matlab).

Pour faciliter la réutilisation et le débogage de ses codes, il peut être intéressant de les stocker dans des scripts (ou programmes). Pour créer un nouveau script, il faut utiliser l’icône suivante New Script de l’onglet HOME :

Un fichier éditable s’ouvre dans la partie principale. Vous pouvez alors écrire les lignes de code de votre programme.

Créer une variable

Pour créer une variable, il suffit de lui donner un nom (sensible à la casse) et de lui affecter une valeur (numérique ou alphanumérique).

f = 120;
texte = 'toto';

Réaliser un calcul simple

Il est alors possible de réaliser des calculs simples et d’afficher les résultats.

k = 2 * f;
k

La première ligne permet de stocker dans la variable k le calcul 2 fois f. La seconde ligne permet d’afficher la variable k.

Il est possible de calculer et d’afficher le résultat directement. Il suffit de retirer le symbole ; à la fin de la ligne.

z = 6 * f + k
6 * f + k

Ces deux lignes donneront l’affichage du résultat. La première stockera l’information dans une variable nommée z. La seconde stockera le résultat dans une variable nommée ans. Attention, cette variable sera écrasée lors d’un autre calcul du même type.

Créer un vecteur

Matlab est basé sur l’utilisation de matrices et de vecteurs.

Evolution linéaire

Pour créer un vecteur pré-rempli de valeurs suivant une évolution linéaire, on peut utiliser l’une des deux écritures suivantes :

ta = linspace(0,1,1001);
tb = ( 0 : 0.001 : 1 );

Le vecteur ta est créé par appel à la fonction linspace qui permet de créer un vecteur d’un certain nombre de points (dernier paramètre – 1001) à partir d’une valeur d’origine (premier paramètre – 0) jusqu’à une valeur finale (second paramètre – 1) .

Le vecteur tb est créé par une notation propre à Matlab qui permet de créer un vecteur d’une valeur d’origine (premier paramètre – 0), par un pas particulier (second paramètre – 0.001), jusqu’à une valeur finale (dernier paramètre – 1).

Dans les deux cas, on crée ici un vecteur de 1001 points allant de 0 à 1.

Evolution logarithmique

Pour créer un vecteur dont les valeurs suivent une évolution logarithmique, on peut utiliser la fonction logspace.

w = logspace(1,6,101);

Cette fonction permet de construire un vecteur allant d’une valeur initiale de \(10^1\) (premier paramètre – puissance de 10 associée) à une valeur finale \(10^6\) (second paramètre – puissance de 10 associée) avec un nombre particulier de valeurs, ici 101 (dernier paramètre).

Créer une matrice

A venir…

Vérifier les variables, vecteurs et matrices

Le logiciel Matlab est équipé d’une zone nommée WORKSPACE permettant de visualiser l’ensemble des variables utilisées ainsi que leurs tailles.

Par exemple, ici f1 est une variable simple qui a pour valeur 120, ta est un vecteur ligne de 1001 valeurs réelles, K est une matrice de 1001 par 1001 de valeurs réelles.

Réaliser des opérations avec des vecteur ou des matrices

Transposition de vecteurs/matrices

Une première opération possible est la transposition. Elle s’écrit avec l’opérateur .

tc = ta';

Si ta est un vecteur d’une ligne de 1001 valeurs, alors tc sera un vecteur colonne de 1 valeur sur 1001 lignes.

Calculs matriciels

Si on reprend les deux vecteurs précédents, il est possible de réaliser les calculs suivants :

K = ta * tb';
M = ta' * tb;

K est le produit matricielle d’un vecteur ligne avec un vecteur colonne de 1001 valeurs chacun, il s’agit donc d’une variable réelle.

M est au contraire une matrice carrée de 1001 par 1001 valeurs réelles.

Calculs termes à termes

Il existe également une opération qui permet de faire des calculs termes à termes avec des vecteurs de même taille. Il suffit de faire précéder l’opérateur de calcul standard par un point . . Par exemple :

P = ta .* tb;

P sera alors un vecteur de la même taille que ta et tb dont les éléments seront les produits termes à termes des vecteurs ta et tb.

Créer des signaux

Il est alors possible de créer des signaux numériques par cette méthode. L’exemple suivant permet de créer un vecteur, nommé fa, contenant les valeurs d’un sinus de fréquence f1 et d’amplitude A.

f1 = 12;
A = 25;
ta = linspace(0,1,1001);
fa = A * sin(2*pi*f1*ta);

Afficher une courbe y=f(x)

Matlab possède un ensemble de fonction permettant de créer des graphiques (un peu comme la librairie matplotlib sous python).

Graphique y=f(x) / axes linéaires

f1 = 12;
A = 25;
ta = linspace(0,1,1001);
fa = A * sin(2*pi*f1*ta);
figure;
plot(ta, fa);

Les lignes précédentes permettent d’obtenir la figure suivante :

On peut remarquer sur cette figure qu’aucun axe n’est renseigné ainsi qu’aucun titre ou légende.

Titres, légendes et axes

Pour ajouter des éléments sur ce graphique, on peut utiliser les lignes de commandes suivantes :

legend('fonction sinus à 12Hz')
xlabel('temps (s)')
ylabel('signal (V)')
title('Sinus en fonction du temps')

La fonction legend permet d’ajouter une légende pour chaque signal affiché sur le graphique.

Les fonctions xlabel et ylabel permettent d’ajouter des titres aux axes des abscisses et des ordonnées.

La fonction title permet d’ajouter un titre au graphique.

L’option grid permet également d’ajouter le quadrillage du graphique.

grid on;

Graphique y=f(x) / abscisse logarithmique

On peut également vouloir tracer certaines courbes selon des axes à évolution logarithmique.

w = logspace(1,6,101);  % vecteur des pulsations
R = 1e4; C = 1e-7;   % definition des valeurs de R et C
num = 1;
den = 1 + j * R * C .* w;
TF = num ./den;    % calcul de la fonction de transfert
gaindb = 20*log10(abs(TF));   % calcul du gain
phase = angle(TF);   % calcul de la phase
figure(1)     % création d'une figure
subplot(2,1,1);   % sous-figure 1
semilogx(w, gaindb);   % affichage du gain
grid on;  xlabel('Pulsation (rd/s)');  ylabel('Gain (dB)');
subplot(2,1,2);  % sous-figure 2
semilogx(w, phase);  % affichage de la phase
grid on; xlabel('Pulsation (rd/s)'); ylabel('Phase (rad)');

Cet exemple permet d’obtenir la figure suivante :

Plusieurs courbes sur un graphique

Il est possible de mettre autant de courbes que l’on souhaite sur le même graphique.

Pour cela, il suffit de demander l’affichage de plusieurs signaux à la fonction plot.

f1 = 12;
f2 = 18;
amp = 25;
ta = linspace(0,1,1001);
fa = amp * sin(2*pi*f1*ta);
fb = amp/2 * sin(2*pi*f2*ta);
figure;
plot(ta, fa, ta, fb);
legend('sinus à 12Hz','sinus à 18Hz')
xlabel('temps (s)')
ylabel('signal (V)')
title('Sinus en fonction du temps')

Tracer le diagramme de Bode de la fonction de transfert d’un système

Lorsque l’on connaît la fonction de transfert d’un système, c’est à dire la relation mathématique qui lie le signal d’entrée au signal de sortie en fonction de la fréquence du signal d’entrée, il est possible de tracer la réponse en fréquence de ce dernier.

Fonction de transfert

La fonction de transfert d’un système linéaire peut se mettre sous la forme d’un rapport de deux polynômes en \(p\) (transformée de Laplace) ou en \(j \omega\) (transformée de Fourier).

Chacun de ces polynômes dépend donc de la pulsation \(\omega\) (ou fréquence \(f = \frac{\omega}{2 \pi}\)). Il faut donc créer un vecteur permettant de stocker des valeurs de pulsation :

% vecteur des pulsations, variation log de 10^1 à 10^6 sur 101 points
w = logspace(1, 6, 101); 

Dans la suite de cet exemple, nous allons nous intéresser à un filtre passe-bas RC, dont la fonction de transfert est : \(H(j\omega) = \frac{1}{1 + j R C \omega}\).

Il est donc nécessaire de saisir les paramètres du modèle, ici R et C :

% paramètres du filtre RC
R = 1e4;
C = 1e-7;

On peut à présent définir les deux polynomes : numérateur (\(num\)) et dénominateur (\(den\)) ainsi que la fonction de transfert (\(TF\)) :

% fonction de transfert
num = 1;
den = 1 + j * R * C * w;
TF = num ./ den;

Diagramme de Bode – version manuelle

A partir de la fonction de transfert calculée précédemment, il est possible de calculer alors le gain en dB et la phase de cette fonction de transfert de la manière suivante :

% calcul du gain et de la phase
gain = 20*log10(abs(TF));
phase = angle(TF);

On peut alors tracer le diagramme de Bode dans deux sous-figures de la manière suivante :

subplot(2,1,1);
semilogx(w,gain);
xlabel('Frequence (Hz)');
ylabel('Gain (dB)');
grid on;
subplot(2,1,2);
semilogx(w,phase);
xlabel('Frequence (Hz)');
ylabel('Phase (radians)');
grid on;

On obtient alors une courbe de la forme suivante :

Il existe une autre méthode pour tracer un diagramme de Bode par l’utilisation de la fonction Bode, qui sera détaillé dans une autre page ultérieurement.

Calculer la FFT d’un signal

Un des calculs les plus utilisés dans le traitement du signal (électrique ou traitement d’image) est la transformée de Fourier discrète. L’un des algorithmes permettant d’obtenir ce résultat est la FFT (Fast Fourier Transform). Matlab permet de calculer le spectre d’un signal en utilisant la fonction fft.

Cette fonction retourne un vecteur de nombres complexes de la même taille que le vecteur du signal d’entrée dont on veut connaitre la transformée de Fourier. Les fréquences associées sont comprises entre 0 et Fe – où Fe est la fréquence d’échantillonnage utilisée pour acquérir (ou créer) le signal d’entrée.

Le script suivant génère deux signaux sinusoïdaux de N échantillons chacun sur une durée de visualisation TA (en s). Le premier a une fréquence f1 et l’autre f2. fa et fb sont les deux signaux numériques. La figure 1 affiche les deux signaux échantillonnées et la figure 2 les transformées de Fourier de deux signaux.

%% Signaux temporels et FFT
f1 = 12;
f2 = 18;
amp = 25;
N = 201;
TA = 1;
ta = linspace(0,TA,N);
tb = [0:TA/(N-1):TA];

fa = amp * sin(2*pi*f1*ta);
fb = amp/2 * sin(2*pi*f2*ta);

figure(1);
plot(ta, fa, ta, fb);
legend('sinus à 12Hz','sinus à 18Hz')
xlabel('temps (s)')
ylabel('signal (V)')
title('Sinus en fonction du temps')

%% calcul de la FFT
freqa = linspace(-N/(2*TA),N/(2*TA),N);
tfa = fft(fa);
tfa_s = fftshift(tfa)/N;
tfb = fft(fb);
tfb_s = fftshift(tfb)/N;
figure(2);
plot(freqa,abs(tfa_s),freqa,abs(tfb_s));
xlabel('Fréquence (Hz)')
ylabel('TF (V)')
legend('sinus 12Hz','sinus 18Hz')

Le script précédent permet d’obtenir les deux figures suivantes :

MATLAB / Quelques éléments de base