Génération de signaux sous Matlab
|
Gilles Gonon
Les constantes inhérentes
à tout signal numérique
Un signal numérique est défini par un nombre d'échantillons
N
relevés à une fréquence d'échantillonnage
Fe.
Les signaux sont toujours captés de manière temporelle, mais
on s'intéresse souvent à leur allure fréquentielle.
Afin de rester cohérents avec les mesures, il est important de
respecter les grandeurs physiques impliquées dans le signal. Il
faut donc définir les axes temporels et fréquentiels relatifs
au signal. La figure ci-dessous présente un signal numérique
et les notations qui s'y rapportent.
Ainsi. les axes seront définis comme suit:
-
L'axe temporel est un vecteur de N points espacés de
.
Sous Matlab, la syntaxe est :
axe_temps = (1:N)/Fe;
L'axe fréquentiel est un vecteur de N points compris entre 0 et
.
La syntaxe est :
axe_freq = (0:N-1)*Fe/N;
Opérations sur les signaux
Sous Matlab les signaux doivent être stockés dans un vecteur
(ligne ou colonne suivant les préférences de l'utilisateur).
Les opérations sur les signaux se font comme des opérations
sur les matrices. C'est-à-dire
-
la définition d'un vecteur se fait à l'aide de ``:''.
Le pas par défaut est
,
mais on peut définir le pas en l'intercalant entre le début
et la fin du vecteur.
1:4 = [ 1 2 3 4 ];
pas = 0.5;
1:pas:4 = [ 1 1.5 2 2.5 3 3.5 4 ];
l'appel d'un élément d'un vecteur de
éléments se fait un notant le numéro de l'élément
entre parenthèse; Idem pour une matrice (
ligne,
colonne).
>> x = 10:-1:1
x = 10 9 8 7 6 5 4 3 2 1
>> x(4)
ans = 7
la somme de 2 vecteurs se fait terme à terme sur des vecteurs
de même longueurs. Il est possible de vérifier la taille
de vos vecteurs à l'aide de la commande length.
Le produit par une constante d'un vecteur multiplie tous les termes
par cette constante.
(1:N)*3 = 3:3:3*N;
Le produit de 2 vecteurs de même taille renvoie une erreur. On peut
par contre effectuer le produit d'un vecteur par un vecteur de même
taille que l'on transpose (commuter l'opération conduit soit à
un scalaire soit à une matrice)
Il est aussi possible d'effectuer le produit terme à terme
de deux vecteurs. L'opérateur est ``.*''.
(1:4).*(1:4) = [ 1 4 9 16 ];
Nous allons maintenant voir quelques exemples de signaux classiques.
Sinus pur et ajout de bruit
Les fonctions réalisant les fonctions mathématiques couramment
utilisées en traitement du signal sont données par help
elfun et help datafun.
Le modèle de bruit le plus couramment rencontré dans les
mesures est le bruit blanc Gaussien. Il est réalisé par la
commande randn, donnée dans l'aide du répertoire ``elmat'',
help
elmat.
Voici un exemple de génération d'un sinus auquel on ajoute
du bruit.
% Génération d'un sinus et ajout d'un bruit blanc Gaussien
fe = 8000; % Fréquence d'échantillonnage
N = 8192; % Nombre de points de la séquence
% Axe des temps
t = (1:N)/fe;
% Génération du sinus
f0 = 1200;
sinus = sin(2*pi*f0*t);
% Génération du bruit
sigma = 0.25; % variance du bruit
moy = 0; % moyenne
bruit = moy + sigma*randn(1,N);
signal = sinus + bruit; % les 2 vecteurs sont de même longueur
Multiplication de 2 signaux
Il est aussi fréquent d'avoir à multiplier 2 signaux entre
eux. C'est le cas par exemple lorsqu'on veut réaliser un signal
de modulation. L'exemple ci-dessous réalise la modulation d'un sinus
à 50 Hz par un sinus à 2000 Hz (la fréquence d'échantillonnage
reste la même).
% Génération d'un sinus de fréquence 50Hz modulé à 2000Hz
fe = 8000; % Fréquence d'échantillonnage
N = 8192; % Nombre de points de la séquence
% Axe des temps
t = (1:N)/fe;
% Génération du sinus
f0 = 50;
sinus = sin(2*pi*f0*t);
% Génération de la porteuse
fp = 2000;
% elle doit être de la même longueur que le signal
% a priori, on ne connait pas N.
t_porteuse = (1:length(sinus))/fe;
porteuse = cos(2*pi*fp*t_porteuse);
% on multiplie terme à terme les 2 signaux
signal = sinus .* porteuse; % les 2 vecteurs sont de même longueur
Transformée de Fourier
Discrète et rapide (FFT)
Afin d'obtenir le spectre des signaux, on leur applique une transformée
de Fourier, qui fournit une approximation du spectre du signal. L'algorithme
de FFT calcule la Transformée de Fourier Discrète des signaux
de manière rapide si les séquences de signaux sont de longueurs
une puissance de 2. Aussi on prendra soin de travailler sur des signaux
de longueurs des puissances de 2, c'est-à-dire 64, 128, 256,...,
8192, ...
Visualisation des signaux
Les signaux sont maintenant générés et on désire
observer les formes d'ondes et spectres de ces signaux. Cela est possible
via la commande plot qui permet de tracer un graphe du type
.
La syntaxe est alors plot(x,f(x)). C'est au niveau de la commande
plot que se décide la graduation des axes. Les principales commandes
relatives aux graphiques sont données dans help graph2d.
Notamment
-
clf, efface la figure en cours
-
figure créé une nouvelle figure. On peut rappeler
la première figure par figure(1).
-
subplot(N,M,n) permet de diviser une figure en NxM graphiques. Chaque
graphique est désigné par un numéro entre 1 et N.M
(de gauche à droite et de haut en bas). Voir exemple ci-dessous.
-
hold on permet de superposer plusieurs courbes sur le même
graphique. hold off annule cette commande et n'autorise qu'un seul
plot
par graphique.
-
D'autres commandes telles que xlabel, legend, title, ... permettent
de commenter les graphiques.
Pour reprendre l'exemple 2.1,
on veut tracer l'allure de la fonction et son spectre en dB. La conversion
en dB d'un spectre se fait par
signal
% Visualisation du sinus et du bruit
% Allure temporelle des signaux
figure(1);clf % créé ou sélectionne la figure 1 et l'efface
subplot(2,1,1) % sépare la figure en 2 graphiques et place dans le premier cadre
plot(axe_t,sinus,'b'); hold on; plot(axe_t,bruit,'r')
title('Allure temporelle du sinus et du bruit');
xlabel('temps (sec)'); legend('sinus','bruit')
subplot(2,1,2) % place le tracé dans le deuxième graphique
plot(axe_t,signal)
title('Allure temporelle du signal'); xlabel('temps (sec)')
% Allure fréquentielle du signal
tfsinus = fft(sinus);
tfsignal = fft(signal);
% conversion en dB du module
tfsinus_dB = 20 * log10(abs(tfsinus));
tfsignal_dB = 20 * log10(abs(tfsignal));
% Axe des fréquences
axe_f = (0:N-1)*Fe/N;
% On créé un 2ème fenêtre
figure(2); clf
plot(axe_f,tfsinus_dB,'b',axe_f,tfsignal_dB,'r')
title('Spectre des signaux') % Donne un titre au graphique
legend('sinus pur','sinus bruité') % Annote les courbes
xlabel('Fréquence (Hz)'); ylabel('dB') % Annote les axes
% On rassemble les graphiques dans la figure(3) avec une géométrie différente
figure(3); clf
subplot(2,2,1)
plot(axe_t,sinus,'k',axe_t,bruit,'k--')
title('Allure temporelle du sinus et du bruit');
xlabel('temps (sec)'); legend('sinus','bruit')
subplot(2,2,2)
plot(axe_t,signal,'k')
title('Allure temporelle du signal'); xlabel('temps (sec)')
subplot(2,1,2)
plot(axe_f,tfsinus_dB,'k',axe_f,tfsignal_dB,'k--')
title('Spectre des signaux'); legend('sinus pur','sinus bruité');
xlabel('Fréquence (Hz)'); ylabel('dB')
GONON Gilles 2001-10-02