Vous êtes sur la page 1sur 4

 

Génération de signaux sous Matlab


navigation ->  Accueil  -  Page recherche  -  Page Matlab  <- navigation

Gilles Gonon

Les
constantes inhérentes à tout signal numérique
Opérations
sur les signaux
Sinus
pur et ajout de bruit
Multiplication
de 2 signaux
Transformée
de Fourier Discrète et rapide (FFT)
Visualisation
des signaux

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

Vous aimerez peut-être aussi