Você está na página 1de 12

Le traitement du signal audio numrique avec MATLAB

Jean-Paul Stromboni, Polytech'Nice Sophia, Dpt Sciences Informatiques, SI3 Dure 50 minutes, avec Matlab, un vido projecteur, et des hauts parleurs

Aprs cette sance, vous devez savoir comment :


crer et excuter des scripts et des fonctions MATLAB crer des signaux audio numriques avec MATLAB tracer et exploiter des chronogrammes lire et sauver des fichiers au format Wave traiter des signaux audio numriques (dcouper, multiplier, ajouter, mettre l'chelle, )

aprs les travaux dirigs vous devez savoir :


utiliser MATLAB pour synthtiser, jouer, afficher, lire et sauver, analyser, les signaux audio numriques.
2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 1

Exprimenter MATLAB est un objectif du cours S.S.I.I.


MATLAB (MATrix LABoratory) est un logiciel rput dans le domaine du calcul scientifique. MATLAB inclut un langage de script Pour apprendre programmer les scripts MATLAB, on analyse des exemples tirs de :
http://www-gmm.insa-toulouse.fr/~guillaum/AM/ par Philippe Guillaume, professeur l'INSA de Toulouse, et auteur de 'Musique et Acoustique : de linstrument lordinateur', collection Herms, diteur Lavoisier.

SCILAB de lINRIA (http://www.scilab.org) libre, gratuit, multiplateforme, est voisin de MATLAB.


2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 2

Se reprer dans lenvironnement de travail de MATLAB


dossier travail

fentre plot Publish in html fentre edit

fentre de commande

.m file

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 3

les enseignements du script sinus.m


Pour excuter le script, et si sinus.m se trouve dans l'environnement de travail ou dans le path, saisir : >> sinus % arpge de sons sinusodaux clear all; close all; Fe = 22050; h = 1/Fe; f0 = 220; T = 1.5; N = 13; fr = f0*(1:N); am = 1; x = []; for k = 1:N % creation d'une enveloppe tr = T*[0 .02 .98 1]; yr = [0 1 1 0]; env = envelop(tr,yr,Fe); th = 0:h:T; % mise bout a bout de sinus y = sin(2*pi*fr(k)*th).*env; x = [x, am*y]; T = T*.8; am = am*.8; end plot(x) sound(x,Fe); wavwrite(x,Fe,'./101sinus.wav');

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 4

les enseignements du script sinus.m (suite et fin)


% arpge de sons sinusodaux clear all; close all; Fe = 22050; h = 1/Fe; f0 = 220; T = 1.5; N = 13; fr = f0*(1:N); am = 1; x = []; for k = 1:N % creation d'une enveloppe tr = T*[0 .02 .98 1]; yr = [0 1 1 0]; env = envelop(tr,yr,Fe); th = 0:h:T; % mise bout a bout de sinus y = sin(2*pi*fr(k)*th).*env; x = [x, am*y]; T = T*.8; am = am*.8; end plot(x) sound(x,Fe); wavwrite(x,Fe,'./101sinus.wav');

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 5

Analyse du fichier envelop.m et de la fonction envelop


function env = envelop(t,a,Fe) % 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 longueur differente dans envelop'); 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);

e= c*t+b entre t(k) et t(k+1) e(k)=c*t(k)+b e(k+1)=c*t(k+1)+b

A\B en Matlab trouve la solution x de Ax=B on s'en sert ici pour trouver les coefficients directeurs c et b de l'enveloppe entre tk et tk-1

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 6

Que contient le fichier synthad.m et comment l'utiliser ?


function s = synthad(a,f,p,T,Fe) % s = synthad(a,f,p,T,Fe) % synthese additive % cette fonction cre 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 frquence d'chantillonnage %--------------------------------------------% cration 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 frquentielles 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));

cumul des harmoniques trouvs dans les vecteurs a : amplitude f : frquence et p : phase maximum de s port 0.99 max(abs(s))

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 7

Que contient le fichier cloche.m et comment l'utiliser ?


function s = cloche(f1,T,Fe) % s = cloche(f1,T,Fe) % imitation d'une cloche % f1 = frquence du principal % Fe = frquence d'chantillonnage % T = dure 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;

... ...

vecteur des frquences harmoniques vecteur des amplitudes des composantes frquentielles

... ...

dfinition de la courbe d'enveloppe

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 8

calcul et affichage du spectre avec la fonction fft


%% paramtrage 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('frquence Hz') ylabel('spectre') title(['spectre', num2str(N), ... ' points'])
spectre1024 points 0.1

0.08

0.06

spectre

0.04

0.02

0 0 1 2 x 10 3
4

frquence Hz

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 9

affichage du spectrogramme ou spectre(temps)


%% spectrogramme d'un arpge 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
4

x 10 -40 2

-60 1.5 -80

Frequency (Hz)

-100

-120 0.5 -140

0 1 2 3 Time 4 5

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 10

Utiliser puis analyser le script dans gammes.m


Analysez le, et notez les explications dans le cadre de droite. Que ralise t'il ? Comment ? Comment changer d'instrument de musique ?
% 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 premire note temp = 2.^((0:12)/12); % fr = f0*temp; % frquence des notes de la3 la4 T = 1.5; % dure des notes for k = 1:13 % on cre 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

efface tout
vecteur ligne de caractres

revient excuter l'instruction : note = cloche(fr(k),T,Fe);

2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 11

Analyser le script ci-dessous, on compltera l'en-tte pour l'aide


function [sdet,fe]=note(fr, dure,a, fe) % la fonction permet de % par dfaut, fr= , a= , dure= et fe= % s'il n'y a pas d'argument de sortie, % Noter : ce commentaire apparat dans laide en faisant 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), end end .

Quel doit tre le nom du fichier qui le contient ? note.m On saisit >> note; % dans la fentre de commande, quel est le rsultat ? On saisit s=note; % Quel est le rsultat ? Comment utiliser note pour crer un arpge puis pour crer 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);
2009-10, cours S.S.I.I., SI3, sance 3 : Le traitement du signal audio numrique avec Matlab, page 12