16
2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab • utiliser l’interface de développement de Scilab (version 5.4.1.) : fenêtre de commande, éditeur de scripts, appel de fonction … • créer des signaux discrets dans les vecteurs et tableaux Scilab • écrire et utiliser scripts et fonctions Scilab • créer un signal audio composé d’harmoniques et doté d’une enveloppe, reproduire le timbre d’instruments de musique • tracer des chronogrammes, lire et écrire des fichiers wave, Jean-Paul Stromboni, Polytech'Nice-Sophia, Dépt Sciences Informatiques, SI3 Jean-Paul Stromboni, Polytech'Nice-Sophia, Dépt Sciences Informatiques, SI3 Durée 50 minutes, avec Scilab, un vidéo projecteur, des hauts parleurs Durée 50 minutes, avec Scilab, un vidéo projecteur, des hauts parleurs Après ce chapitre, vous devez savoir comment : Le TD n°3 utilise la dernière version de Scilab pour : synthétiser des signaux audio, tracer les chronogrammes, lire et écrire au format wave, créer des mélodies, etc …

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

Embed Size (px)

Citation preview

Page 1: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1

Créer des signaux audio en temps discret avec Scilab

• utiliser l’interface de développement de Scilab (version 5.4.1.) : fenêtre de commande, éditeur de scripts, appel de fonction …

• créer des signaux discrets dans les vecteurs et tableaux Scilab• écrire et utiliser scripts et fonctions Scilab• créer un signal audio composé d’harmoniques et doté d’une

enveloppe, reproduire le timbre d’instruments de musique• tracer des chronogrammes, lire et écrire des fichiers wave, …

Jean-Paul Stromboni, Polytech'Nice-Sophia, Dépt Sciences Informatiques, SI3Jean-Paul Stromboni, Polytech'Nice-Sophia, Dépt Sciences Informatiques, SI3Durée 50 minutes, avec Scilab, un vidéo projecteur, des hauts parleursDurée 50 minutes, avec Scilab, un vidéo projecteur, des hauts parleurs

Après ce chapitre, vous devez savoir comment :

Le TD n°3 utilise la dernière version de Scilab pour :

synthétiser des signaux audio, tracer les chronogrammes, lire et écrire au format wave, créer des mélodies, etc …

Page 2: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 2

Apprendre à utiliser Scilab est l’un des objectifs du cours S.S.I.I.

• Matlab (pour Matrix Laboratory) est un logiciel très connu et très utilisé dans le domaine du calcul scientifique industriel.

• On utilise ici Scilab qui n’a rien à lui envier, mais qui est :– libre et gratuit, open source, maintenu et évolutif, – doté d’une large communauté d’utilisateurs – utilisable hors de l’école et dans l’école, sous Windows et/ou Unix/Linux, – et très semblable à Matlab (les différences minimes seront signalées).

• Pour illustrer, on utilise des scripts Matlab traduits en Scilab, tirés de la page: http://www-gmm.insa-toulouse.fr/~guillaum/AM/ avec l’accord de l’auteur, Philippe Guillaume, Professeur à l'INSA de Toulouse, auteur de l’ouvrage :

'Musique et Acoustique : de l’instrument à l’ordinateur', collection Hermès, éditeur Lavoisier.

Page 3: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 3

Bureau et environnement de travail proposé par Scilab 5.4.1

Page 4: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 4

Comparer la ‘Console Scilab’ avec le ‘Matlab Command Window’

// En SCILAB, le prompt est ’’ // est un commentaire N=3 N=3; N n

Message=[’date’,string(28), ’septembre’]

disp(Message)

help disp //aide complète

// il y a un éditeur de ligne commande

pwd, dir, cd

// lancer une application Windows ou Unix dos(‘notepad.exe’) ou unix(‘notepad.exe’)

//exécuter un script ou une fonction Scilab exec(’sinus.sce’) // fichiers .sce et .sci sinus //sinus.sce doit être dans le path

%pi format(20) %pi

Clc string(N) //traduit N en chaîne de caractèr. // pour évaluer une chaîne de caractères : execstr(’la3= 440;’); la3

>> % 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

!notepad % lance une application MSDOS

% exécuter le script MATLAB ’sinus.m’

