Sie sind auf Seite 1von 37

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Introduction au traitement du signal avec Scilab

Sommaire
Sommaire 1. Installation 2. 3. 4. 5. Rgles pratiques Reprsentation dun signal sinusodal dans les domaines temporel et frquentiel. Reprsentation dun signal priodique quelconque

Modulation damplitude Modulation sans porteuse Modulation damplitude avec porteuse Modulation en bande latrale unique 6. Modulations angulaires Rappels thoriques Visualisation temporelle dun signal modul en phase Signal modul en frquence Observation spectrale Bibliographie Annexe 1 : premire approche Annexe 2 : laffichage Annexe 3 : la sauvegarde Sauvegarde du contexte Annexe 4 : la programmation Les boucles de programmation Les fonctions Annexe 5 : polynmes et fonctions de transfert Annexe 6 : fonctions de Bessel

Les outils logiciels sont devenus un lment indispensable en traitement du signal, que ce soit pour lapprentissage ou le dveloppement de systme, en particulier depuis lapparition des techniques numriques. Un signal numris peut tre en effet vu comme une suite de valeurs, cest dire un vecteur. Un vecteur nest quune matrice une ligne ou une colonne. Dans le cas de traitement dimages par exemple, les signaux tant deux dimensions, on arrive directement la notion de matrices. On pourrait trouver de nombreux exemples o le signal traiter prsente une dimension suprieure encore. Il tait donc naturel de se tourner vers des logiciels spcialiss en calcul matriciel, tel que Matlab (contraction de MAtrix LABoratory). Nous utiliserons pour notre part un logiciel quasiment similaire, Scilab (pour SCIentific LABoratoty), qui prsente lavantage par rapport au prcdent dtre libre et gratuit. Scilab est dvelopp par lINRIA Rocquencourt (78). On peut le tlcharger gratuitement avec sa documentation et de nombreuses applications, ladresse : http://www-rocq.inria.fr/scilab/ Ce logiciel est utilisable pour toute application ncessitant un calcul matriciel, de la finance la physique. Pour de nombreuses applications spcifiques telles que le traitement du signal, un ensemble de fonctions spcialises,

1 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

appel botes doutils (tools box) ont t mises au point. Une interface graphique pour la simulation dynamique, nomm SICOS (pour SCIlab Connected Object Simulator), lquivalent du Simulink de Matlab, est disponible avec Scilab. Au cours de cette prsentation, nous allons nous familiariser avec les fonctions de base de Scilab pour le traitement du signal. Certaines fonctions de base de Scilab resteront cependant peu explicites, on pourra alors se rfrer la documentation gnrale (en anglais) fournie avec le logiciel. De nombreux documents (en franais et anglais) sont disponibles sur Internet (taper scilab avec un moteur de recherche efficace, type Google par exemple), voir la bibliographie.

1. Installation
Scilab t dvelopp pour fonctionner sous Linux, mais fonctionne (presque) parfaitement avec windows. Nous utiliserons ici cette dernire option (mme si ce nest pas le choix le plus judicieux). Une fois Scilab tlcharg (cas de la version 2.6) ladresse http://www-rocq.inria.fr/scilab/, le dcompresser avec winzip, puis le lancer par un double clic sur le fichier runscilab dans le rpertoire scilab_2.6/bin (tous ces dtails sont donns dans un fichier texte associ). On crera ventuellement un raccourci sur le bureau.

2. Rgles pratiques
Avant toutes choses, il faut comprendre que Scilab est un langage interprt (comme le Basic) et non compil (comme le C ou le Pascal), ce qui prsente lavantage de ne pas avoir dclarer les variables, mais introduit une certaine lenteur (lobjectif nest pas en gnral de faire du temps rel). Les premiers programmes seront cris ligne par ligne directement dans lditeur de Scilab ; lorsquon a un peu lhabitude, il est cependant plus efficace dutiliser un diteur de texte annexe, comme le bloc note de Windows ou WordPad, puis de faire ensuite des copier coller (attention le ctrl V ne fonctionne pas dans Scilab, on fera donc clic droit puis paste ). On vitera dutiliser Word, moins de ne le configurer correctement (voir annexe 3) qui prend souvent des initiatives malheureuses (ajout de majuscules, de tabulation etc). Passons maintenant en revue quelques rgles pratiques : pour chaque fonction, une aide est disponible en tapant help Nom_de_la_fonction linvite. pour une fonction dont on ne connat pas le nom exact, on peut obtenir tous les noms rservs lis la fonction en tapant apropos Nom_de_la fonction , par exemple apropos filter . de mme la documentation complte en ligne est fournie avec le logiciel en cas derreur, il est inutile de rcrire les instructions, les flches du clavier permettant de se dplacer dans le jeu des instructions prcdemment entres ; les touches de raccourci Ctrl C et Ctrl V pour le copier coller ne fonctionnent pas sous Scilab ; utiliser le menu contextuel accessible par un clic droit dans la fentre. Scilab fait la diffrence entre majuscules et minuscules. bien que des boucles (for, while etc) soit utilisable, Scilab est optimis pour faire du calcul matriciel ; on prfrera donc un produit matriciel une boucle, afin de rduire le temps de calcul et lutilisation des ressources. les signaux et variables crs sous Scilab peuvent tre sauvegards avec la commande save et recharges avec load (voir les annexes pour la syntaxe exacte). il est fortement conseill de dfinir en dbut de programme toutes les constantes de manire littral, afin de pouvoir modifier simplement lune delle par la suite, si ncessaire. A la fin de ce document, on trouvera des annexes dtaillant des points particuliers (premire approche, affichage, sauvegarde etc). On sy rfrera pour obtenir plus de dtails.

3.

Reprsentation dun signal sinusodal dans les domaines temporel et frquentiel.

2 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Pour un systme numrique, tel quun ordinateur, il ne peut y avoir que des signaux discrets. On pourra cependant voir un signal discret comme un signal continu si le pas dchantillonnage (ou pas de calcul) est faible devant les autres grandeurs temporelles. La premire tape consiste donc dfinir ce pas de calcul, ainsi que la dure de laffichage (ou dure de calcul). On dfinit ainsi un vecteur temps, dont le nombre dlment est gal au nombre de points afficher, et dont lincrment, dun lment au suivant, est gal au pas de calcul. Il sagit dun vecteur ligne. Dans lexemple suivant, on affiche sur 16 points, par pas de 2ms, une sinusode damplitude 3 et de frquence 100 Hz. Entrer ces commandes (sans les commentaires).

// les commentaires sont prcds de deux barres // on peut utiliser indiffremment majuscules et minuscule, mais s nest pas S // la sparation de la partie entire dun nombre et des dcimales se fait par . et non , // clear nb_pts=16 // si on ne souhaite pas voir le rsultat safficher, placer un ; la fin de linstruction pas=2e-3 // t=pas*(0 :1 :nb_pts-1) // t est un vecteur ligne allant de 0 nb_pts par pas de 1, multipli par pas // lincrment tant par dfaut unitaire, il peut tre omis ici // // amp=3 ; f=100 ; s=amp*sin(2*%pi*f*t) // les constantes prdfinies (pi, j, e etc) sont prcdes de % //s est un vecteur ligne, de mme nombre de points que t // // initialisation des paramtres daffichage xbasc() ; xset("font size", 4); // affichage plot2d(t,s) // affichage de s en fonction du temps // commentaires divers xtitle ("signal en fonction du temps","temps", "amplitude");

Le programme prcdent nous permet d'afficher la sinusode en fonction du temps (voir premier graphe ci-aprs). Dans la mme fentre, on peut galement afficher la sinusode en fonction du rang de l'chantillon, en modifiant la partie affichage du programme comme suit (pour les dtails sur le fonctionnement de xsetech( ) voir l'annexe sur l'affichage) : // initialisation de laffichage xbasc(); xset("font size",4); // gestion du premier graphe dans la fentre, position (0,0), largeur 1, hauteur 1/2 xsetech([0, 0, 1,1/2]); // affichage plot2d(t,s) // commentaires divers xtitle ("signal en fonction du temps","temps", "amplitude"); // // gestion du second graphe dans la fentre, position (0,1/2), largeur 1, hauteur 1/2 xsetech([0, 1/2, 1,1/2]); // affichage plot2d(s) // commentaires divers

3 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

xtitle ("signal en fonction du rang des chantillons","rang des chantillons", "amplitude");

On peut noter la vue de ces courbes, quun vecteur peut tre reprsent en fonction dun autre ( s en fonction de t ), ou bien en fonction du rang de ses lments. Dans ce dernier cas, il est important de noter que lindice du premier lment est toujours 1 et non 0 . Lchantillonnage grossier de cette sinusode, nous a permis de voir safficher les valeurs des vecteurs t et s sans voir dfiler une suite importante de nombre. Affichons maintenant une sinusode, damplitude 5V crte, de frquence 100 Hz, sur 1000 points, avec une priode dchantillonnage de 0,1 ms (soit 100 points par priode et une frquence fe dchantillonnage de 10 kHz). clear // // dfinition des constantes, nombre de points, priode dchantillonnage et frquence du signal N=1000 ; Te=0.1e-3 ; F=100 ; // // description du vecteur temps et vecteur signal t=Te*(0:N-1);s=5*sin(2*%pi*F*t); // // affichage xbasc() ; xset(font size,5); plot2d(t,s); xtitle(,temps (s),amplitude (V))

