Introduction Au Traitement Du Signal Avec Scilab
Introduction Au Traitement Du Signal Avec Scilab
Introduction Au Traitement Du Signal Avec Scilab
Sommaire
Sommaire
1. Installation
2. Règles pratiques
3. Représentation d’un signal sinusoïdal dans les domaines temporel et
fréquentiel.
4. Représentation d’un signal périodique quelconque
5. Modulation d’amplitude
Modulation
sans porteuse
Modulation
d’amplitude avec porteuse
Modulation en
bande latérale unique
6. Modulations angulaires
Rappels
théoriques
Visualisation
temporelle d’un signal modulé en phase
Signal modulé
en fréquence
Observation
spectrale
Bibliographie
Annexe 1 : première approche
Annexe 2 : l’affichage
Annexe 3 : la sauvegarde
Sauvegarde du contexte
Annexe 4 : la programmation
Les boucles de programmation
Les fonctions
Annexe 5 : polynômes et fonctions de
transfert
Annexe 6 : fonctions de Bessel
Les outils logiciels sont devenus un élément indispensable en
traitement du signal, que ce soit pour
l’apprentissage ou le développement de
système, en particulier depuis l’apparition des techniques
numériques.
Un signal numérisé peut être en effet vu comme une suite de
valeurs, c’est à dire un vecteur. Un vecteur
n’est qu’une matrice à une ligne
ou une colonne.
Dans le cas de traitement d’images par exemple, les signaux
étant à deux dimensions, on arrive
directement à la notion de matrices. On
pourrait trouver de nombreux exemples où le signal à traiter
présente une
dimension supérieure encore.
Il était donc naturel de se tourner vers des logiciels
spécialisés en calcul matriciel, tel que Matlab
(contraction de MAtrix
LABoratory).
Nous utiliserons pour notre part un logiciel quasiment
similaire, Scilab (pour SCIentific LABoratoty), qui
présente l’avantage par
rapport au précédent d’être libre et gratuit.
Scilab est développé par l’INRIA Rocquencourt (78). On peut
le télécharger gratuitement avec sa
documentation et de nombreuses
applications, à l’adresse :
http://www-rocq.inria.fr/scilab/
Ce logiciel est utilisable pour toute application
nécessitant un calcul matriciel, de la finance à la physique.
Pour de
nombreuses applications spécifiques telles que le traitement du signal, un
ensemble de fonctions
spécialisées, appelé « boîtes d’outils » (tools
box) ont été mises au point.
1.
Installation
2.
Règles pratiques
3.
Représentation d’un signal sinusoïdal dans les domaines
temporel
et fréquentiel.
Nous allons maintenant afficher la transformée de Fourier de
ce signal. Scilab effectue non pas le calcul
de la transformé de Fourier
(calcul théorique analogique), mais, comme tout système numérique, la
transformée de Fourier discrète. Une étude détaillée de cette dernière sera
l’objet d’une prochaine
séance. Pour l’instant, contentons nous de quelques
informations :
-
la transformation de Fourier discrète d’un signal
« s » de N échantillons, se fait par la fonction
« fft(s,-1) » (où « –1 » représente le signe de l’exposant
de l’exponentielle dans l’expression
théorique, la transformée inverse se faisant
donc avec « 1 » comme paramètre),
-
cette fonction renvoie un vecteur de même dimension N
que « s »,
-
les éléments de ce vecteur sont des nombres complexes,
on pourra alors éventuellement utiliser la
fonction « abs » pour n’en
garder que le module,
-
le premier élément (indice 1) correspond à la fréquence
nulle,
-
le dernier (indice N) à la fréquence d’échantillonnage
fe diminuée d’un pas fe/N,
-
une telle transformation est périodique de période fe
(le signal temporel étant échantillonné).
Dans les cas relativement simples que nous allons étudier
(signaux périodiques), pour passer de la
transformation de Fourier discrète à
la transformation de Fourier (au sens analogique), il faudra tenir
compte des
remarques suivantes :
-
les signaux que nous étudions pour l’instant étant
sensés être des signaux à temps continu, le
spectre n’a de sens que de –fe/2 à
fe/2,
-
les signaux étudiés étant réels, on pourra limiter
l’étude du module (qui est pair) de la transformée
de 0à fe/2 ?
-
si on souhaite également étudier la partie imaginaire
(impaire pour un signal réel) de la transformée,
il faudra considérer la bande
de fe/2 à fe, qui correspond à la bande de –fe/2 à 0 du spectre
théorique,
-
pour se ramener aux amplitudes attendues pour un signal
à temps continu, il faut diviser le résultat
donné par la fonction
« fft » par le nombre d’échantillons N.
A la suite du programme précédent, on peut donc écrire pour
obtenir la transformée de Fourier :
// définition
d'une variable fréquence pour l'affichage
// le premier
point correspond au continu
// le dernier
à la fréquence d'échantillonnage au pas près
f=1/(N*Te)*( 0 : N-1) ;
//
// calcul de
la transformation
sf=fft(s,-1)
;
//
//
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 fréquence de 0 à
fe/2","fréquence (Hz)","amplitude (Vs)");
//
// zoom sur la raie, de la fréquence 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é","fréquence
(Hz)","amplitude (Vs)");
Pour définir la variable fréquentielle « f » qui
n’est indispensable que si on souhaite soigner l’affichage, il
ne faut pas
perdre de vue que la valeur f(0) (d’indice « 1 ») correspondra au
continu, et la valeur f(N-1)
(d’indice
N) correspondra à fe-fe/N. L’expression de « f » vient alors
d’elle-même.
Le premier affichage met en évidence la périodicité du
spectre, ainsi que le problème des amplitudes.
Avec le second affichage, on corrige le problème d’amplitude
en divisant par N le module. L’amplitude est
alors celle attendue, 2,5 Vs
pour le spectre bilatéral d’un signal sinusoïdal de 5 V crête.
On limite la bande de fréquence de 0 à fe/2 en ne prenant
que les éléments d’indices 1 à N/2 des deux
vecteurs « f » et
« sf » (voir annexe sur l’affichage).
Avec le troisième affichage, par la même méthode, on
effectue un zoom sur les 20 premiers échantillons
(soit du continu à fe/5). On
peut remarquer que la raie s’affiche comme un triangle, ce qui est du au choix
du mode d’affichage. Pour obtenir une raie seule, on pouvait choisir la
fonction « plot2d3 » (voir annexe
sur l’affichage).
On peut noter que la raie se trouve sur l’élément 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
l’indice 1 correspond à la fréquence 0 et l’indice N à fe-fe/N ; l’indice
x correspond donc à
(x-1)fe/N.
Remarque importante : l’amplitude est exactement celle prévue.
Ceci est dû au choix d’une fréquence à
afficher multiple de fe/N. Ces
différents problèmes seront étudiés ultérieurement.
Quelques améliorations concernant la présentation sont
proposées en annexe 4.
Rappeler les spectres (parties réelle et imaginaire) des
signaux suivant :
s1=sinwt s2=coswt s3=sin(wt+p/4) s4=e j w t
Nous
allons adopter maintenant une démarche inverse de la précédente :
retrouver le signal temporel à
partir de sa transformée de Fourier.
En
gardant les mêmes nombre de points, fréquence d’échantillonnage et fréquence du
signal, générer
dans Scilab les spectres de ces différents signaux. On placera
pour cela bout à bout des « 1 » et des
« 0 » aux bons
endroits en s’aidant de l’instruction « zeros(x,y) » qui génère une
matrice de « 0 » de x
lignes et y colonnes.
Attention
au signal s4 qui n’est pas réel et ne
vérifie donc pas les propriétés de symétrie paire du module
et impaire de la
phase.
Vérifier
par affichage avec les instructions correspondantes la forme des modules
–abs(S)-, partie réelle
–real(S)- et partie imaginaire –imag(S)-.
Faire
la transformation inverse et afficher le signal temporel pour en vérifier la
forme. On notera en
particulier pour le signal exponentiel que les parties
réelle et imaginaire sont sinusoïdales, tandis que le
module est constant.
Remarque :
pour un signal complexe, sans autre précision, les fonctions d’affichages
affichent la partie
réelle.
4.
Représentation d’un signal périodique quelconque
5.
Modulation d’amplitude
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","fréquence
(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","fréquence
(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é","fréquence
(Hz)","amplitude (Vs)");
L’affichage a été réalisé avec la fonction
« plot2d3 » qui permet d’afficher des raies, tandis que
l’instruction
« rect » permet d’avoir les mêmes échelles d’amplitude pour les trois
signaux.
Remplacer maintenant le signal informatif par une somme de 3
sinusoïdes d’amplitudes et fréquences
respectives (1V, 4kHz), (2V, 2kHz), et
(1,5V, 5kHz). Visualiser les signaux informatifs et modulés, ainsi
que le
spectre des signaux modulés
clear ;
// définition
des constantes
N=500 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=2e3;
finf3=5e3;
//
//
description des vecteurs temps, fréquence (pour l’affichage 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)");
// 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","fréquence
(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é","fréquence
(Hz)","amplitude (Vs)");
Afin de se familiariser avec les produits matriciels, on
étudiera le programme ci-après, permettant de
générer la somme des trois
sinusoïdes pour le signal informatif.
clear
// définition
des constantes
N=500 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=10e3;
finf3=15e3;
//
//
description du vecteur temps
t=(0:N-1)/fe ;
//
// les fréquences 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 d’amplitude avec porteuse
Proposer un programme permettant d’illustrer les
propriétés temporelles et spectrales de la modulation
d’amplitude avec
porteuse. L’indice de modulation devra être facilement modifiable. Pour générer
un
signal continu, on pourra utiliser la fonction « ones() » (voir
annexe 1).
Modulation en bande latérale unique
Pour obtenir notre signal modulé en BLU, nous allons
utiliser dans un premier temps la méthode
classique qui consiste à supprimer
par filtrage, une des bandes du signal modulé en double bande. Cette
méthode
est en générale très difficile à mettre en œuvre dans un cas réel (pente du
filtre nécessaire trop
raide), mais notre but est ici simplement d’illustrer
certaines fonctionnalités de Scilab.
Dans une seconde approche, nous nous contenterons d’afficher
le signal à partir des équations données
par la théorie.
On peut afficher la même chose, mais avec les échelles
semi-logarithmiques classiques. On notera
l’utilisation de l’instruction
« logflag » ( voir annexe sur l’affichage ou l’aide en ligne sur
« plot2d ») et la
suppression de l’indice 1 du vecteur fréquence,
indice qui valait 0 et dont le logarithme est indéfini. Afin
de simplifier
l’écriture des instructions d’affichage, tous les paramètres ont été décrits
avant.
// définition des paramètres 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","fréquence
(Hz)","amplitude (dB)");
//
xsetech([0,1/3,1,1/3]) ; plot2d(f_aff, gain_dB ,
logflag=["ln"] , rect=[1e4, -90, 1e5, 10] ) ;
xtitle("filtre","fréquence (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","fréquence (Hz)","amplitude
(dB)");
Remarques :
-
un signal modulé en BLU donne un autre signal
sinusoïdal, sa représentation est donc de peu
d’intérêt,
-
on pouvait s’affranchir du passage dans le domaine
fréquentiel en effectuant un produit de
convolution entre le signal double
bande et la réponse impulsionnelle du filtre (c’est à dire la
transformée de
Fourier inverse de sa fonction de transfert). Cette approche sera vue
ultérieurement.
-
le signal temporel « sblu » peut être calculé
plus simplement en faisant la transformée de Fourier
inverse du produit Smod
par le gain du filtre. Le spectre correspondant est celui d’une somme
d’exponentielles complexes (les raies dans la bande supérieure à fe/2 sont très
négligeables). En
prenant alors la partie réelle ou imaginaire de la
transformée inverse on obtient la somme des
sinusoïdes à un terme de phase près
(la partie réelle de ejx est cosx et la partie imaginaire sinx).
On pouvait également générer directement, pour cet exemple
très simple le signal modulé ; le
programme ci-après synthétise les
signaux de la bande inférieure et de la bande supérieure. Malgré une
apparente similitude,
la différence entre les deux signaux modulés est très importante comme le
montre
le troisième chronogramme.
// définition des constantes
N=5000 ; fe=500e3 ; fp=50e3 ; finf1=4e3; finf2=3e3;
finf3=5e3;
//
//
description du vecteur temps
t=(0:N-1)/fe ;
//
// définition
des différents signaux informatif, modulé bande supérieure et inférieure
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);
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 inférieure","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 supérieure","temps (s)",
"amplitude (V)");
//
xsetech([0,3/4,1,1/4])
; plot2d(t(1:N/5) ,s_dif(1:N/5) ) ;
xtitle("différence des précédents","temps (s)",
"amplitude (V)");
6.
Modulations angulaires
Rappels théoriques
L’expression ci-après rappelle l’équation d’un signal modulé
en fréquence :
L’indice de modulation d
est défini comme l’écart de phase Dj autour
de la phase 2pF0t de la
porteuse.
Dans le cas d’un signal modulant sinusoïdal, soit m(t)=Ui sin(2p fi t), l’intégration due au passage
de la
fréquence à la phase du signal, nous amène à l’expression :
Comme on peut l’observer sur ces courbes (et le déduire de
la théorie), la fréquence est maximale
lorsque la dérivée du signal informatif
est maximale (c’est à dire aux passages par zéro par front montant
du signal).
Le signal modulé ne subit pas de discontinuité de phase,
comme nous sommes souvent habituées à le
voir dans les applications. Ceci est
du à la nature sinusoïdale du signal modulant, les exemples étant
plutôt donnés
pour des signaux modulants numériques.
Cependant, une modulation de fréquence d’un signal
analogique est souvent une modulation de phase
également. En effet comme nous
l’avons vu, l’indice de modulation, en modulation de fréquence diminue
avec la
fréquence du signal modulant ; il en va de même de l’immunité au bruit.
Pour compenser, on fait
alors subir une pré-accentuation fréquentielle avec une
pente du premier ordre, à partir d’une certaine
fréquence (2,1 kHz par
exemple en radio-diffusion FM) au signal modulant ; ce qui revient à le
dériver à
partir de cette fréquence. La modulation est donc de phase pour les
hautes fréquences, et de fréquence
pour les basses.
Proposer un programme permettant d’illustrer la modulation
de phase pour un signal numérique
(Modulation à Déplacement 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 conséquence le
rapport entre le débit d’information numérique et la
fréquence porteuse.
Pour réaliser le signal modulant numérique, on pourra utiliser
une technique assez similaire à celle utilisé
pour la représentation d’un
signal carré (à la différence près que cette fois le signal n’est pas
périodique).
A partir d’une suite s_simb de symboles 1 et 0, établir le
signal proprement dit, s_nrz , en
« suréchantillonnant » le signal
d’origine. Pour cela, on effectuera la multiplication par le vecteur s_simb,
d’une matrice colonne de « 1 » dont le nombre de ligne est égal au
coefficient de suréchantillonnage. Le
résultat est ensuite mis sous forme de
matrice ligne par la fonction « matrix » (consulter l’aide en ligne
ou
les annexes pour plus d’information sur les différentes fonctions).
Le programme ci-après donne l’exemple d’un signal de 8
symboles aléatoires, suréchantillonnés d’un
facteur 16.
clear
// constante
de suréchantillage
N=16;
// vecteur de
symboles
s_symb=[1 0 1
1 0 0 1 0];
// vecteur
temps
t=(0 :
8*N-1);
// signal
modulant
s_nrz=matrix(ones(N,1)*s_symb, 1, 8*N);
xbasc();
plot2d(t,s_nrz, rect=[0,-0.5,8*N,1.5]);
fp=f0*ones(1,N);
//
// définition du vecteur phase
theta=2*%pi/fe*fp*triu(ones(N,
N));
//
// calcul du sinus par les deux méthodes
s1=sin(theta);
s2=sin(2*%pi*f0*t);
//
// affichage
xbasc();
xsetech([0,0,1,1/2]) ; plot2d(t,s1) ;
xtitle("méthode de la phase","temps
(s)","amplitude (V)");
xsetech([0,1/2,1,1/2]) ; plot2d(t,s2) ;
xtitle("méthode classique","temps
(s)","amplitude (V)");
Le programme suivant permet d’afficher un signal modulé en
fréquence par une tension sinusoïdale. La
porteuse à une fréquence de
50 kHz, le signal informatif à une fréquence de 4 kHz et une
amplitude de
2 V, l’indice de modulation des de 7 (afin de visualiser
correctement les variations de fréquence).
La fréquence instantanée est un vecteur une ligne pour N
colonnes, dont tous les éléments valent la
fréquence porteuse, vecteur auquel
on ajoute le vecteur correspondant au signal informatif, pondéré par
le
coefficient de modulation, qui dépend comme nous l’avons vu, de l’indice de
modulation, de la
fréquence et de l’amplitude du signal informatif.
On intègre ensuite cette fréquence pour obtenir la phase,
puis le signal modulé est calculé à partir de
cette phase.
Comme on s’en apercevra au déroulement du programme, les
instructions de boucle sont lentes à
exécuter, et on leur préfèrera lorsque
c’est possible, des calculs matriciels, pour lesquels Scilab est
optimisé.
clear; stacksize(1.5e6);
//
// définition
des constantes et du temps
N=500 ; fe=1e6 ; fp=50e3
; Finf=4e3; Uinf=2; t=1/fe*(0:N-1); ind=7;
//
// définition du signal informatif
sinf=Uinf*sin(2*%pi*Finf*t);
//
// définition du vecteur fréquence
f_inst=fp*ones(1,N)+ ind* Finf /Uinf*sinf;
//
// définition 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)");
Bibliographie
-
abs( ), phasemag( ) les fonctions module et
phase d’un complexe.
On peut noter d'après les exemples précédents, que les
éléments d'une matrice sont notés entre crochet,
tandis que les arguments d'une
fonction sont notés entre parenthèse.
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
d’affichage (markld) et leur taille
Remarques :
-
les instructions plot2di nécessitent de préciser les
abscisses, contrairement à plot2d (plot2d1(x)
génère une erreur).
-
lorsque la grandeur s affichée est complexe, les
instruction plot2di affichent la partie réelle de s si on
ne donne pas d’autre
précision (comme « abs », « imag » ou
« phasemag »).
Ces instructions peuvent recevoir des arguments
supplémentaires ; citons :
-
le style par style(x) qui permet de choisir la couleur
de l’affichage si x est un nombre positif, ou la
forme (croix, pointillés etc…)
si x est un nombre négatif,
-
les valeurs extrêmes de l’affichage par rect=[xmin,
ymin, xmax, ymax],
-
les graduations par nax=[nx, Nx, ny, Ny] où Nx
représente le nombre d’intervalles sur l’axe x et nx
le nombre de sous
intervalles.
-
les choix d’échelles normales ou logarithmiques avec logflag["hv"],
où h et v représente 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).
Le programme ci-après permet de donner un exemple
d’utilisation, avec en plus utilisation de flèches, et
commentaires en lettres
grecques (fonte numéro 1) :
clear
// définition d'un signal
sinusoïdal
//
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 flèches
xset("thickness",1);xarrows([
1, 1.4, 5, 4.8],[ 2, 4.1, -2, -4.1]);
//
// affichage de commentaires
sur la courbe
Les
instructions nax et rect ont parfois un fonctionnement aléatoire sous windows. En
particulier,
l’instruction rect, bien pratique pour faire un zoom sur une
courbe, laisse « déborder » la courbe en
dehors des axes, ce qui,
hormis l’aspect inesthétique, rend parfois les « copier coller »
difficiles. Aussi si
le zoom ne concerne que l’axe horizontal, on préférera
utiliser la méthode de l’exemple suivant :
clear
// définition d'un signal
sinusoïdal
theta=[0:.05:10]; s=5*sin(2*%pi*theta);
//
// initialisation de
l'affichage
xbasc(), xset("font
size",4); xset("thickness",3);
//
// affichage de quatre
graphes dans une fenêtre
xsetech([0,0,1,1/2]); plot2d(theta,s);
xtitle("courbe complète”);
xsetech([0,1/2,1,1/2]);
plot2d(theta(1:10),s(1:10));
xtitle("courbe
dilatée sur les 10 premiers échantillons”);
Ce
que nous venons de voir n’est qu’un aperçu très succin des possibilités
d’affichage de Scilab ; pour
plus d’informations on consultera la
documentation fournie avec le logiciel, l’aide, ainsi que les nombreux
documents disponibles sur internet.
Le répertoire de travail
Scilab sauvegarde les données dans le répertoire de travail.
Il s’agit par défaut du dossier C:\Scilab-
2.6\bin si le logiciel à été installé
par la procédure classique. Ce répertoire peut être modifié par la
commande :
chdir c:\chemin\répertoire
On peut vérifier qu’il s’agit bien du répertoire souhaité en
tapant à l’invite :
pwd
Sauvegarde du contexte
Toutes les variables peuvent être sauvegardées dans un
fichier binaire au moyen de la commande :
save Nom_de_fichier
puis rappelées par la commande :
load Nom_de_fichier
D’autres possibilités 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 »
près).
Fichier d’instructions
Comme nous l’avons signalé au début, il est souvent plus
simple, lorsque l’on a un peu l’habitude de
Scilab, d’écrire 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 créant des
modèles et des macros permettant une
configuration correcte évitant toute
correction automatique : pas de remplacement des guillemets anglo-
saxons
par les guillemets français, pas de majuscules en début de phrase, pas de
suppression de la
seconde majuscule d’un mot, pas d’ordinaux et pas
d’exposants. On trouvera tous ces réglage dans
Outils / Correction
automatique…
Les macros pourront également être utilisées pour automatiser
l’écriture des lignes de commande
d’affichage (xsetech, xtitle etc…) un peu
fastidieuse à mettre en place.
Les instructions d’un programme peuvent être sauvegardées
dans un fichier texte (extension .txt ou
encore .sce par habitude pour
les fichiers Scilab) et exécutées moyen de la commande :
exec Nom_du_fichier.extension
Annexe 4 :
la programmation
clear;
//
// chargement
du fichier texte des fonctions
getf('mes_fonctions.txt');
//
// définition
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 transformée 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 générée par
fft","échantillons","amplitude");
xsetech([0,1/2,1,1/2]);
plot2d(f,abs(S1));
xtitle("transformée de Fourier"," fréquence
(Hz)","amplitude (Vs)");
-
les variables internes des fonctions ne modifient pas
le contexte général 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 » n’étant alors évidemment pas utilisable.
clear; clear;
// //
// définition des paramètres // définition des paramètres
w0=10; z=.3; w0=10; z=.3;
// //
// définition des pôles et zéro // définition du numérateur
pole_d=-w0*(z+%i*sqrt(1-z^2));
zero_n=0; // et dénominateur par les coefficients
// n=poly([0,2*z/w0],'p','c');
// définition du numérateur et dénominateur d=poly([1,
2*z/w0, 1/w0^2],'p','c');
n=2*z/w0*poly([zero_n],'p'); //
d=1/w0^2*poly([
pole_d, pole_d' ],'p'); // définition de la fonction de transfert
// h=n/d
// fonction de transfert
h=n/d h =
.06p
h =
-----------------
.06p 1 + .06p +
.01p2
-----------------
1 +
.06p + .01p2
La fonction « roots() » permet de retrouver
éventuellement les racines d’un polynôme.
-->roots(d)
ans =
! - 3. + 9.539392i !
! - 3. - 9.539392i !
L’affichage du diagramme de Bode peut être effectué en
calculant les points souhaités à l’aide de la
fonction « freq », à
laquelle il faut préciser numérateur, dénominateur et domaine de variation de la
clear;
//
// définition de la variable p
p=poly(0,'p');
//
// définition 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 ;
//
// définition d’un système linéaire continu
h1=syslin('c',h);
//
// affichage de h1 pour des fréquences allant de 0,01 à 10 Hz par pas de
0,01
xbasc();xset("font size",4); bode(h1,.01,10,.01);
Elles permettent de
déterminer l'amplitude des raies du spectre d'une modulation angulaire d'une
porteuse de fréquence fP par un signal sinusoïdal de fréquence fi, et ont pour
expression :
Le programme suivant a
permis le tracé des ces fonctions :
clear ; stacksize(1.5e6);
//
// définition
du nombre points, de l'indice de modulation maximal, du nombre d'harmonique
N=500; Mmax=12; harmo=8;
//
// définition de l'angle d'intégration
theta=%pi/N*[0:N-1];
//
// définition de la plage de variation de l'indice de modulation
m=Mmax/N*[0:N-1];
//
// définition d'une matrice contenant les différents 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 fréquences 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);
//
// 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 d’introduction