>> sinus % sinus.m doit être dans le PATH

>> pi

>> format long % 10 chiffres décimaux

% effacer la fenêtre Command Window

>> clc

>> num2str(3) %traduit 3 en chaîne de caractères

% noter l’instruction eval

>> eval([‘la’,num2str(3),’=440’])

Page 5: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 5

Créer et gérer des signaux dans des tableaux avec Scilab N=64; //échantillons Te=1/8000; //période échantillonnage (s) t=[0:1:N-1]*Te; //vecteur temps t(0) //erreur t(1) // 0 length(t) // 64 t(length(t)) // ou t($) 0.007875 size(t) // 1. 64. une ligne 64 colonnes size(t') // donne 64 lignes 1 colonne //signaux s1=0.5*cos(2*%pi*200*t); //fondamental size(s1) // = size(t) 1. 64 s3= 0.5*cos(2*%pi*600*t)/9; //harmonique 3 s5= 0.5*cos(2*%pi*1000*t)/25; //harmonique 5 //tableaux sig=[s1;s3;s5]; // size(sig) //= 3. 64. siglin=[s1,s3,s5]; // size(siglin) //= 1. 192. ? size(sig') // donne 64 3 // somme tri= sum(sig,1); // équiv. tri=s1+s3+s5; // produit composante à composante s1s3=s1.*s3; plot2d(t,s1s3) xtitle("Chronogramme de s1.*s3",'t(s)','s1s3') xgrid // sous échantillonnage M=2; sigssech=sig(:,1:M:length(t)); 1:M:length(t) // 1 3 5 7 ..... 63 size(sigssech)// 3 32

Page 6: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 6

Créer et afficher des signaux audio discrets avec plot2dN=64; //échantillons Te=1/8000; //période échantillonnage (s) t=[0:1:N-1]*Te; //instants d'échantillonnage s1=0.5*cos(2*%pi*200*t); //fondamental s3= 0.5*cos(2*%pi*600*t)/9; //harmonique 3 s5= 0.5*cos(2*%pi*1000*t)/25; //harmonique 5 plot2d(t,[s1',s3',s5'],[-4,-5,-9]) xtitle(["N=",string(N)],'t(s)','amplitude') xgrid() legends(['s1';'s2';"s5"],[-4,-5,-9],opt="ur")

Page 7: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 7

Analyse du script tiré du fichier ‘sinus.m’ et traduction en Scilab

// arpège de sons sinusoïdaux (sinus.sce)clear all; close all;Fe = 22050; h = 1/Fe; //f0 = 220; T = 1.5;N = 13;fr = f0*(1:N); // ou fr= f0*[1:1:N];am = 1;

exec('envelop.sce'); //

x = []; //

for k = 1:N tr = T*[0,.02, .98, 1]; yr = [0, 1, 1, 0]; // ou [0 1 1 0] ! env = envelop(tr,yr,Fe); th = 0:h:T;

y = sin(2*%pi*fr(k)*th); //y = y.*env; //

x = [x, am*y]; /// concaténation T = T*.8; am = am*.8;end

plot2d(x) xtitle(['arpège'],['temps (s)'],['signal audio']); legend('signal'); xgrid();

sound(x,Fe); // ou playsnd(x,Fe) wavwrite(x,Fe,'./scilabsinus.wav');

Page 8: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 8

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

Créer un son de cloche (fonction ‘cloche’ du fichier ‘cloche.sci’)

vecteur des fréquences, composition harmoniquesvecteur des amplitudes des composantes fréquentielles

allure de la courbe d'enveloppe a(t) pour T=1 s

Ligne d’en tête

Commentaire accessible dans l’aide Matlab p >>help cloche (mais pas en Scilab)

Page 9: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 9

Analyser de la fonction ‘synthad’ du fichier ‘synthad.sce’

cumul des harmoniques décrits dans les vecteurs a : amplitude, f : fréquence et p : phase

maximum de s ramené à 0.99 en valeur absolue

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//---------------------------------------------// création du vecteur temps discretdt = 1/Fe;t = 0:dt:T;n = length(t);// création du son, boucle pour ajouter une à 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 soient// toutes dans l'intervalle [-0.99 0.99]s = .99*s/max(abs(s));endfunction

