Génération de signaux sous Matlab
navigation ->  Accueil  -  Page recherche  -  Page Matlab  <- navigation

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.

\includegraphics{axesweb.eps}
Ainsi. les axes seront définis comme suit:

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 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 $ y = f(x)$. 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 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 
$\displaystyle 20 . \log_{10} ( \vert FFT($signal$\displaystyle )\vert )$
        % 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')
\includegraphics{figure.eps}




GONON Gilles 2001-10-02