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 …
21
Embed
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 :. Traiter le signal audio numérique avec Matlab ou Scilab. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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, SI3Jean-Paul Stromboni, Polytech'Nice Sophia, Dpt Sciences Informatiques, SI3Durée 50 minutes, avec Matlab/Scilab, un vidéo projecteur, et des hauts parleursDuré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
// 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;endplot(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;endplot(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 ...
vecteur des amplitudes des composantes fréquentielles
allure de la courbe d'enveloppe a(t)
t
a
1
0.6
0.60.40
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 discretdt = 1/Fe;t = 0:dt:T;n = length(t);% création du son, une boucle ajoute une a une% les composantes fréquentielless = 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 tif 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; endendn = 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;endenv = .99*env/max(env);
A\B calcule la solution x de A*x = Bon 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ésoudrea(k)=c*t(k)+ba(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’
'q','s', 'd'];Fe = 22050;f0 = 440; % la3 est la première notetemp = 2.^((0:12)/12); % fr = f0*temp; % fréquence des notes de la3 à la4 T = 1.5; % durée des notesfor 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 terminernote = [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'échelleend
Que réalise le script gammes ? Comment procède t’on pour créer la gamme ?
vecteur ligne de caractères… continuateur de ligne
efface tout
‘a’ note pour k=1Pour k=1, eval exécute : a = cloche(fr(1),T,fe);
soundsc ramène le signal entre -1 et 1 et le joue
2011-12, 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’?
2011-12, 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 allgetf("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 notetemp = 2.^((0:12)/12); // fr = f0*temp; // fréquence des notes de la3 à la4 T = 1.5; // durée des notesfor 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 terminernote = 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'échelleend
La fonction getf obsolète est remplacée par execexec("envelop.sci"); // par exemple
2011-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 cellulesgamme={'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);']) endend %%créer une mélodiejouer(la3,.3,1);jouer(si3,.3,0.75);jouer(dod4,.3,0.5);jouer(mi4,.3,.5);jouer(re4,.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);
2011-12, 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 notet=[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=8kHznbin=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;endt=[0:1/fe:D];note=a*sin(2*%pi*f*t).*(1-t/D);// tester nbout pour reproduire nargout endfunction
2011-12, 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étrageN=1024Fe=44100D=2;f1=880;
2011-12, 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 cellulesgamme=['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);']) endend//créer une mélodieexec('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(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)
2011-12, 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 discretdt = 1/Fe;t = 0:dt:T;n = length(t);// creation du son, boucle pour ajouter une a une// les composantes frequentielless = 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
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'); endif 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(k-1)) | (t(k) >= t(lt)) t(k) = (t(k-1)+t(lt))/2; endendn = 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;endenv = .99*env/max(env);endfunction
2011-12, 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//---------------------------------------------
2011-12, 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 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 noteif nargin==0, fr=440;dure=1;a=1; fe=44100; endif nargin ==1, dure=1;a=1;fe=44100; endif nargin ==2, a=1;fe=44100; end if nargin ==3, fe=44100; endtemps=[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'),gridendend % 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 ?