4 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Nous allons maintenant afficher la transforme de Fourier de ce signal. Scilab effectue non pas le calcul de la transform de Fourier (calcul thorique analogique), mais, comme tout systme numrique, la transforme de Fourier discrte. Une tude dtaille de cette dernire sera lobjet dune prochaine sance. Pour linstant, contentons nous de quelques informations : la transformation de Fourier discrte dun signal s de N chantillons, se fait par la fonction fft(s,-1) (o 1 reprsente le signe de lexposant de lexponentielle dans lexpression thorique, la transforme inverse se faisant donc avec 1 comme paramtre), cette fonction renvoie un vecteur de mme dimension N que s , les lments de ce vecteur sont des nombres complexes, on pourra alors ventuellement utiliser la fonction abs pour nen garder que le module, le premier lment (indice 1) correspond la frquence nulle, le dernier (indice N) la frquence dchantillonnage fe diminue dun pas fe/N, une telle transformation est priodique de priode fe (le signal temporel tant chantillonn).

Dans les cas relativement simples que nous allons tudier (signaux priodiques), pour passer de la transformation de Fourier discrte la transformation de Fourier (au sens analogique), il faudra tenir compte des remarques suivantes : les signaux que nous tudions pour linstant tant senss tre des signaux temps continu, le spectre na de sens que de fe/2 fe/2, les signaux tudis tant rels, on pourra limiter ltude du module (qui est pair) de la transforme de 0 fe/2 ? si on souhaite galement tudier la partie imaginaire (impaire pour un signal rel) de la transforme, il faudra considrer la bande de fe/2 fe, qui correspond la bande de fe/2 0 du spectre thorique, pour se ramener aux amplitudes attendues pour un signal temps continu, il faut diviser le rsultat donn par la fonction fft par le nombre dchantillons N. A la suite du programme prcdent, on peut donc crire pour obtenir la transforme de Fourier : // dfinition d'une variable frquence pour l'affichage // le premier point correspond au continu // le dernier la frquence d'chantillonnage au pas prs f=1/(N*Te)*( 0 : N-1) ; // // calcul de la transformation sf=fft(s,-1) ; //

5 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// initialisation de l'affichage xbasc(); xset("font size",4); // // affichage du module brut de forme xsetech([0,0,1,1/3]) ; plot2d(abs(sf)) ; xtitle("module brut de la fft en fonction des indices","rang des indices","amplitude" ); // // affichage du module corrig de 0 fe/2 xsetech([0,1/3,1,1/3]) ; plot2d(f(1:N/2), 1/N*abs(sf(1:N/2))) ; xtitle("module corrig en fonction de la frquence de 0 fe/2","frquence (Hz)","amplitude (Vs)"); // // zoom sur la raie, de la frquence nulle fe/5 xsetech([0,2/3,1,1/3]) ; plot2d(f(1:N/20),1/N*abs(sf(1: N/20))) ; xtitle("module corrig et zoom","frquence (Hz)","amplitude (Vs)"); Pour dfinir la variable frquentielle f qui nest indispensable que si on souhaite soigner laffichage, il ne faut pas perdre de vue que la valeur f(0) (dindice 1 ) correspondra au continu, et la valeur f(N-1) (dindice N) correspondra fe-fe/N. Lexpression de f vient alors delle-mme. Le premier affichage met en vidence la priodicit du spectre, ainsi que le problme des amplitudes. Avec le second affichage, on corrige le problme damplitude en divisant par N le module. Lamplitude est alors celle attendue, 2,5 Vs pour le spectre bilatral dun signal sinusodal de 5 V crte. On limite la bande de frquence de 0 fe/2 en ne prenant que les lments dindices 1 N/2 des deux vecteurs f et sf (voir annexe sur laffichage). Avec le troisime affichage, par la mme mthode, on effectue un zoom sur les 20 premiers chantillons (soit du continu fe/5). On peut remarquer que la raie saffiche comme un triangle, ce qui est du au choix du mode daffichage. Pour obtenir une raie seule, on pouvait choisir la fonction plot2d3 (voir annexe sur laffichage). On peut noter que la raie se trouve sur llment de rang 11 de sf en tapant : abs(sf(10)) ce qui renvoie la valeur 2500 (ce qui donne 2,5 une fois divis par N) ; cette valeur correspond bien 100 Hz puisque lindice 1 correspond la frquence 0 et lindice N fe-fe/N ; lindice x correspond donc (x-1)fe/N.

Remarque importante : lamplitude est exactement celle prvue. Ceci est d au choix dune frquence afficher

6 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

multiple de fe/N. Ces diffrents problmes seront tudis ultrieurement. Quelques amliorations concernant la prsentation sont proposes en annexe 4. Rappeler les spectres (parties relle et imaginaire) des signaux suivant : s1=sinwt s2=coswt s3=sin(wt+p/4) s4=e Nous allons adopter maintenant une dmarche inverse de la prcdente : retrouver le signal temporel partir de sa transforme de Fourier. En gardant les mmes nombre de points, frquence dchantillonnage et frquence du signal, gnrer dans Scilab les spectres de ces diffrents signaux. On placera pour cela bout bout des 1 et des 0 aux bons endroits en saidant de linstruction zeros(x,y) qui gnre une matrice de 0 de x lignes et y colonnes. Attention au signal s4 qui nest pas rel et ne vrifie donc pas les proprits de symtrie paire du module et impaire de la phase. Vrifier par affichage avec les instructions correspondantes la forme des modules abs(S)-, partie relle real(S)et partie imaginaire imag(S)-. Faire la transformation inverse et afficher le signal temporel pour en vrifier la forme. On notera en particulier pour le signal exponentiel que les parties relle et imaginaire sont sinusodales, tandis que le module est constant. Remarque : pour un signal complexe, sans autre prcision, les fonctions daffichages affichent la partie relle.
jwt

4. Reprsentation dun signal priodique quelconque


En vous inspirant du programme ci-aprs, crire un programme permettant de visualiser un signal carr, puis un signal triangulaire sur quelques priodes. Effectuer lanalyse frquentielle et vrifier quelle est bien conforme aux rsultats attendus. Pour gnrer le signal carr, on dcrit dabord un symbole +/-5 V par exemple, laide de linstruction ones(x, y) qui produit une matrice de 1 sur x lignes et y colonnes. On reproduit ensuite Nsymb fois ce symbole en multipliant sa forme transpose (matrice colonne) par une matrice de 1 de une ligne et Nsymb colonnes. Le rsultat, une matrice de Nech_symb colonnes sur Nsymb lignes, est remis sous forme de vecteur ligne par linstruction matrix (voir annexe). clear // dfinition des constantes : nombre d'chantillons par symbole, nombre de priodes // nombre total de points, frquence d'chantillonnage Nech_symb=10 ; Nsymb=12 ; N=Nech_symb*Nsymb ; Fe=1e3 ; // // variable temps t=1/Fe*[0:N-1]; // // criture d'un symbole +/- 5 symb=5*[ ones(1, Nech_symb/2), -1*ones(1, Nech_symb/2)]; // // rption du symbole pour constituer le signal S=matrix(symb' *ones(1, Nsymb), 1 , N); // // affichage xbasc(); xset ("font size", 4); plot2d2(t,S, rect=[0, -6, .12, 6]) , xtitle("signal carr", "temps (s)", "amplitude");

5. Modulation damplitude
Nous avons vu au chapitre prcdent la manire de dcrire une sinusode et dobtenir son spectre. Appliquons maintenant ces notions sur des signaux un peu plus complexes.

Modulation sans porteuse


On souhaite moduler en amplitude avec porteuse supprime, un signal de 5 V crte 50 kHz, par un signal informatif

7 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

de 2 V crte 4 kHz. Rappeler le spectre du signal obtenu modul. On se propose dcrire un programme avec des calculs sur 500 points pour une frquence dchantillonnage de 500 kHz. Pour raliser lopration de modulation, on utilise en lectronique un multiplieur qui effectue chaque instant le produit des deux signaux ses entres. Pour raliser la mme chose avec Scilab, o on ne dispose pas de deux signaux, mais de deux vecteurs ligne pour les signaux informatif et porteur, il faudra gnrer un vecteur ligne correspondant au signal modul, dont chaque lment est le produit des deux lments de mme position sur les vecteurs de signaux informatif et porteur. Il ne sagit donc pas dun produit matriciel classique, mais dun produit terme terme , symbolis par .* dans le logiciel. Le programme ci-aprs permet laffichage de lvolution temporelle et spectrale du signal modul. clear // dfinition des constantes N=500 ; fe=500e3 ; fp=50e3 ; finf=4e3; // // description des vecteurs temps, frquence (pour laffichage de la fft) et signal t=(0:N-1)/fe ; f=(0:N-1)/N*fe ; sinf=2*sin(2*%pi*finf*t); spor=5*sin(2*%pi*fp*t); smod=spor.*sinf; // // initialisation de l'affichage xbasc() ; xset( "font size", 4); // // affichage du signal informatif xsetech([0,0,1,1/3]) ; plot2d(t,sinf) ; xtitle("signal informatif","temps (s)","amplitude (V)"); // // affichage du signal porteur xsetech([0,1/3,1,1/3]) ; plot2d(t,spor) ; xtitle("signal porteur","temps (s)","amplitude (V)"); // // affichage du signal modul xsetech([0,2/3,1,1/3]) ; plot2d(t, smod) ; xtitle("signal modul","temps (s)", "amplitude (V)");

