Traiter le signal audio numérique avec Matlab ou Scilab

Slides:



Advertisements
Présentations similaires
1 Jean-Paul Stromboni, mars 2005, Révision des cinq premières séances S.S.I. Jean-Paul Stromboni, mars 2005, ESSI1 Elève : ______________________ groupe.
Advertisements

S.S.I., ESSI1, lundi 9 mai 2005 Page 1 Comment compresser avec le spectre Séance 10, 1 heure Version : lundi 9 mai 2005 Auteur : Jean-Paul Stromboni Contenu.
S.S.I., ESSI1, samedi 10 avril 2004 Page 1 Comment tailler les filtres sur mesure Séance 8, nouvelle application des filtres, 1 heure Version : samedi.
Comment créer des filtres d’ordre 1 et 2
Comment calculer le spectre d’un signal audio
Cours 5 – Comment bien échantillonner le signal audio
Comment décimer les sons numériques
1 Jean-Paul Stromboni, octobre 2007, SI3 Réviser le devoir surveillé n°1 du cours S.S.I.I. Jean-Paul Stromboni, octobre 2007, SI3 Elève : ______________________.
Calcul de la composition fréquentielle du signal audio
1 Jean-Paul Stromboni, mars 2005, Révision des cinq premières séances S.S.I. Jean-Paul Stromboni, mars 2005, ESSI1 Elève : ______________________ groupe.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Séries de Fourier Tout signal périodique (T) de puissance finie peut être décomposé en une somme de sinus et de cosinus. An=0 1(4/) 1+ 3 (4/3)
! 1 CREATION D'UNE MAQUETTE EXPORT / IMPORT
Comment créer des filtres « simples »
Comment compresser avec le CODEC mlaw
Créer des interfaces avec Matlab.
Cours S.S.I., SI1, avril 2007 – Comment utiliser les outils déjà présentés. Page 1 Comment utiliser les outils déjà présentés dans le cours S.S.I. et pourquoi.
Extraits choisis du cours S.S.I.I.
AutoBilan MATLAB – SSII – SI3 – sept 2009 Page 1 Quel est leffet de linstruction ? Répondez ci-dessous Ok ? D=1; fe=1000 num2str(fe) num2str(d) ['la valeur.
FLSI602 Génie Informatique et Réseaux
Programmation sous Matlab
MATLAB Initiation à Matlab.
Sous-échantillonner le signal audio pour compresser
1 PolytechNice-Sophia, Département S.I., S.I.3, octobre 2012, Jean-Paul Stromboni Séance 7 : Retour sur les cinq premiers chapitres du cours S.S.I.I.
Sauver un signal audio numérique dans un fichier wave
1 GPA435 Systèmes dexploitation et programmation de système Copyright, 2000 © Tony Wong, Ph.D., ing. Chapitre 5 Interpréteur de commande, Bourne shell,
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
INTRODUCTION A MATLAB ENVIRONNEMENT MATLAB.
3. Systèmes L.I.T Systèmes LIT, introduction
Extraits choisis du cours S.S.I.I.
Calcul et programmation au lycée avec Scilab
Récursivité.
4. Energie dinteraction, application à la reconnaissance de forme (texte, parole, radar …) Energie dun signal, analogie avec lélectrocinétique Par analogie.
Quelques algorithmes sur calculatrices
S.S.I.I., , n°7 : Construire et utiliser un banc de filtres Page 1 Construire et utiliser un banc de filtres pour analyser le spectre dun signal.
Cours S.S.I.I., , n°8, Créer des filtres pour compresser Cours S.S.I.I., , n°8, : Créer des filtres pour compresser Page 1 Mise en œuvre.
5. Echantillonnage Introduction
SSII : séance finale , lundi 9/01/2012 Page 1 Voici quelques questions pour assimiler la seconde partie du cours S.S.I.I., spectre, filtrage, banc.
Outils de Programmation
S.S.I.I., , n°6, Créer des filtres sur mesure pour compresser S.S.I.I., , n°6, : Créer des filtres sur mesure pour compresser 1 Créer un.
1 par Jean-Paul Stromboni, octobre 2008 Un autobilan pour réviser le devoir surveillé n°1 du cours S.S.I.I., par Jean-Paul Stromboni, octobre 2008 Elève.
Un principe de compression d’image
1 Jean-Paul Stromboni, octobre 2007, SI3 Réviser le devoir surveillé n°1 du cours S.S.I.I. Jean-Paul Stromboni, octobre 2007, SI3 Elève : ______________________.
Filtrer le signal audio numérique
Un moyen de compresser le signal audio présenté à travers un exemple
S.S.I., ESSI1, le 8 février 2004 Page 1 Numériser le signal audio Séance 2, cours, 1 heure auteur : Jean-Paul Stromboni Idées clefs de la séance De nombreuses.
1 Insérez ici votre logo Insert here your logo! ANNEXES de TICE 2002 Un cours pour introduire le traitement du signal à laide de lordinateur multimédia.
1 Introduction au module S.S.I. Signaux et Systèmes pour lInformatique le thème et les motivations du module S.S.I. les connaissances et le savoir faire.
Algèbre linéaire (GCI –100)
Structure et Services « STS » Menu Structures : Divisions
SCIENCES PHYSIQUES ET CHIMIQUES FONDAMENTALES ET APPLIQUEES
Créer des signaux audio en temps discret avec Scilab
Utilisation avancée de linux
Utiliser le spectre et la transformée de Fourier
- énergie bornée (tend vers 0 lorsque
Introduction.
Energie d’un signal, énergie d’interaction, analogie avec l’électrocinétique
Digitaliser des images
Cours S.S.I.I., , n°7, Créer des filtres pour compresser Cours S.S.I.I., , n°7, : Créer des filtres pour compresser Page 1 Retour sur le.
Extraits choisis du cours S.S.I.I.
Matlab (Matrix Laboratory)
Contenu du cours : Principe de la commande par retour d'état
Retour sur les filtres et bancs de filtres Jean-Paul Stromboni, décembre 2007.
Calcul de la composition fréquentielle du signal audio
SSII, séance n°13, bilan du cours 15 décembre 2015 Dernière séance 2015 Résumé des chapitres et notions abordées en 2015.
A.Aarabi ´. ´ Objectifs Faciliter la prise en main du logiciel MATLAB Présenter les fonctionnalités utiles au travail scientifique.
Algorithmes sur Open Office. 1. Ouvrir Visual Basic de Open Office.
Matlab (Matrix Laboratory) Langage de programmation évolué. Traitement direct d’opérations matricielles, dont l’inversion et l’analyse d’opérateurs ou.
O UTILS DE P ROGRAMMATION P OUR LES M ATHÉMATIQUES Mr. BENDIB. I MAA, LAMIS Laboratory, Université Larbi Tébessi - Tébessa.
Utiliser Scilab pour analyser les signaux audio
Transcription de la présentation:

Traiter le signal audio numérique avec Matlab ou Scilab Jean-Paul Stromboni, Polytech'Nice Sophia, Dpt Sciences Informatiques, SI3 Durée 50 minutes, avec Matlab/Scilab, un vidéo projecteur, et des hauts parleurs Après ce chapitre, vous devrez savoir comment : utiliser l’environnement de MATLAB : fenêtre de commande, éditeur de scripts, appel de fonction … et savoir passer à Scilab utiliser les langages de scripts de MATLAB et de Scilab exécuter des scripts et des fonctions MATLAB (et Scilab) synthétiser des signaux audio numériques composés d’harmoniques et dotés d’enveloppes, reproduire le timbre d’instruments de musique tracer des chronogrammes, des spectres, des spectrogrammes, … Le TD n°3 utilise Matlab ou Scilab pour : Synthétiser des signaux audio, représenter les chronogrammes, lire et écrire au format Wave, calculer et afficher le spectre, etc …

Utiliser MATLAB (ou Scilab) est un objectif du cours S.S.I.I. MATLAB (pour MATrix LABoratory) de Mathworks, est un logiciel réputé dans le domaine du calcul scientifique. Le département S.I. possède 25 licences MATLAB sur le réseau local de l’école à utiliser en travaux dirigés (cf. procédure d’installation) Pour utiliser hors de l’école, on suggère d’installer également Scilab (à télécharger sur http://www.scilab.org) outil libre, gratuit et multi-plateforme très semblable à MATLAB (il est intéressant de comparer). Pour apprendre MATLAB, on analyse des exemples tirés de : http://www-gmm.insa-toulouse.fr/~guillaum/AM/ avec l’accord de Philippe Guillaume, Professeur à l'INSA de Toulouse, et auteur de l’ouvrage : 'Musique et Acoustique : de l’instrument à l’ordinateur', collection Hermès, éditeur Lavoisier.

Se repérer dans l’environnement MATLAB (celui de Scilab plus simple contient la plupart des outils de calcul et de tracé) dossier travail fenêtre plot Publish in html fenêtre edit fenêtre de commande .m file

Utiliser la fenêtre de commande de Matlab (traduire en Scilab) >> % en Matlab, le prompt est ’>>’ >> N=3 % avec ou sans caractère ';' ? N = 3 >> N=3; >> n >> Message=[‘S.I.‘,num2str(N),’.’]; >> disp(Message) >> help disp % aide succincte % il y a un éditeur de ligne de commande % on a droit aux commandes de shell >> pwd, ls, dir, cd % lancer une application MSDOS !notepad % exécuter le script MATLAB ’sinus.m’ >> sinus % sinus.m doit être dans le PATH >> format long % 10 chiffres décimaux % effacer la fenêtre Command Window >> clc % noter l’instruction eval >> eval([‘la’,num2str(3),’=440’])  // En SCILAB, le prompt est ’’  // est un commentaire N=3  N=3; N  n Message=[’date’,string(28), ’septembre’]  disp(Message) help disp // il y a un éditeur de ligne commande pwd, dir, cd // lancer une application Windows ou Unix  unix(‘notepad.exe’) exécuter un script ou une fonction Scilab exec(’sinus.sce’) // fichiers .sce et .sci sinus // %pi format(20) clc execstr(’la3= 440;’); la3

Analyse du script tiré du fichier ‘sinus.m’ et traduction en Scilab % arpège de sons sinusoïdaux (Matlab) clear all; close all; Fe = 22050; h = 1/Fe; f0 = 220; T = 1.5; N = 13; fr = f0*[1:1:N]; am = 1; x = []; for k = 1:N % création d'une enveloppe tr = T*[0 .02 .98 1]; yr = [0 1 1 0]; env = envelop(tr,yr,Fe); % création du signal sinusoïdal th = 0:h:T; s = sin(2*pi*fr(k)*th); % application de l’enveloppe y = s.*env; % concaténation x = [x, am*y]; T = T*.8; am = am*.8; end plot(x) wavplay(x, Fe); wavwrite(x, Fe, './sinus.wav'); % arpège de sons sinusoïdaux (Matlab) clear all; close all; Fe = 22050; h = 1/Fe; f0 = 220; T = 1.5; N = 13; fr = f0*[1:1:N]; am = 1; x = []; for k = 1:N % création d'une enveloppe tr = T*[0 .02 .98 1]; yr = [0 1 1 0]; env = envelop(tr,yr,Fe); % création du signal sinusoïdal th = 0:h:T; s = sin(2*pi*fr(k)*th); % application de l’enveloppe y = s.*env; % concaténation x = [x, am*y]; T = T*.8; am = am*.8; end plot(x) wavplay(x, Fe); wavwrite(x, Fe, './sinus.wav'); // arpège de sons sinusoïdaux (Scilab) clear all; close all; Fe = 22050; h = 1/Fe; f0 = 220; T = 1.5; N = 13; fr = f0*(1:N); am = 1; exec('envelop.sce'); x = []; for k = 1:N tr = T*[0 .02 .98 1]; yr = [0 1 1 0]; env = envelop(tr,yr,Fe); th = 0:h:T; y = sin(2*%pi*fr(k)*th).*env; x = [x, am*y]; T = T*.8; am = am*.8; end plot2d(x) sound(x,Fe); wavwrite(x,Fe,'./scilabsinus.wav');

Analyser la fonction Matlab ‘cloche’ tirée du fichier ‘cloche.m’ function s = cloche(f1,T,Fe) % s = cloche(f1,T,Fe) % imitation d'une cloche % f1 = fréquence du principal % Fe = fréquence d'échantillonnage % T = durée du son %----------------------------------------- h = 1/Fe; th = 0:h:T; f = f1*[0.5 1 1.188 1.530 2.0000 2.470 2.607 ... 2.650 2.991 3.367 4.137 4.487 4.829 5.385 ... 5.863 6.709 8.077 8.547 9.017 9.530 ... 11.026 12.393]; a = [350 950 500 150 700 100 250 370 1000 180 ... 300 100 150 300 100 100 50 20 10 ... 35 5 15]; s = synthad(a,f,0*f,T,Fe); t = T*[0 .001 .01 .4 .6 .9 1]; a = [0 .6 1 .4 .2 .1 0]; env = envelop(t,a,Fe); s = s.*env; End % optionnel Ligne d’en tête Commentaire accessible dans l’aide vecteur des fréquences harmoniques vecteur des amplitudes des composantes fréquentielles allure de la courbe d'enveloppe a(t) a 1 0.6 0.4 0.6 t

Analyser la fonction synthad tirée du fichier synthad.m function s = synthad(a,f,p,T,Fe) % s = synthad(a,f,p,T,Fe) % synthèse additive % cette fonction crée un son de duree T, % compose des partiels f(n), d'amplitude a(n) % et de phase a l'origine p(n). % Fe est la fréquence d'échantillonnage %--------------------------------------- % création du vecteur temps discret dt = 1/Fe; t = 0:dt:T; n = length(t); % création du son, une boucle ajoute une a une % les composantes fréquentielles s = zeros(1,n); K = length(f); for k = 1:K s = s+a(k)*sin(2*pi*f(k)*t+p(k)); end % normalisation pour que les valeurs % restent dans l'intervalle [-0.99 0.99] s = .99*s/max(abs(s)); cumul des harmoniques trouvés dans les vecteurs a : amplitude, f : fréquence et p : phase maximum de s ramené à 0.99*max(abs(s))

Analyser la fonction envelop utilisée dans sinus.m et cloche.m function env = envelop(t,a,Fe) % enveloppe parametree par t et a = env(t), % t contient une liste d'instants t_k % a contient la liste des amplitudes a_k aux instants t_k % env est le son echantillonne a la frequence Fe, % affine par morceaux, tel que env(t_k) = a_k %-------------------------------------------------------- lt = length(t); T = t(lt); h = 1/Fe; th = 0:h:T; % test validite de t if t(1) >= T error('t incompatible dans envelop'); end % test compatibilite t et a if lt ~= length(a) error('t et a de longueurs différentes'); % au cas ou t ne serait pas strictement croissant : for k = 2:lt-1 if (t(k) <= t(k-1)) | (t(k) >= t(lt)) t(k) = (t(k-1)+t(lt))/2; n = length(th); env = zeros(1,n); ni = lt-1; c = zeros(1,ni+1); b = c; h2 = 0; for k = 1:ni h1 = h2+1; h2 = 1+floor(t(k+1)/h); cb = [t(k) 1; t(k+1) 1]\[a(k) ; a(k+1)]; c = cb(1); b = cb(2); env(h1:h2) = c*th(h1:h2)+b; env = .99*env/max(env); t(k) t(k+1) a(k) a(k+1) a t a= c*t+b pour t(k) < t <t(k+1) Que valent c et b ? Résoudre a(k)=c*t(k)+b a(k+1)=c*t(k+1)+b A\B calcule la solution x de A*x = B on s'en sert ici pour trouver les coefficients directeurs c et b de l'enveloppe entre t(k) et t(k+1)

Utiliser la fonction ‘cloche’ dans le script ‘gammes’ Que réalise le script gammes ? Comment procède t’on pour créer la gamme ? % tiré du fichier gammes.m clear all % clavier azerty : notes = ['a','z','e','r','t','y','u','i','o','p', … 'q','s', 'd']; Fe = 22050; f0 = 440; % la3 est la première note temp = 2.^((0:12)/12); % fr = f0*temp; % fréquence des notes de la3 à la4 T = 1.5; % durée des notes for k = 1:13 % on crée des notes de flute note = notes(k); eval([note '= cloche(fr(k),T,Fe);']); %ou flute end % et on joue : disp('pour jouer, rentrez une note parmi :'); disp('entrer a z e r t y u i o p q s ou d, suivi de enter'); x = 0; % taper x pour terminer note = [1,1]; % length(note)= ? while length(note) >1 note = input('note suivante? (x pour terminer)'); if length(note) == 1 disp('termine'); break soundsc(note,Fe); % met l'amplitude à l'échelle efface tout vecteur ligne de caractères … continuateur de ligne ‘a’  note pour k=1 Pour k=1, eval exécute : a = cloche(fr(1),T,fe); soundsc ramène le signal entre -1 et 1 et le joue

Et si vous préférez la flute, comment utiliser le fichier ‘flute.m’? function s = flute(f1,T,Fe) % s = flute(f1,T,Fe) % son flute %---------------------------------------------------- h = 1/Fe; th = 0:h:T; nt = length(th); a = [1000 50 80 10 5 2 .1 1]; nh = length(a); N = 1:nh; % synthèse additive du spectre f = N*f1; s = synthad(a,f,0*f,T,Fe); % enveloppe t = T*[0 .1 .2 .9 1]; a = [0 .8 1 .8 0]; env = envelop(t,a,Fe); s = s.*env; % ajout de souffle br = bruit(T,Fe); fn = f1/Fe*2; wn = (fn*[.8 1]).^(2); b = fir1(50,wn); br = filter(b,1,br); t = T*[0 .05 .8 1]; a = [0 1 .5 0]; br = br.*env; s = s+br/7; s = s/(max(abs(s)));

Traduction de gammes.m en Scilab dans gammes.sce //----------------------------//-------------------------------- // on fabrique une gamme chromatique au clavier //------------------------------------------------------------- clear all getf("envelop.sci"); getf("synthad.sci"); getf("cloche.sci"); // clavier azerty : notes = ['a','z' 'e' 'r' 't' 'y' 'u' 'i' 'o' 'p' 'q' 's' 'd']; Fe = 22050; f0 = 440; // la3 est la première note temp = 2.^((0:12)/12); // fr = f0*temp; // fréquence des notes de la3 à la4 T = 1.5; // durée des notes for k = 1:13 // on crée des notes de flute note = notes(k); execstr( strcat([note,'= cloche(fr(k),T,Fe);'])); // ou flute, ou orgue end // et on joue : disp('pour jouer, rentrez une note parmi :'); disp('entrer a z e r t y u i o p q s ou d, suivi de enter'); x = 0; // taper x pour terminer note = a; // length(note)= ? while length(note) >1 note = input('note suivante ?'); if length(note) == 1 disp('termine'); break sound(note,Fe); // met l'amplitude du son à l'échelle La fonction getf obsolète est remplacée par exec exec("envelop.sci"); // par exemple

Utiliser le type ‘cell’ de Matlab, exemple de ‘creegammes.m’ %% créer des notes et des airs avec les cellules gamme={'do','dod','re','red','mi','fa','fad','sol','sold','la','lad','si'}; dt=power(2,1/12); for g=1:5 frla=110*2^(g-1); for n=1:length(gamme) eval([gamme{n},num2str(g),'=frla*dt^(n-10);']) end %%créer une mélodie jouer(la3,.3,1); jouer(si3,.3,0.75); jouer(dod4,.3,0.5); jouer(mi4,.3,.5); jouer(re4,.3,.5); jouer(fad4,.3,1); jouer(mi4,.3,1); jouer(mi4,.6,1); jouer(la4,.4,1); jouer(sold4,.4,1); jouer(la4,.8,1);

Voici la fonction jouer utilisée par le script creegammes (jouer.m) function note=jouer(fr,Dur,amp,Fs) % jouer possède 4 arguments, fr est la fréquence de la note % dur sa durée en seconde, ampl son amplitude initiale, et Fs % la fréquence d'échantillonnage. L'enveloppe est linéaire. % Par défaut, fr= 440Hz, Dur= 1s, amp= 1, et Fs= 8000Hz. % En l'absence d'argument de sortie, la note créée est jouée. f=440; D=1; a=1; fe=8000; switch nargin case 1 f=fr; case 2 D=Dur; case 3 a=amp; case 4 fe=Fs; end % construire la note t=[0:1/fe:D]; note=a*sin(2*pi*f*t).*(1-t/D); if nargout==0 wavplay(note,fe) Traduction Scilab de jouer.m dans jouer.sce : function note=jouer(fr, Dur, amp, Fs) // fr est la fréquence de la note, Dur est sa durée en seconde, // ampl est son amplitude, Fs la fréquence d'échantillonnage. // enveloppe linéaire, fr=440Hz, Dur=1s, amp=1, Fs=8kHz nbin=argn(2); //nbout=argn(1);//marche pas, toujours égal à 1 ??? f=440; D=1; a=1; fe=8000; select nbin case 1 then f=fr; case 2 then D=Dur; case 3 then a=amp; case 4 then fe=Fs; end t=[0:1/fe:D]; note=a*sin(2*%pi*f*t).*(1-t/D); // tester nbout pour reproduire nargout endfunction

calculer et afficher le spectre avec Matlab %% paramétrage N=1024 Fe=44100 D=2; f1=880; %% son de cloche s=cloche(f1,D,Fe); wavplay(s,Fe) %% spectre fr=[0:N-1]*Fe/N; sp=abs(fft(s,N))/N; plot(fr(1:N/2),sp(1:N/2)) grid xlabel('fréquence Hz') ylabel('spectre') title(['spectre', num2str(N), ... ' points'])

Afficher le spectrogramme avec Matlab %% spectrogramme d'un arpège s=cloche(f1,D,Fe); s=[s,cloche(5*f1/8,D,Fe),... cloche(3*f1/4,D,Fe)]; wavplay(s,Fe) spectrogram(s,N,0,N,Fe,'yaxis') colorbar % cf. spectrogramme ci-contre  %% idem pour un accord acc= cloche(f1,D,Fe)+ ... cloche(5*f1/4,D,Fe)+ ... cloche(3*f1/2,D,Fe); acc= 0.99*acc/max(abs(acc)); wavplay(acc,Fe) spectrogram(acc,N,0,N,Fe,'yaxis') colorbar % non tracé

Traduire le fichier creegammes.m en Scilab (creegammes.sce) //créer des notes et des airs avec les cellules gamme=['do','dod','re','red','mi','fa','fad','sol','sold','la','lad','si']; [nl,nc]=size(gamme); dt=2^(1/12); for g=1:5, frla=110*2^(g-1); for n=1:nc, execstr([gamme(n)+string(g)+'=frla*dt^(n-10);']) end //créer une mélodie exec('jouer.sce'); s=jouer(la3,.3,1); s=[s,jouer(si3,.3,0.75)]; s=[s,jouer(dod4,.3,0.5)]; s=[s,jouer(mi4,.3,.5)]; s=[s,jouer(re4,.3,.5)]; s=[s,jouer(fad4,.3,1)]; s=[s,jouer(mi4,.3,1)]; s=[s,jouer(mi4,.4,1)]; s=[s,jouer(la4,.4,1)]; s=[s,jouer(sold4,.4,1)]; sound(s,8000); savewave('majoie.wav',s,8000)

Traduction en Scilab des deux functions ‘synthad’ et ‘envelop’ function [env] = envelop(t,a,Fe) lt = length(t); T = t(lt); h = 1/Fe; th = 0:h:T; if t(1) >= T // test de validite de t error('t incompatible dans envelop'); end if lt ~= length(a) // test de compatibilité de t et a error('t et a de longueur différente dans envelop'); // au cas où t ne serait pas strictement croissant : for k = 2:lt-1 if (t(k) <= t(k-1)) | (t(k) >= t(lt)) t(k) = (t(k-1)+t(lt))/2; n = length(th); env = zeros(1,n); ni = lt-1; c = zeros(1,ni+1); b = c; h2 = 0; for k = 1:ni h1 = h2+1; h2 = 1+floor(t(k+1)/h); cb = [t(k) 1; t(k+1) 1]\[a(k) ; a(k+1)]; c = cb(1); b = cb(2); env(h1:h2) = c*th(h1:h2)+b; env = .99*env/max(env); endfunction function s = synthad(a,f,p,T,Fe) // s = synthad(a,f,p,T,Fe) // synthese additive // cette fonction cree un son de duree T, // compose des partiels f(n), d'amplitude a(n) // et de phase a l'origine p(n). // Fe est la frequence d'echantillonnage //--------------------------------------------- // creation du vecteur temps discret dt = 1/Fe; t = 0:dt:T; n = length(t); // creation du son, boucle pour ajouter une a une // les composantes frequentielles s = zeros(1,n); K = length(f); for k = 1:K s = s+a(k)*sin(2*%pi*f(k)*t+p(k)); end // normalisation pour que les valeurs soient // toutes dans l'intervalle [-0.99 0.99] s = .99*s/max(abs(s)); endfunction

Traduire pour Scilab le script Matlab dans ‘cloche.m’ function s = cloche(f1,T,Fe) // s = cloche(f1,T,Fe) // imitation d'une cloche // f1 = fréquence fondamentale // Fe = fréquence d‘échantillonnage // T = durée du son //--------------------------------------------- h = 1/Fe; th = 0:h:T; f = f1*[0.5 1 1.188 1.530 2.0000 2.470 2.607 2.650 2.991 ... 3.367 4.137 4.487 4.829 5.385 5.863 6.709 8.077 ... 8.547 9.017 9.530 11.026 12.393]; a = [350 950 500 150 700 100 250 370 1000 180 300 ... 100 150 300 100 100 50 20 10 ... 35 5 15]; s = synthad(a,f,0*f,T,Fe); t = T*[0 .001 .01 .4 .6 .9 1]; a = [0 .6 1 .4 .2 .1 0]; env = envelop(t,a,Fe); s = s.*env; endfunction

Analyser le script ci-dessous, et répondre aux questions posées function [sdet,fe]=note(fr, dure,a, fe) % la fonction permet de créer une note sinusoïdale d’amplitude a % de fréquence fr et de durée dure avec la fréquence d’échantillonnage fe % par défaut, fr=440Hz, si a n'est pas précisé, a=0.75, % dure=1 si non précisé, si fe n'est pas précisé, fe=44100Hz % une enveloppe exponentielle est attachée à la note créée % la note est jouée s'il n'y a pas d'argument de sortie % Noter : ce commentaire apparaît dans l’aide : help note if nargin==0, fr=440;dure=1;a=1; fe=44100; end if nargin ==1, dure=1;a=1;fe=44100; end if nargin ==2, a=1;fe=44100; end if nargin ==3, fe=44100; end temps=[0: 1/fe : dure]; env=exp(-temps/(dure/3)); sdet= a*cos(2*pi*temps*fr).*env; if nargout==0, wavplay(sdet, fe), stem(temps, sdet) xlabel('temps (s)'), ylabel('note'),grid end end % optionnel Quel doit être le nom du fichier qui le contient ? On saisit >> note; % dans la fenêtre de commande, quel est le résultat ? On saisit s=note; % Quel est le résultat ? Comment utiliser note pour créer un arpège puis pour créer un accord ? note.m arpege= [note(440), note(5*440/4), note(3*440/2), note(880,2,.5)]; accord= note(440)+note(5*440/4)+note(3*440/2);

L’éditeur de scripts de MATLAB Dock Taper edit, ou File/New/m-file, ou utiliser la barre d’outils. ‘%’ est le commentaire ‘%%’ permet de découper le script en cellules exécutables une par une Publish in html permet de faire un compte rendu en html des résultats du script (images comprises) F9 evaluate selection F5 run L’exécution du script ead.m depuis command window : >> ead seulement si le dossier contenant ead.m est dans le Path, ou dans le current directory File/Set Path, modifie le path : suivi de Add Folder puis Save, et Close En Scilab, faire exec(‘fichierScript’). Fichiers .sce, ou .sci, ou .txt, ou … Les fichiers scripts doivent être dans le répertoire de travail, ou il faut préciser leur chemin Publish html Execute Cell

Ajouter une fonction nouvelle dans MATLAB Matlab contient déjà des fonctions, telles que plot(), wavread() … l'utilisateur peut en ajouter, qui doivent respecter les mêmes règles : Si la fonction est nommée 'notepure', le fichier script doit se nommer 'notepure.m' notepure.m doit se trouver dans le Path !! On appelle ‘notepure’ depuis un script ou après le prompt de commande avec : notepure(‘la3.wav’, 0.5, 440, 1.5); s = notepure(‘si.wav’, 0.5, 440, 1.5); Le nombre d'arguments donnés à l'appel d'une fonction peut varier, c'est Matlab qui gère : plot(t,s), plot(s), ou encore h=plot(t,s1,t,s2) Les deux variables 'nargin' et 'nargout' transmettent à la fonction appelée le nombre d'arguments d’entrée et de sortie spécifiés lors de l'appel. Dans Scilab, il faut exécuter l’instruction exec(‘monFichierScript’) pour pouvoir appeler les fonctions définies dans monFichierScript la dernière ligne ‘endfunction’ est obligatoire