Page 10: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 10

Fonction ‘envelop’ utilisée dans le script ‘sinus’ et dans la fonction ‘cloche’

A\B calcule la solution x de A*x = B, soit x=A-1*Bon s'en sert ici pour trouver les coefficients directeurs c et b de l'enveloppe entre t(k) et t(k+1) :Ligne : cb = [t(k) 1; t(k+1) 1]\[a(k) ; a(k+1)];

a= c*t+b pour t(k) < t <t(k+1)Que valent c et b ?Système de 2 équations à deux inconnues c et ba(k)=c*t(k)+ba(k+1)=c*t(k+1)+b

t(k) t(k+1)

a(k)

a(k+1)

a

t

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(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);endfunction

Page 11: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 11

Que réalise le script ‘gammes’ à l’aide de la fonction ‘cloche’ ?

vecteur ligne de caractères

efface toutes les variables précédemment définies

‘a’ note pour k=1Pour k=1, ‘execstr’ exécute : a = cloche(fr(1),T,fe);

‘sound’ joue ‘note’ à la fréquence Fe

// on joue une gamme chromatique au clavier clear allexec("envelop.sci");exec("synthad.sci");exec("cloche.sci");// clavier azerty :notes = ['a','z', 'e', 'r', 't', 'y', 'u', 'i','o', 'p','q', 's', 'd']; //Fe = 22050;f0 = 440; // la3 440 Hz 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 les tons et demi tons de la gamme note = notes(k); execstr( strcat([note,'= cloche(fr(k),T, Fe);'])); end// et on joue :disp('pour jouer, rentrez une note parmi :');disp(‘saisir a z e r t y u i o p q s ou d, puis enter, et x pour finir');x = 0; // saisir 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); end

T*Fe échantillons

Page 12: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 12

Créer des gammes et composer des mélodies (‘creegammes.sce’)//créer les notes jouer des mélodiesgamme=['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 un accord

//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)

Combien de gammes générées ici ?

Combien de notes par gamme ?

Comment fixe t’on le nom des notes ?

Que contient la variable la3 ?

Et la variable la4 ?

Utilité de l’instruction exec(‘jouer.sce’) ?

Sauriez vous écrire la fonction jouer ?

Page 13: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 13

Voici la fonction ‘jouer’ utilisée par le script ‘creegammes’

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); ne 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

Page 14: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 14

Comment utiliser la fonction ‘flute’ dans le script ‘gammes’?

function s = flute(f1,T,Fe)

// s = flute(f1,T,Fe)

// son flute

//----------------------------------------------------

h = 1/Fe; th = 0:h:T;

nt = length(th);

// composition fréquentielle

a = [1000 50 80 10 5 2 .1 1];

nh = length(a); N = 1:nh;

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 du souffle (bruit) ici supprimé

// ramener amplitudes entre 1 et -1

s = 0.99*s/(max(abs(s)));

endfunction

Page 15: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 15

Par exemple, on crée la note, on la joue, on trace le chronogramme et le spectre d’amplitude, comment reconnaître l’enveloppe et la composition fréquentielle

// charge les fonctions utilisées exec('jouer.sce'); exec('flute.sce'); exec('synthad.sce') exec('envelop.sce') fe=8000 s=flute(440,1,fe); // la3, 1s, fe= 8000Hz sound(s/3,fe) xsetech([0 ,0,1,1/2]); t=[0:length(s)-1]/fe; plot2d(t,s/3) xgrid xtitle('chronogramme de s','t(s)','signal') xsetech([0 ,1/2,1,1/2]) ; f=[0:length(s)-1]*fe/length(s); spectre=fft(s); plot2d(f,abs(spectre)) xtitle('spectre de s', 'f (Hz)', 'spectre') xgrid

Page 16: 2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 1 Créer des signaux audio en temps discret avec Scilab •utiliser

2013-14, S.S.I.I., SI3, séance 3, Créer des signaux audio en temps discret avec Scilab, page 16

Utiliser les fonctionnalités des figures Scilab

Exporter la figure

Rotation 2D/3D

Data tips lire coordonnées

Figure and Axes

properties

zoom