8 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Le spectre des signaux peut tre obtenu par le programme suivant :

// calcul des modules des fft Sinf=1/N*abs(fft(sinf,-1)) ; Spor=1/N*abs(fft(spor,-1)) ; Smod=1/N*abs(fft(smod,-1)) ; // // initialisation de l'affichage xbasc() ; xset( "font size", 4); // // // // affichage du signal informatif xsetech([0,0,1,1/3]) ; plot2d3(f(1: .12*N),Sinf(1: .12*N), rect=[0, 0, 6e4, 3]) ; xtitle("spectre du signal informatif","frquence (Hz)","amplitude (Vs)"); // // // // affichage du signal porteur xsetech([0,1/3,1,1/3]) ; plot2d3(f(1: .12*N),Spor(1: .12*N), rect=[0, 0, 6e4, 3]) ; xtitle("spectre du signal porteur","frquence (Hz)","amplitude (Vs)"); // // affichage du signal modul xsetech([0,2/3,1,1/3]) ; plot2d3(f(1: .12*N),Smod(1: .12*N), rect=[0, 0, 6e4, 3]) ; xtitle("spectre du signal modul","frquence (Hz)","amplitude (Vs)"); Laffichage a t ralis avec la fonction plot2d3 qui permet dafficher des raies, tandis que linstruction rect permet davoir les mmes chelles damplitude pour les trois signaux.

9 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Remplacer maintenant le signal informatif par une somme de 3 sinusodes damplitudes et frquences respectives (1V, 4kHz), (2V, 2kHz), et (1,5V, 5kHz). Visualiser les signaux informatifs et moduls, ainsi que le spectre des signaux moduls

clear ; // dfinition des constantes N=500 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=2e3; finf3=5e3; // // description des vecteurs temps, frquence (pour laffichage de la fft) et signal t=(0:N-1)/fe ; f=(0:N-1)/N*fe ; // // // sinf=2*sin(2*%pi*finf2*t)+1*sin(2*%pi*finf1*t)+1.5*sin(2*%pi*finf3*t); spor=5*sin(2*%pi*50e3*t); smod=spor.*sinf; // // initialisation de l'affichage xbasc() ; xset( "font size", 4); // // affichage du signal informatif xsetech([0,0,1,1/2]) ; plot2d(t,sinf) ; xtitle("signal informatif","temps (s)","amplitude (V)"); // // affichage du signal modul xsetech([0,1/2,1,1/2]) ; plot2d(t, smod) ; xtitle("signal modul","temps (s)", "amplitude (V)");

10 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// calcul des modules des fft Smod=1/N*abs(fft(smod,-1)); Sinf=1/N*abs(fft(sinf,-1)); // // initialisation de l'affichage xbasc() ; xset( "font size", 4); // affichage du signal informatif xsetech([0,0,1,1/2]) ; plot2d3(f(1: .12*N),Sinf(1: .12*N), rect=[0, 0, 6e4, 1.5]) ; xtitle("spectre du signal informatif","frquence (Hz)","amplitude (Vs)"); // // affichage du signal modul xsetech([0,1/2,1,1/2]) ; plot2d3(f(1: .12*N),Smod(1: .12*N)) ; xtitle("spectre du signal modul","frquence (Hz)","amplitude (Vs)");

11 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Afin de se familiariser avec les produits matriciels, on tudiera le programme ci-aprs, permettant de gnrer la somme des trois sinusodes pour le signal informatif.

clear // dfinition des constantes N=500 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=10e3; finf3=15e3; // // description du vecteur temps t=(0:N-1)/fe ; // // les frquences en vecteur colonne frequence=[4e3; 10e3; 15e3]; // // les amplitudes en vecteur ligne amplitude=[1, 2, 1.5] ; // // calcul du signal modul sinf_2=amplitude*sin(2*%pi*frequence*t); // //affichage xbasc(); plot2d(t,sinf)

Modulation damplitude avec porteuse


Proposer un programme permettant dillustrer les proprits temporelles et spectrales de la modulation damplitude avec porteuse. Lindice de modulation devra tre facilement modifiable. Pour gnrer un signal continu, on pourra utiliser la fonction ones() (voir annexe 1).

Modulation en bande latrale unique


Pour obtenir notre signal modul en BLU, nous allons utiliser dans un premier temps la mthode classique qui consiste supprimer par filtrage, une des bandes du signal modul en double bande. Cette mthode est en gnrale trs difficile mettre en uvre dans un cas rel (pente du filtre ncessaire trop raide), mais notre but est ici simplement dillustrer certaines fonctionnalits de Scilab. Dans une seconde approche, nous nous contenterons dafficher le signal partir des quations donnes par la

12 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

thorie. Le programme suivant, partir d'un signal informatif compos de trois sinusodes, va dans un premier temps calculer le signal double bande smod comme nous l'avons fait jusqu' prsent. On dtermine ensuite la fonction de transfert du filtre l'aide de l'instruction analpf qui calcule un filtre passe bas analogique en fonction des arguments fournis, savoir lordre (ici 8), le type de filtre (ici un Chebycheff), londulation dans la bande passante ( ici 0,1, le second paramtre tant sans importance pour le type de filtre choisi), ainsi que la frquence de coupure. Attention, londulation nest pas exprime en dB (0.1 correspond 0.9 dB dondulation). Cette instruction nous renvoie en particulier (avec les notations du programme), la fonction de transfert G en variable de Laplace, le numrateur G(2) de cette fonction de transfert, et le dnominateur G(3). A laide de la fonction freq on peut alors obtenir la valeur complexe pour tous les points dsirs (dans le domaine frquentiel), en prcisant numrateur, dnominateur, ainsi que la variable (ici le vecteur f multipli par 2pj) pour laquelle le calcul doit tre fait. On trouvera plus dinformation sur la manipulation des fonctions de transfert en annexe 4. Pour effectuer le filtrage, on calcule la transforme de Fourier (opration fft(x,-1) ) du signal double bande, quon multiplie par le gain complexe du filtre. Nous affichons alors les signaux dans lespace frquentiel en zoomant de 0 fe/5 le signal et en effectuant la correction du nombre dchantillons. Le retour dans le domaine temporel, qui prsente une petite subtilit, sera vu par la suite. clear // dfinition des constantes N=5000 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=3e3; finf3=5e3; // // description des vecteurs temps, frquence (pour laffichage de la fft) et signal t=(0:N-1)/fe ; f=(0:N-1)/N*fe ; // // dfinition des diffrents signaux informatif, porteur et double bande sinf=2*sin(2*%pi*finf2*t)+1*sin(2*%pi*finf1*t)+1.5*sin(2*%pi*finf3*t); spor=5*sin(2*%pi*50e3*t); smod=spor.*sinf; // // calcul de la fonction de transfert du filtre et des valeurs de cette fonction sur la gamme de frquence G=analpf(8,'cheb1',[.1 0],2*%pi*(fp-finf2)); gain=freq( G(2), G(3), %i*2*%pi*f); // // filtrage par multiplication dans le domaine frquentiel Smod=fft(smod,-1); Sblu=Smod.*gain; // //affichage dans le domaine spectral xbasc() ; xset( "font size", 4); // xsetech([0,0,1,1/3]) ; plot2d(f(1:N/5),1/N*abs(Smod(1:N/5))) ; xtitle("signal double bande","frquence (Hz)","amplitude (Vs)"); // xsetech([0,1/3,1,1/3]) ; plot2d(f(1:N/5), abs(gain(1:N/5))) ; xtitle("filtre en chelles linaires","frquence (Hz)","gain"); // // xsetech([0,2/3,1,1/3]) ; plot2d(f(1:N/5), 1/N*abs(Sblu(1:N/5))) ; xtitle("signal blu","frquence (Hz)","amplitude (Vs)"); Laffichage est dabord effectu dans le domaine spectral.

13 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

On peut afficher la mme chose, mais avec les chelles semi-logarithmiques classiques. On notera lutilisation de linstruction logflag ( voir annexe sur laffichage ou laide en ligne sur plot2d ) et la suppression de lindice 1 du vecteur frquence, indice qui valait 0 et dont le logarithme est indfini. Afin de simplifier lcriture des instructions daffichage, tous les paramtres ont t dcrits avant. // dfinition des paramtres d'affichage de 10 kHz 100 kHz Nmin=N/50 ; Nmax=N/5; f_aff=f(Nmin:Nmax); // Smod_dB=20*log10(1/N*abs(Smod(Nmin:Nmax))); gain_dB=20*log10( abs(gain(Nmin:Nmax))); Sblu_dB= 20*log10(1/N*abs(Sblu(Nmin:Nmax))); // // affichage en dB xbasc(); xset( "font size", 4); // xsetech([0,0,1,1/3]) ; plot2d(f_aff ,Smod_dB, logflag=["ln"] , rect=[1e4, -320, 1e5, 20] ) ; xtitle("signal double bande","frquence (Hz)","amplitude (dB)"); // xsetech([0,1/3,1,1/3]) ; plot2d(f_aff, gain_dB , logflag=["ln"] , rect=[1e4, -90, 1e5, 10] ) ; xtitle("filtre","frquence (Hz)","gain (dB)"); // xsetech([0,2/3,1,1/3]) ; plot2d(f_aff, Sblu_dB, logflag=["ln"] , rect=[1e4, -380, 1e5, 20] ) ; xtitle("signal blu","frquence (Hz)","amplitude (dB)");

