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

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 • 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, … Jean-Paul Stromboni, Polytech'Nice Sophia, Dpt Sciences Informatiques, SI3 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 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 … 2011-12, 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 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. 2011-12, S.S.I.I., SI3, séance 3, Traiter le signal audio numérique avec Matlab ou Scilab, page 3 Se repérer dans l’environnement 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 2011-12, 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 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)  %pi  clc  execstr(’la3= 440;’);  la3 2011-12, 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*[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'); % 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'); 2011-12, 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*[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 vecteur des fréquences harmoniques vecteur des amplitudes des composantes fréquentielles allure de la courbe d'enveloppe a(t) t a 1 0.6 0.6 0.4 0 Ligne d’en tête Commentaire accessible dans l’aide 2011-12, 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 [-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)) 2011-12, 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(k-1)) | (t(k) >= t(lt)) t(k) = (t(k-1)+t(lt))/2; end 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 <t(k+1) Que valent c et b ? Résoudre a(k)=c*t(k)+b a(k+1)=c*t(k+1)+b t(k) t(k+1) a(k) a(k+1) a t 2011-12, 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 uploads/s3/ matlab 2 .pdf

  • 22
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager