La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

2011-12, S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 1 Traiter le signal audio numérique avec Matlab ou Scilab.

Présentations similaires


Présentation au sujet: "2011-12, S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 1 Traiter le signal audio numérique avec Matlab ou Scilab."— Transcription de la présentation:

1 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 1 Traiter le signal audio numérique avec Matlab ou Scilab utiliser lenvironnement 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 dharmoniques et dotés denveloppes, reproduire le timbre dinstruments de musique tracer des chronogrammes, des spectres, des spectrogrammes, … 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 : 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 …

2 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 2 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 dinstallation) Pour utiliser hors de lécole, on suggère dinstaller également Scilab (à télécharger sur 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 : avec laccord de Philippe Guillaume, Professeur à l'INSA de Toulouse, et auteur de louvrage : 'Musique et Acoustique : de linstrument à lordinateur', collection Hermès, éditeur Lavoisier.

3 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 3 Se repérer dans lenvironnement MATLAB (celui de Scilab plus simple contient la plupart des outils de calcul et de tracé) fenêtre plot dossier travail fenêtre edit fenêtre de commande.m file Publish in html

4 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 4 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 linstruction 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) %pi clc execstr(la3= 440;); la3

5 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 5 Analyse du script tiré du fichier sinus.m et traduction en Scilab // 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*[ ]; yr = [ ]; 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'); % 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*[ ]; yr = [ ]; env = envelop(tr,yr,Fe); % création du signal sinusoïdal th = 0:h:T; s = sin(2*pi*fr(k)*th); % application de lenveloppe 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*[ ]; yr = [ ]; env = envelop(tr,yr,Fe); % création du signal sinusoïdal th = 0:h:T; s = sin(2*pi*fr(k)*th); % application de lenveloppe 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');

6 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 6 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*[ ]; a = [ ]; s = synthad(a,f,0*f,T,Fe); t = T*[ ]; a = [ ]; env = envelop(t,a,Fe); s = s.*env; End % optionnel vecteur des fréquences harmoniques vecteur des amplitudes des composantes fréquentielles allure de la courbe d'enveloppe a(t) t a Ligne den tête Commentaire accessible dans laide

7 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 7 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 [ ] 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))

8 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 8 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'); end % au cas ou t ne serait pas strictement croissant : for k = 2:lt-1 if (t(k) = t(lt)) t(k) = (t(k-1)+t(lt))/2; end 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; end env =.99*env/max(env); 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) a= c*t+b pour t(k) < t

9 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 9 Utiliser la fonction cloche dans le script gammes % 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 end soundsc(note,Fe); % met l'amplitude à l'échelle end Que réalise le script gammes ? Comment procède ton pour créer la gamme ? vecteur ligne de caractères … continuateur de ligne efface tout 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

10 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 10 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 = [ ]; 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*[ ]; a = [ ]; 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*[ ]; a = [ ]; env = envelop(t,a,Fe); br = br.*env; s = s+br/7; s = s/(max(abs(s)));

11 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 11 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 end sound(note,Fe); // met l'amplitude du son à l'échelle end La fonction getf obsolète est remplacée par exec exec("envelop.sci"); // par exemple

12 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 12 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);

13 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 13 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 f=fr; D=Dur; case 3 f=fr; D=Dur; a=amp; case 4 f=fr; D=Dur; a=amp; 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) end 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 f=fr; D=Dur; case 3 then f=fr; D=Dur; a=amp; case 4 then f=fr; D=Dur; a=amp; fe=Fs; end t=[0:1/fe:D]; note=a*sin(2*%pi*f*t).*(1-t/D); // tester nbout pour reproduire nargout endfunction

14 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 14 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'])

15 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 15 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é

16 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 16 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)]; s=[s,jouer(la4,.4,1)]; sound(s,8000); savewave('majoie.wav',s,8000)

17 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 17 Traduction en Scilab des deux functions synthad et envelop 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 [ ] s =.99*s/max(abs(s)); endfunction 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'); end // au cas où t ne serait pas strictement croissant : for k = 2:lt-1 if (t(k) = t(lt)) t(k) = (t(k-1)+t(lt))/2; end 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; end env =.99*env/max(env); endfunction

18 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 18 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*[ ]; a = [ ]; s = synthad(a,f,0*f,T,Fe); t = T*[ ]; a = [ ]; env = envelop(t,a,Fe); s = s.*env; endfunction

19 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 19 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 damplitude 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 laide : 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 ? 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); note.m

20 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 20 Léditeur de scripts de MATLAB Taper edit, ou File/New/m-file, ou utiliser la barre doutils. % 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 Lexé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 Dock

21 , S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 21 Ajouter une fonction nouvelle dans MATLAB 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), lot(s), – ou encore h=plot(t,s1,t,s2) Les deux variables 'nargin' et 'nargout' transmettent à la fonction appelée le nombre d'arguments dentrée et de sortie spécifiés lors de l'appel. Dans Scilab, il faut exécuter linstruction exec(monFichierScript) pour pouvoir appeler les fonctions définies dans monFichierScript la dernière ligne endfunction est obligatoire Matlab contient déjà des fonctions, telles que plot(), wavread() … l'utilisateur peut en ajouter, qui doivent respecter les mêmes règles :


Télécharger ppt "2011-12, S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 1 Traiter le signal audio numérique avec Matlab ou Scilab."

Présentations similaires


Annonces Google