14 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Afin de voir lattnuation subie par la bande suprieure du signal BLU, on pourra utiliser le 2DZoom de la fentre daffichage. On note alors une attnuation denviron 25 dB de cette bande. Les valeurs exactes peuvent tre obtenues en tapant 20*log10(abs((Sblu(x)/Sblu(y))) avec le couple (x,y) valant respectivement (daprs ce que nous avons vu sur laffichage de la fonction fft ) les valeurs (531, 471), (541, 461), (551, 451) correspondants aux diffrentes raies ; les attnuation sont alors de 21,5 dB, 25,1 dB et 27,2 dB. Le retour dans le domaine temporel de Sblu se fait avec lopration sblu=fft(Sblu,1) . Le signal frquentiel doit cependant subir auparavant une modification. Nous avons vu en effet que la fonction transformation de Fourier discrte dans Scilab (et en gnral) donnait un signal priodique, de priode fe, qui tait reprsent sur linterval 0 fe par le logiciel. On sait dautre part (revoir lexercice sur la transforme des signaux sinusodaux), que pour des signaux temporels rels, le module et la partie relle de la transforme sont pairs, tandis que la phase et la partie imaginaire sont impaires. Cette proprit introduit comme nous lavons vu une symtrie par rapport fe/2. En consquence, le filtrage effectu pour Sbu na de sens que de 0 fe/2, le gain du filtre nayant pas t dfinit en respectant les symtries prcdentes, ce qui ntait pas gnant pour ce que nous avions afficher dans le domaine spectral. Par contre pour calculer le signal sbu dans le domaine temporel, nous devons reconstituer la symtrie de Sblu en ne gardant dans un premier temps que la moiti des chantillons. Cette partie du spectre de 0 (fe/2-fe/N) correspond aux chantillons de 0 N/2. Elle sera juxtapose cette mme moiti dont lordre des lments sera invers (retournement du spectre pour obtenir la symtrie), tous les lments tant conjugus (partie imaginaire impaire). On obtient ainsi la partie fe/2 (fe-fe/N) correspondant aux lments de (N/2 + 1) 2 (lindice 1 correspond au continu dun ct et fe de lautre). Cette opration se fait par conj(Sblu(N/2+1 :-1 :2). On calcule ensuite la transforme de Fourier inverse. On peut maintenant afficher dans le domaine temporel, en rduisant le nombre de point afin de faire un effet zoom, ce nombre de point ayant t choisi important de manire obtenir une meilleure rsolution frquentielle (ce dtail sera abord ultrieurement).

// // retour dans l'espace temporel Sblu=Sblu(1:N/2+1); Sblu=[Sblu(1 :N/2), conj(Sblu(N/2+1 : -1 : 2))]; sblu=fft(Sblu,1);

15 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// // affichage dans le domaine temporel xbasc() ; xset( "font size", 4); xsetech([0,0,1,1/3]) ; plot2d(t (1:N/5) ,sinf(1:N/5) ) ; xtitle("signal informatif","temps (s)","amplitude (V)"); // xsetech([0,1/3,1,1/3]) ; plot2d(t(1:N/5) ,smod(1:N/5) ) ; xtitle("signal double bande","temps (s)", "amplitude (V)"); // xsetech([0,2/3,1,1/3]) ; plot2d(t(1:N/5) ,sblu(1:N/5) ) ; xtitle("signal blu","temps (s)", "amplitude (V)");

Remarques : un signal modul en BLU donne un autre signal sinusodal, sa reprsentation est donc de peu dintrt, on pouvait saffranchir du passage dans le domaine frquentiel en effectuant un produit de convolution entre le signal double bande et la rponse impulsionnelle du filtre (cest dire la transforme de Fourier inverse de sa fonction de transfert). Cette approche sera vue ultrieurement. le signal temporel sblu peut tre calcul plus simplement en faisant la transforme de Fourier inverse du produit Smod par le gain du filtre. Le spectre correspondant est celui dune somme dexponentielles complexes (les raies dans la bande suprieure fe/2 sont trs ngligeables). En prenant alors la partie relle ou imaginaire de la transforme inverse on obtient la somme des sinusodes un terme de phase prs (la partie relle de e est cosx et la partie imaginaire sinx). On pouvait galement gnrer directement, pour cet exemple trs simple le signal modul ; le programme ci-aprs synthtise les signaux de la bande infrieure et de la bande suprieure. Malgr une apparente similitude, la diffrence entre les deux signaux moduls est trs importante comme le montre le troisime chronogramme. // dfinition des constantes N=5000 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=3e3; finf3=5e3; // // description du vecteur temps t=(0:N-1)/fe ; // // dfinition des diffrents signaux informatif, modul bande suprieure et infrieure s_inf=2*sin(2*%pi*(finf2)*t)+1*sin(2*%pi*(finf1)*t)+1.5*sin(2*%pi*(finf3)*t); sblu_inf=5*cos(2*%pi*(fp-finf2)*t)+2.5*cos(2*%pi*(fp-finf1)*t)+3.75*cos(2*%pi*(fp-finf3)*t);
jx

16 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

sblu_sup=-5*cos(2*%pi*(fp+finf2)*t)-2.5*cos(2*%pi*(fp+finf1)*t)-3.75*cos(2*%pi*(fp+finf3)*t); s_dif=sblu_sup-sblu_inf; // xbasc() ; xset( "font size", 4); xsetech([0,0,1,1/4]) ; plot2d(t (1:N/5) ,s_inf(1:N/5) ) ; xtitle("signal informatif","temps (s)","amplitude (V)"); // xsetech([0,1/4,1,1/4]) ; plot2d(t(1:N/5) ,sblu_inf(1:N/5) ) ; xtitle("signal blu bande infrieure","temps (s)", "amplitude (V)"); // xsetech([0,2/4,1,1/4]) ; plot2d(t(1:N/5) ,sblu_sup(1:N/5) ) ; xtitle("signal blu bande suprieure","temps (s)", "amplitude (V)"); // xsetech([0,3/4,1,1/4]) ; plot2d(t(1:N/5) ,s_dif(1:N/5) ) ; xtitle("diffrence des prcdents","temps (s)", "amplitude (V)");

Malgr une grande ressemblance, il ne faudra pas chercher comparer la courbe thorique sblu_inf est la courbe obtenue par filtrage sblu . Le filtre introduit en effet un dphasage trs important dans la bande utile. Reprendre cet exemple de signal blu depuis le dbut en introduisant cette fois un filtrage idal : on supprimera pour cela la partie du spectre Smod correspondant des frquences suprieures 50 kHz en les remplaant par une matrice ligne de zros. Calculer ensuite le signal temporel sblu par transforme inverse et le comparer avec sblu_inf en affichant la diffrence des deux.

6. Modulations angulaires
Rappels thoriques
Lexpression ci-aprs rappelle lquation dun signal modul en frquence : La frquence instantane vaut alors : tandis que la phase instantane vaut :

17 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Lindice de modulation d est dfini comme lcart de phase Dj autour de la phase 2pF t de la porteuse.
0

Dans le cas dun signal modulant sinusodal, soit m(t)=U sin(2p f t), lintgration due au passage de la frquence
i i

la phase du signal, nous amne lexpression :

Comme on peut le constater, lindice de modulation dpend de lamplitude et de la frquence du signal informatif. Lorsque plusieurs frquences sont mises en jeu, on prend la plus leve pour dfinir cet indice (qui sera alors dautant plus faible). Lexpression dun signal modul en phase est la suivante : La frquence instantane a pour expression :

tandis que la phase instantane vaut : Lindice de modulation, toujours dfini comme lcart de phase autour de la phase de la porteuse, a pour expression dans le cas du signal informatif sinusodal prcdent : Ce bref rappel permet de mettre en vidence que pour faire une modulation de phase avec un modulateur de frquence, il suffit de driver dabord le signal informatif. De mme, pour faire une modulation de phase avec un modulateur de frquence, il faut dabord intgrer le signal modulant.

Visualisation temporelle dun signal modul en phase


La modulation de phase est un peu plus simple mettre en place avec Scilab que la modulation de frquence, nous commencerons donc par elle. La mise en uvre dcoule presque directement de lexpression thorique comme le montre le programme suivant, o la porteuse a une frquence de 50 kHz et le signal informatif sinusodal de 5 kHz pour un chantillonnage 1 MHz. clear // dfinition des constantes N=400 ; fe=1e6 ; fp=50e3 ; finf=5e3; ind=5; // // description des vecteurs temps et signal t=(0:N-1)/fe ; // // sinf=1*sin(2*%pi*finf*t); smod= 1*sin(2*%pi*fp*t + ind*sinf); // // initialisation de l'affichage xbasc() ; xset( "font size", 4); // // affichage du signal informatif xsetech([0,0,1,1/2]) ; plot2d(t,sinf) ; xtitle("signal informatif","temps (s)","amplitude (V)"); // // affichage du signal modul xsetech([0,1/2,1,1/2]) ; plot2d(t, smod) ; xtitle("signal modul en phase","temps (s)", "amplitude");

18 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Comme on peut lobserver sur ces courbes (et le dduire de la thorie), la frquence est maximale lorsque la drive du signal informatif est maximale (cest dire aux passages par zro par front montant du signal). Le signal modul ne subit pas de discontinuit de phase, comme nous sommes souvent habitues le voir dans les applications. Ceci est du la nature sinusodale du signal modulant, les exemples tant plutt donns pour des signaux modulants numriques. Cependant, une modulation de frquence dun signal analogique est souvent une modulation de phase galement. En effet comme nous lavons vu, lindice de modulation, en modulation de frquence diminue avec la frquence du signal modulant ; il en va de mme de limmunit au bruit. Pour compenser, on fait alors subir une pr-accentuation frquentielle avec une pente du premier ordre, partir dune certaine frquence (2,1 kHz par exemple en radiodiffusion FM) au signal modulant ; ce qui revient le driver partir de cette frquence. La modulation est donc de phase pour les hautes frquences, et de frquence pour les basses. Proposer un programme permettant dillustrer la modulation de phase pour un signal numrique (Modulation Dplacement de Phase MDP- ou encore PSK pour Phase Shift Keying). Deux phases seront possibles (0 ou p) selon que le bit est 1 ou 0. On choisira donc en consquence le rapport entre le dbit dinformation numrique et la frquence porteuse. Pour raliser le signal modulant numrique, on pourra utiliser une technique assez similaire celle utilis pour la reprsentation dun signal carr ( la diffrence prs que cette fois le signal nest pas priodique). A partir dune suite s_simb de symboles 1 et 0, tablir le signal proprement dit, s_nrz , en surchantillonnant le signal dorigine. Pour cela, on effectuera la multiplication par le vecteur s_simb, dune matrice colonne de 1 dont le nombre de ligne est gal au coefficient de surchantillonnage. Le rsultat est ensuite mis sous forme de matrice ligne par la fonction matrix (consulter laide en ligne ou les annexes pour plus dinformation sur les diffrentes fonctions). Le programme ci-aprs donne lexemple dun signal de 8 symboles alatoires, surchantillonns dun facteur 16. clear // constante de surchantillage N=16; // vecteur de symboles s_symb=[1 0 1 1 0 0 1 0]; // vecteur temps t=(0 : 8*N-1); // signal modulant

19 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

s_nrz=matrix(ones(N,1)*s_symb, 1, 8*N); xbasc(); plot2d(t,s_nrz, rect=[0,-0.5,8*N,1.5]);

Signal modul en frquence


La description dune modulation de frquence est un peu plus complexe sous Scilab. En effet, comme on peut le constater dans lexpression thorique, le signal modulant agit directement sur la frquence, tandis que pour calculer le sinus nous avons besoins de la phase. Il va donc falloir intgrer (numriquement) la frquence pour avoir la phase. Une premire mthode retenue consiste dfinir un vecteur ligne contenant les valeurs de la frquence chaque instant, et de calculer le vecteur phase dans lequel llment de rang i est la somme de tous les lments de rang 1 i+1 du vecteur frquence, le tout pondr par 2p et par le pas dchantillonnage. Pour cela on met en place une boucle dintgration.

Le programme suivant illustre ce principe pour un signal sinusodal, en calculant la sinusode par la mthode classique et par celle dcrite plus haut. clear // // dfinition des constantes et du temps N=1000 ; fe=1e6 ;f0=1e3; t=1/fe*(0:N-1); // // dfinition du vecteur frquence fp=f0*ones(1,N); // // dfinition de la phase (vecteur colonne) for i=1:N, theta(i)=2*%pi/fe*sum(fp(1:i)); end; // // calcul du sinus par les deux mthodes // s1=sin(theta'); s2=sin(2*%pi*f0*t); // // affichage xbasc(); xsetech([0,0,1,1/2]) ; plot2d(t,s1) ; xtitle("mthode de la phase","temps (s)","amplitude (V)"); xsetech([0,1/2,1,1/2]) ; plot2d(t,s2) ; xtitle("mthode classique","temps (s)","amplitude (V)"); Comme on le constatera lors de l'essais, le temps de calcul est assez long (fonction de l'ordinateur utilis), Scilab tant en effet comme on l'a prcis au dbut, optimiser pour le calcul matriciel et non pour les boucles de programmation. Aussi prfrera t-on utiliser la seconde mthode. Celle-ci consiste gnrer le vecteur thta en multipliant le vecteur frquence fp par une matrice carre de dimension N, compose de 1 sur la diagonale et au-dessus de celle-ci, et de 0 ailleurs. Pour crer cette matrice, on gnre dabord une matrice de 1 laide de linstruction ones puis on ne garde que la partie suprieure au moyen de linstruction triu (voir aide ou annexe 1). La taille de la matrice tant importante, il faut augmenter la mmoire disponible alloue Scilab une valeur suprieure celle par dfaut, au moyen de linstruction stacksize . clear // // augmentation de la taille de la mmoire alloue Scilab stacksize(1.5e6); // // dfinition des constantes et du temps N=1000 ; fe=1e6 ;f0=1e3; t=1/fe*(0:N-1);

20 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// // dfinition du vecteur frquence fp=f0*ones(1,N); // // dfinition du vecteur phase theta=2*%pi/fe*fp*triu(ones(N, N)); // // calcul du sinus par les deux mthodes s1=sin(theta); s2=sin(2*%pi*f0*t); // // affichage xbasc(); xsetech([0,0,1,1/2]) ; plot2d(t,s1) ; xtitle("mthode de la phase","temps (s)","amplitude (V)"); xsetech([0,1/2,1,1/2]) ; plot2d(t,s2) ; xtitle("mthode classique","temps (s)","amplitude (V)"); Le programme suivant permet dafficher un signal modul en frquence par une tension sinusodale. La porteuse une frquence de 50 kHz, le signal informatif une frquence de 4 kHz et une amplitude de 2 V, lindice de modulation des de 7 (afin de visualiser correctement les variations de frquence). La frquence instantane est un vecteur une ligne pour N colonnes, dont tous les lments valent la frquence porteuse, vecteur auquel on ajoute le vecteur correspondant au signal informatif, pondr par le coefficient de modulation, qui dpend comme nous lavons vu, de lindice de modulation, de la frquence et de lamplitude du signal informatif. On intgre ensuite cette frquence pour obtenir la phase, puis le signal modul est calcul partir de cette phase. Comme on sen apercevra au droulement du programme, les instructions de boucle sont lentes excuter, et on leur prfrera lorsque cest possible, des calculs matriciels, pour lesquels Scilab est optimis. clear; stacksize(1.5e6); // // dfinition des constantes et du temps N=500 ; fe=1e6 ; fp=50e3 ; Finf=4e3; Uinf=2; t=1/fe*(0:N-1); ind=7; // // dfinition du signal informatif sinf=Uinf*sin(2*%pi*Finf*t); // // dfinition du vecteur frquence f_inst=fp*ones(1,N)+ ind* Finf /Uinf*sinf; // // dfinition de la phase (vecteur colonne) theta=2*%pi/fe*f_inst*triu(ones(N, N)); // // calcul du signal modul smod=sin(theta); // // affichage xbasc();xset("font size",4); xsetech([0,0,1,1/2]) ; plot2d(t,sinf) ; xtitle("signal modulant","temps (s)","amplitude (V)"); xsetech([0,1/2,1,1/2]) ; plot2d(t,smod) ; xtitle("signal modul","temps (s)","amplitude (V)");

21 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Les courbes montrent que la frquence du signal modul est dautant plus grande que lamplitude du signal informatif est important, on a donc bien une modulation de frquence (comparer par rapport la modulation de phase). Proposer un programme permettant dillustrer la Modulation Dplacement de Frquence (MDF ou Frequency Shift Keying FSK-) en vous inspirant de la modulation dplacement de phase. Comparer les rsultats obtenus.

Observation spectrale
Un signal sinusodal de frquence F , modul en frquence par une sinusode de frquence F , est priodique,
0 i

donc dcomposable en srie de Fourier. Le spectre est centr autour dune raie F , et compos de raies
0

espaces de F .
i

Les coefficients sont donns par les fonctions de Bessel, que lon trouvera en annexe. Ces coefficients dpendent de lindice de modulation. Reprenons nos signaux analogiques moduls en frquence, en augmentant le nombre de points visualiss. Cette opration permettra comme on le verra lors dune prochaine sance, damliorer la rsolution frquentielle (qui est fonction du temps danalyse). Le programme suivant permet dafficher le spectre du signal modul, pour un indice de modulation de 5. clear; stacksize(1.5e6); // dfinition des constantes et du temps N=1000 ; fe=1e6 ; fp=50e3 ; Finf=2e3; Uinf=2; t=1/fe*(0:N-1); ind=5; // // dfinition du signal informatif et de la frquence instantane sinf=Uinf*sin(2*%pi*Finf*t);f_inst=fp*ones(1,N)+ ind* Finf /Uinf*sinf; // // dfinition de la phase et calcul du signal modul theta=2*%pi/fe*f_inst*triu(ones(N, N)); smod=sin(theta'); // // dfinition de l'chelle de frquence et calcul du spectre f=fe/N*(0:N-1); S=fft(smod,-1); // // affichage xbasc(); xset("font size",4);

22 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

xsetech([0,0,1,1/2]); plot2d3(f,1/N*abs(S)); xtitle("spectre du signal modul","frquence (Hz)","amplitude (Vs)"); xsetech([0,1/2,1,1/2]); plot2d3(f(35:65),1/N*abs(S(35:65))); xtitle("spectre zoom","frquence (Hz)","amplitude (Vs)");

Vrifier, laide des courbes fournies en annexe, que les raies ont bien les amplitudes attendues. Choisir un nouvel indice de modulation de manire supprimer la raie la frquence porteuse ; vrifier laide du programme. Vrifier ces rsultats pour une modulation de phase.

Bibliographie
Documentation de la maison mre : http://www-rocq.inria.fr/scilab/ Dmarrer en Scilab par B. Ycart l'adresse : http://www.math-info.univ-paris5.fr/Enseignements/demarre_scilab/demarre_scilab.htm Une introduction Scilab, document newdocA4.pdf sur : http://www.iecn.u-nancy.fr/~pincon/scilab/newdocA4.pdf

Annexe 1 : premire approche


Les possibilits de Scilab sont trs importantes, notre objectif est ici de passer en revue les fonctionnalits de base, ainsi que celles qui nous seront utiles pour le traitement du signal. Initialiser Avant de commencer un nouveau programme, il est conseill dinitialiser toutes les variables du logiciel par linstruction clear (en minuscules), moins que lon souhaite garder des variables prcdemment dfinies. Entrer un vecteur ligne Plusieurs syntaxes possibles : -->s=[0 1 2 3] s = -->s=[0,1,2,3] s = -->s=[0:1:3] s = -->s=[0:3] s =

23 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

! 0.

1.

2.

3. !

! 0.

1.

2.

3. !

! 0.

1.

2.

3. !

! 0.

1.

2.

3. !

La troisime syntaxe se lit comme un vecteur allant de 0 3 par pas de 1, celui-ci tant 1 par dfaut il peut tre omis comme dans la quatrime syntaxe. Dans le cas dun incrment, les crochets peuvent tre omis, ou remplacs par des parenthses : -->s=(0:3) s = ! 0. 1. 2. 3. ! -->s=0:3 s = ! 0. 1. 2. 3. !

Un point virgule la fin de la ligne vite laffichage du rsultat. -->s=0:3; Entrer un vecteur colonne Plusieurs syntaxes possibles : -->s1=[0;1;2;3] s1 = ! ! ! ! 0. ! 1. ! 2. ! 3. ! -->s1=[0:3]' s1 = ! ! ! ! 0. ! 1. ! 2. ! 3. ! -->s1=[0:1:3]' s1 = ! ! ! ! 0. ! 1. ! 2. ! 3. ! -->s1=s' s1 = ! ! ! ! 0. ! 1. ! 2. ! 3. !

Mettre des vecteurs bout bout, former des matrices -->s2=[0 1 2 3; 0 1 2 3] s2 = ! 0. ! 0. 1. 1. 2. 2. 3. ! 3. ! -->s2=[s;s] s2 = ! 0. ! 0. 1. 1. 2. 2. 3. ! 3. ! -->s2=[s1';s1'] s2 = ! 0. ! 0. 1. 1. 2. 2. 3. ! 3. !

Accder aux lments dune matrice -->s(0) !--error 21 invalid index -->s(1) ans = 0. -->s(1:2:4) ans = ! 0. 2. ! -->s2(2,3) ans = 2.

Les deux premires syntaxes montrent que le premier indice dune matrice est toujours 1 dans Scilab, et non 0 . La troisime syntaxe permet daccder aux lments de rang 1 4 de s par pas de 2. Ci-dessous, la premire criture permet daccder llment de s2 sur la deuxime ligne, troisime colonne, et la suivante tous les lments de la troisime colonne sur toutes les lignes : -->s2(2,3) ans = 2. -->s2(:, 3) ans = ! 2. ! ! 2. !

On peut noter qua chaque fois le rsultat correspond un lment unique, une matrice ligne ou une matrice colonne qui on peut donner un nom (exemple s5=s1(1 :2 :4)). Matrices particulires

24 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

-->zeros(2,3) ans = ! 0. ! 0. 0. 0. 0. ! 0. !

-->ones(3,2) ans = ! 1. ! 1. ! 1. 1. ! 1. ! 1. !

-->eye(3,4) ans = ! 1. ! 0. ! 0. 0. 1. 0. 0. 0. 1. 0. ! 0. ! 0. !

-->rand(3,2) ans = ! ! ! .0683740 .5608486 .6623569 .7263507 ! .1985144 ! .5442573 !

On prcise chaque fois, dans lordre le nombre de lignes et de colonnes souhaites. La premire criture donne une matrice de 0 , la seconde de 1 , la troisime une matrice dont les lments de la diagonale sont des 1 et les autres des 0 , et la dernire donne des lments alatoire entre 0 et 1 . Donnes particulires Elles sont prcdes du symbole % . Citons : le nombre p, soit %pi, limaginaire pur, soit %i, et trs utiles pour lever certaines indterminations, le plus petit nombre manipulable par Scilab (2,22 10 soit %eps, ainsi que les type vrai, %t, et faux, %f.
-16

),

Oprations particulires On trouve videmment : les oprations daddition + (les matrices doivent alors avoir mme dimension), de soustraction - (les matrices doivent alors avoir mme dimension), de multiplication * entre matrices (le nombre de colonnes de la premire matrice doit alors tre gal au nombre de lignes de la seconde), de mme que la multiplication de tous les lments de la matrice par un nombre, de division / , la mise puissance de 10, avec e , par exemple 10e3 (soit 1000). A ne pas confondre avec ces deux dernires les multiplications et divisions lments par lments, notes respectivement .* et ./ . Les matrices doivent alors avoir mme dimension. Observons lexemple ci-aprs ( lire de gauche droite) : -->A=[0,1;2,3] A = ! 0. 1. ! ! 2. 3. ! -->B=[4,5;6,7] B = ! 4. 5. ! ! 6. 7. ! -->C=A*B C = ! 6. 7. ! ! 26. 31. ! -->D=A .*B D = ! 0. 5. ! ! 12. 21. !

On trouvera le mme mode de fonctionnement avec la fonction lvation la puissance et les symboles ^ et .^ . Citons galement quelques oprations spcifiques : size (A) qui donne le nombre de ligne et colonnes de A, length (A) qui donne le nombre dlments de A, matrix (A, m, n) qui redimensionne A sur m ligne et n colonnes (la lecture se fait colonne par colonne), sum(A) qui renvoie un nombre correspondant la somme de tous les lments de la matrice, sum(A,r) qui renvoie un vecteur ligne (r pour row) dont chaque lment est la somme des lments de la colonne correspondante de A, sum(A,c) qui renvoie un vecteur colonne (c pour column) dont chaque lment est la somme des lments de la ligne correspondante de A, triu(A) qui ne garde que la valeur des lments du triangle ( tri pour triangle) suprieur ( u pour up) de la matrice (diagonal comprise) et place des 0 ailleurs, tril(A) qui ne garde que la valeur des lments du triangle ( tri pour triangle) infrieur ( l pour low) de la matrice (diagonal comprise) et place des 0 ailleurs, A qui renvoie la matrice A transpose et conjugue, conj(A) qui renvoie la matrice A conjugue. Fonctions particulires Citons les principales :

25 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

sqrt( ), la racine carre, sin( ), cos( ), tan( ) les sinus, cosinus et tangente, asin( ), acos( ), atan( ) les fonctions inverses des prcdentes, exp( ), log( ) les fonctions exponentielle et logarithme nprien, 10^( ), log10( ) les fonctions puissance de 10 et logarithme dcimal, real( ), imag( ) les fonctions partie relle et imaginaire dun complexe, abs( ), phasemag( ) les fonctions module et phase dun complexe.

On peut noter d'aprs les exemples prcdents, que les lments d'une matrice sont nots entre crochet, tandis que les arguments d'une fonction sont nots entre parenthse.

Annexe 2 : laffichage
Afficher un vecteur y en fonction d'un vecteur x se fait de manire relativement simple dans Scilab grce linstruction plot2d(x,y) . La gestion de l'affichage graphique peut tre cependant trs puissante (et donc relativement complexe). Nous nous contenterons ici de passer en revue les instructions qui nous serons les plus utiles. Il faut noter que Scilab est un programme crit pour fonctionner sous Unix, et l'affichage pose parfois quelques petits problmes sous Windows si on souhaite utiliser des fonctions un peu complexes, de mme que le copier coller qui sautorise quelques dcalages. Tous les exemples prsents sont cependant fait partir de Windows. Il est possible douvrir plusieurs fentres daffichage la fois dans Scilab (qui leur tour pourront contenir plusieurs graphiques), au moyen de linstruction : xset("window", x); o x est le numro de la fentre. Cette instruction ouvre cre la fentre et la rend active (une seule fentre active la fois). Si une seule fentre est utilise, ce qui sera en souvent notre cas, cette instruction est inutile. Attention de bien respecter style des guillemets (style anglo-saxon ), ainsi que les minuscules ! Avant tout affichage, il est conseill dinitialiser les paramtres daffichage par linstruction : xbasc(x); Sans cette instruction Scilab effectue le nouveau trac sur le prcdent. Si les parenthses sont vides, cest la fentre courante qui est initialise. Lorsque lon souhaite configurer laffichage de la fentre active, on peut utiliser linstruction : xset() ; qui ouvre la fentre suivante :

26 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Elle permet alors principalement de choisir la fonte du texte (fontld, dont la fonte symbol pour les lettres grecques, la taille de celle-ci (fontsize), le style des points daffichage (markld) et leur taille (markldsize), lpaisseur des traits (thickness), lutilisation ou non de la couleur (use color) et la teinte choisie (colors). Pour plus dinformation on tapera help xset linvite. On rinitialise toutes ces valeurs par la commande xset("default"). Tous ces paramtres sont accessibles directement par lignes de code, comme par exemple le choix de la taille de la fonte (une taille de 4 convient bien en gnral) et l'paisseur des traits (en pixels) : xset("font size",4); xset("thickness",2); Un titre, ainsi qu'une lgende pour l'axe des abscisses et une pour l'axe des ordonnes peuvent tre ajoutes au moyen de linstruction : xtitle("titre","axe des x","axe des y"); De la mme manire il est possible dajouter du texte sur le graphique en prcisant la position du point en bas gauche du texte : xstring(x_bg, y_bg, ["ligne 1"; "ligne 2" ; .]) Attention : les expressions ne doivent contenir ni guillemets, ni apostrophes. On peut galement positionner des flches sur le graphique, x_dn, y_dn, x_an et y_an reprsentant respectivement les coordonnes des positions de dpart et darrive de la flche n (la flche tant larrive) : xarrows([x_d1 , x_a1 , x_d2 , x_a2 , ],[ y_d1 , y_a1 , y_d2 , y_a2 , ]); Il est galement possible de placer une grille en prcisant les style reprsent par un entier n, laide de : xgrid(n) ; Plusieurs graphes peuvent tre tracs dans une mme fentre au moyen de l'instruction : xsetech(pos_x, pos_y, largeur, hauteur); o la fentre est vue comme un carr dont les dimensions des cts sont unitaires, et dont le point origine (0,0) se trouve en haut gauche (le point (1,1) se trouve donc en bas droite). Dans cette fentre pos_x et pos_y reprsente les coordonnes en x et y du coin suprieur gauche du graphe concern, tandis que largeur et hauteur reprsente sa taille, toujours dans le mme systme. L'instruction plot2d permet dafficher les lments dun vecteur en fonction de lindice de chaque lment (exemple plot2d(x)) ou en fonction de llment de mme rang dun second vecteur (exemple plot2d(x,y)). Dans le premier cas, le premier indice est 1 , dans le second cas, les vecteurs doivent avoir mme taille. Cette instruction est trs puissante, on consultera laide en ligne pour plus dinformation. Signalons simplement que plusieurs dclinaisons de cette instruction sont possibles, comme le montre lexemple suivant : clear // dfinition d'un signal sinusodal theta=[0:.2: 2*%pi]; s=5*sin(theta); //

27 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// // initialisation de l'affichage xbasc(), xset("font size",4); xset("thickness",2); // // affichage de quatre graphes dans une fentre xsetech([0,0,1,1/3]); plot2d(theta,s); xtitle("courbe continue",angle,amplitude); xset("thickness",1);xgrid(3); xset("thickness",2); xstring( 4 , 2 , [utilisation de plot2d]); // xsetech([0,1/3,1,1/3]); plot2d2(theta,s); xtitle("courbe en escalier"); xstring( 4 , 2 , [utilisation de plot2d2]); // xsetech([0,2/3,1,1/3]); plot2d3(theta,s); xtitle("courbe en barres verticales") ; xstring(4 , 2 , [utilisation de plot2d3]);

Remarques : les instructions plot2di ncessitent de prciser les abscisses, contrairement plot2d (plot2d1(x) gnre une erreur). lorsque la grandeur s affiche est complexe, les instruction plot2di affichent la partie relle de s si on ne donne pas dautre prcision (comme abs , imag ou phasemag ). Ces instructions peuvent recevoir des arguments supplmentaires ; citons : le style par style(x) qui permet de choisir la couleur de laffichage si x est un nombre positif, ou la forme (croix, pointills etc) si x est un nombre ngatif, les valeurs extrmes de laffichage par rect=[xmin, ymin, xmax, ymax], les graduations par nax=[nx, Nx, ny, Ny] o Nx reprsente le nombre dintervalles sur laxe x et nx le nombre de sous intervalles. les choix dchelles normales ou logarithmiques avec logflag["hv"], o h et v reprsente les axes horizontal et vertical et prennent la valeur n (pour normal) ou l (pour logarithmique). la gestion des axes avec axesflags=[n] avec en particulier la valeur n=5 qui permet de tracer des axes passants par le point (0,0).

28 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Le programme ci-aprs permet de donner un exemple dutilisation, avec en plus utilisation de flches, et commentaires en lettres grecques (fonte numro 1) : clear // dfinition d'un signal sinusodal // theta=[0:.2: 2*%pi]; s=5*sin(theta); // // initialisation de l'affichage, fonte 2 et taille, paisseur des traits et des marques xset("window",0);xbasc(0); xset("font", 2, 5); xset("thickness",3); xset("mark size", 18); // // affichage "point en croix", extension des chelles, gestion des graduation, placement des axes plot2d(theta,s,style=-1,rect=[-1, -6, 7, 6],nax=[2,4,2,6], axesflag=[5}); // // affichage de flches xset("thickness",1);xarrows([ 1, 1.4, 5, 4.8],[ 2, 4.1, -2, -4.1]); // // affichage de commentaires sur la courbe xstring(0.7 , 1.2 ,["maximum"]); xstring( 4.5 , -2 ,["minimum"]); // // affichage des valeurs p et 2p xset("font", 1, 12); xstring( %pi, 0.2,["p"]); xstring( 2*%pi, 0.2,["2p"]); // // placement de graduation pour les valeurs prcdentes xset("font",2, 18); xstring( %pi, -0.3,["I"]); xstring( 2*%pi, -0.3,["I"]);

Les instructions nax et rect ont parfois un fonctionnement alatoire sous windows. En particulier, linstruction rect, bien pratique pour faire un zoom sur une courbe, laisse dborder la courbe en dehors des axes, ce qui, hormis laspect inesthtique, rend parfois les copier coller difficiles. Aussi si le zoom ne concerne que laxe horizontal, on prfrera utiliser la mthode de lexemple suivant : clear // dfinition d'un signal sinusodal theta=[0:.05:10]; s=5*sin(2*%pi*theta); //

29 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// initialisation de l'affichage xbasc(), xset("font size",4); xset("thickness",3); // // affichage de quatre graphes dans une fentre xsetech([0,0,1,1/2]); plot2d(theta,s); xtitle("courbe complte); xsetech([0,1/2,1,1/2]); plot2d(theta(1:10),s(1:10)); xtitle("courbe dilate sur les 10 premiers chantillons);

Ce que nous venons de voir nest quun aperu trs succin des possibilits daffichage de Scilab ; pour plus dinformations on consultera la documentation fournie avec le logiciel, laide, ainsi que les nombreux documents disponibles sur internet.

Annexe 3 : la sauvegarde
Le rpertoire de travail Scilab sauvegarde les donnes dans le rpertoire de travail. Il sagit par dfaut du dossier C:\Scilab-2.6\bin si le logiciel t install par la procdure classique. Ce rpertoire peut tre modifi par la commande : chdir c:\chemin\rpertoire On peut vrifier quil sagit bien du rpertoire souhait en tapant linvite : pwd Sauvegarde du contexte Toutes les variables peuvent tre sauvegardes dans un fichier binaire au moyen de la commande : save Nom_de_fichier puis rappeles par la commande : load Nom_de_fichier

30 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Dautres possibilits existent avec les commandes write et read, ainsi que mopen, mclose, mfprintf et mfscanf dont le comportement est identique aux commandes du langage C de nom similaire (au m prs). Fichier dinstructions Comme nous lavons signal au dbut, il est souvent plus simple, lorsque lon a un peu lhabitude de Scilab, dcrire les programmes dans un diteur de texte part, comme le bloc note de Windows, et de les envoyer dans Scilab par un copier coller. Word peut galement tre employ efficacement, en crant des modles et des macros permettant une configuration correcte vitant toute correction automatique : pas de remplacement des guillemets anglo-saxons par les guillemets franais, pas de majuscules en dbut de phrase, pas de suppression de la seconde majuscule dun mot, pas dordinaux et pas dexposants. On trouvera tous ces rglage dans Outils / Correction automatique Les macros pourront galement tre utilises pour automatiser lcriture des lignes de commande daffichage (xsetech, xtitle etc) un peu fastidieuse mettre en place. Les instructions dun programme peuvent tre sauvegardes dans un fichier texte (extension .txt ou encore .sce par habitude pour les fichiers Scilab) et excutes moyen de la commande : exec Nom_du_fichier.extension

Annexe 4 : la programmation
Les boucles de programmation Scilab offre la possibilit dutiliser des boucles de programmation classiques, tels que : for, while, if thenelse, selectcase. On trouvera plus dinformation dans laide en ligne, et des exemples dutilisation dans le prsent document, chapitre sur la modulation de frquence et annexe sur les fonctions de Bessel. Cependant, comme nous lavons vu, on pourra souvent (et on devra) remplacer la boucle par un calcul matriciel, beaucoup plus efficace avec Scilab. Les fonctions Beaucoup plus intressantes, les fonctions permettent denregistrer dans un fichier texte part, des lignes de programme souvent utilises, et de les rappeler ensuite. La syntaxe est la suivante : function [y1, y2,yn] = nom_de_fonction(x1, x2xm) o les termes xi et yi reprsentent respectivement les arguments dentre et de sortie de la fonction. Suit alors la description de la fonction. Dans lexemple suivant, deux fonctions ont t enregistres dans le fichier mes_fonctions.txt dans le rpertoire de travail courant (voir annexe sur la sauvegarde). Lextension habituelle est plutt .sci , mais un .txt se gnre plus naturellement avec le bloc note. La premire donne les lments pour tracer une transforme de Fourier bilatrale sous sa forme habituelle pour les signaux temps continu, de fe/2 fe/2 ( un chantillon prs). On se rfrera au chapitre sur lobservation spectrale pour plus dinformation. La seconde permet partir de la description sur une priode dun symbole, de le reproduire N fois (voir chapitre sur laffichage dun signal quelconque). // "tfcbi" calcul la fft, divise par le nombre d'chantillons, // met sous forme -fe/2, fe/2, et gnre le vecteur frquence pour l'affichage // function[S, f]=tfcbi(s,fe) N=length(s) S1=1/N*fft(s,-1); S=[S1(N/2+1:N), S1(1:N/2)]; f=fe/N*[-N/2 : N/2-1];

31 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// // "repet" rpte un vecteur N fois (pour crer un signal priodique) // function[S]=repet(s,N) S=matrix(s' *ones(1, N), 1 , N*length(s)); // Le programme suivant utilise une des deux fonctions, charges par getf( ) , afin de tracer la transforme de Fourier dun signal porte. clear; // // chargement du fichier texte des fonctions getf('mes_fonctions.txt'); // // dfinition des constantes a=10 ; N=1000 ;Te=1e-3 ; // // description du signal // s1=[ones(1, a), zeros(1, N-a)] ; // // appel de la fonction [S1, f]=tfcbi(s1,1/Te); // // calcul de la transforme avec seulement la fonction fft (pour comparaison) S=fft(s1,-1); // affichage xbasc(); xset("font size", 4); xsetech([0,0,1,1/2]); plot2d(abs(S)); xtitle("courbe gnre par fft","chantillons","amplitude"); xsetech([0,1/2,1,1/2]); plot2d(f,abs(S1)); xtitle("transforme de Fourier"," frquence (Hz)","amplitude (Vs)");

La transforme de Fourier dune porte damplitude unitaire et de largeur aTe est un sinus cardinal damplitude a.Te et dont le lobe principal une largeur de 2/(a.Te). On retrouve bien la forme souhaite, ainsi quune chelle de

32 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

frquence correcte. Si lamplitude semble galement correcte, il sagit simplement dun choix judicieux de la valeur 1 pour NTe. Comme nous le verrons en effet par la suite, la transforme de Fourier tant calcul pour des valeurs discrtes (le choix de plot2d au lieu de plot2d3 permet simplement laffichage dun spectre continu), le signal temporel est donc considr comme priodique. Il sagit donc dun calcul de coefficient de srie de Fourier ( un rapport N prs). Pour obtenir des amplitudes correspondant la transform, il suffit de dterminer la condition vrifier en galisant sur une frquence quelconque (la frquence nulle est la plus simple), la valeur du coefficient de la srie et la valeur de la transforme. Remarques : les variables internes des fonctions ne modifient pas le contexte gnral du programme, seul le premier argument de sortie de la fonction peut tre utilis ; nous aurions pu crire par exemple S1=tfcbi(s1,1/Te) , le vecteur f ntant alors videmment pas utilisable.

Annexe 5 : polynmes et fonctions de transfert


La fonction de transfert dun quadriple peut tre dcrite et sa rponse frquentielle affiche, de diffrentes faons. Les exemples ci-aprs dcrivent un filtre passe bande du second ordre. On rappelle que la fonction de transfert dun tel filtre a pour expression :

le zro est nul au numrateur, tandis que si le coefficient damortissement est infrieur lunit, les ples du dnominateur sont des complexes conjugus :

Un polynme peut tre dcrit dans Scilab l'aide de la fonction poly par ses racines (premire criture), ou bien ses coefficients (seconde criture avec largument c) en commenant par le poids faible. La fonction de transfert est ensuite obtenue en faisant des oprations sur les diffrents polynmes.

clear; // // dfinition des paramtres w0=10; z=.3; // // dfinition des ples et zro pole_d=-w0*(z+%i*sqrt(1-z^2)); zero_n=0; // // dfinition du numrateur et dnominateur n=2*z/w0*poly([zero_n],'p'); d=1/w0^2*poly([ pole_d, pole_d' ],'p'); // // fonction de transfert h=n/d h = .06p ----------------1 + .06p + .01p
2

clear; // // dfinition des paramtres w0=10; z=.3; // // dfinition du numrateur // et dnominateur par les coefficients n=poly([0,2*z/w0],'p','c'); d=poly([1, 2*z/w0, 1/w0^2],'p','c'); // // dfinition de la fonction de transfert h=n/d h = .06p ----------------1 + .06p + .01p
2

La fonction roots() permet de retrouver ventuellement les racines dun polynme.

33 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

-->roots(d) ans = ! - 3. + 9.539392i ! ! - 3. - 9.539392i !

Laffichage du diagramme de Bode peut tre effectu en calculant les points souhaits laide de la fonction freq , laquelle il faut prciser numrateur, dnominateur et domaine de variation de la variable (qui est complexe dans notre cas). // // dfinition de la plage de variation f=[.01:.01:100]; // // calcul des points h=freq(n,d,2*%i*%pi*f); // // affichage xbasc(); xset("font size",4); xsetech([0,0,1,1/2]); plot2d(f,20*log10(abs(h)), logflag=["ln"]); xtitle("diagramme de Bode","frquence (Hz)"," gain (dB)"); xsetech([0,1/2,1,1/2]); plot2d(f,phasemag(h), logflag=["ln"]); xtitle(""," frquence (Hz)","phase en ");

Il est galement possible de dcrire une variable (qui est vue soit comme un polynme de racine nulle ou comme un polynme de coefficients [0, 1]) et deffectuer ensuite les oprations directement avec cette variable. clear; w0=10; z=.3; p=poly(0,'p'); h=(2*z*p/w0)/(1+2*z*p/w0+(p/w0)^2) clear; w0=10; z=.3; p=poly([ 0, 1],'p',c); h=(2*z*p/w0)/(1+2*z*p/w0+(p/w0)^2)

34 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

h = .06p ----------------1 + .06p + .01p


2

h = .06p ----------------1 + .06p + .01p


2

Quelle que soit loption choisie, on peut obtenir directement laffichage dans le plan de Bode avec linstruction bode , si on a dfinit auparavant un systme linaire avec syslin . Cette dernire instruction permet lutilisation de fonctions particulires, mais est surtout intressante avec les variables dtat et les systmes discrets. Lexemple suivant trace la fonction de transfert dun filtre passe bas de Cauer, de pulsation normalise. clear; // // dfinition de la variable p p=poly(0,'p'); // // dfinition de la fonction de transfert h1=(1+0.1119*p^2)/(1+1.9234*p+1.808*p^2) ; h2=(1+0.5788*p^2)/(1+0.4164*p+1.062*p^2) ; h3=(1+0.8003*p^2)/(1+0.071*p+0.948*p^2) ; h=h1*h2*h3 ; // // dfinition dun systme linaire continu h1=syslin('c',h); // // affichage de h1 pour des frquences allant de 0,01 10 Hz par pas de 0,01 xbasc();xset("font size",4); bode(h1,.01,10,.01);

Remarque : les chelles de phase de la fonction bode sont parfois fantaisistes ; dans notre cas par exemple, la phase pour la frquence nulle commence -360 (au lieu de 0, soit un tour de moins).

Annexe 6 : fonctions de Bessel

35 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

Elles permettent de dterminer l'amplitude des raies du spectre d'une modulation angulaire d'une porteuse de frquence f par un signal sinusodal de frquence f , et ont pour expression :
P i

Les harmoniques sont de frquences f +n.f , avec des amplitudes J (m), fonction de lindice de modulation m.
P i n

Le programme suivant a permis le trac des ces fonctions : clear ; stacksize(1.5e6); // // dfinition du nombre points, de l'indice de modulation maximal, du nombre d'harmonique N=500; Mmax=12; harmo=8; // // dfinition de l'angle d'intgration theta=%pi/N*[0:N-1]; // // dfinition de la plage de variation de l'indice de modulation m=Mmax/N*[0:N-1]; // // dfinition d'une matrice contenant les diffrents indices J=zeros(harmo+1,N); // // initialisation de l'affichage xbasc(); xset("font size",5); xtitle ("fonction de Bessel","indice modulation", "amplitude relative"); // // calcul et affichage des fonctions pour 8 frquences harmoniques et la porteuse for n=0:harmo, J(n+1,:)= 1/N*(sum (cos(m'* sin(theta) - n*ones(N,1)*theta),'c'))'; plot2d(m,J(n+1,:), rect=[ 0, -0.4, 12, 1]); end; // // placement de la grille xgrid(3); // // changement de taille de fonte xset("font", 2,4); //

36 sur 37

16/10/2013 22:39

Introduction au traitement du signal avec Scilab

http://www.aix-mrs.iufm.fr/formations/filieres/ge/data/siteDR/traiteme...

// placement des valeurs d'indices xstring( 0.9, 0.9, ["fondamental"]); xstring( 2, 0.6, ["n=1"]); xstring( 3.1, 0.5, ["n=2"]); xstring( 4.4, 0.43, ["n=3"]); xstring( 5.3, 0.41, ["n=4"]); xstring( 6.5, 0.38, ["n=5"]); xstring( 7.3, 0.36, ["n=6"]); xstring( 8.5, 0.34, ["n=7"]); xstring( 9.5, 0.32, ["n=8"]);

Retour haut de page Retour page dintroduction

37 sur 37

16/10/2013 22:39