Créer des signaux audio en temps discret avec Scilab

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

1 Jean-Paul Stromboni, mars 2005, Révision des cinq premières séances S.S.I. Jean-Paul Stromboni, mars 2005, ESSI1 Elève : ______________________ groupe.
S.S.I., ESSI1, lundi 9 mai 2005 Page 1 Comment compresser avec le spectre Séance 10, 1 heure Version : lundi 9 mai 2005 Auteur : Jean-Paul Stromboni Contenu.
S.S.I., ESSI1, samedi 10 avril 2004 Page 1 Comment tailler les filtres sur mesure Séance 8, nouvelle application des filtres, 1 heure Version : samedi.
Comment créer des filtres d’ordre 1 et 2
Comment calculer le spectre d’un signal audio
Cours 5 – Comment bien échantillonner le signal audio
Comment décimer les sons numériques
1 Jean-Paul Stromboni, octobre 2007, SI3 Réviser le devoir surveillé n°1 du cours S.S.I.I. Jean-Paul Stromboni, octobre 2007, SI3 Elève : ______________________.
Calcul de la composition fréquentielle du signal audio
1 Jean-Paul Stromboni, mars 2005, Révision des cinq premières séances S.S.I. Jean-Paul Stromboni, mars 2005, ESSI1 Elève : ______________________ groupe.
Chapitre 3: Système d’exploitation
Objectifs Présentation et utilisation du langage PERL
Comment créer des filtres « simples »
Comment compresser avec le CODEC mlaw
Créer des interfaces avec Matlab.
Extraits choisis du cours S.S.I.I.
AutoBilan MATLAB – SSII – SI3 – sept 2009 Page 1 Quel est leffet de linstruction ? Répondez ci-dessous Ok ? D=1; fe=1000 num2str(fe) num2str(d) ['la valeur.
Traiter le signal audio numérique avec Matlab ou Scilab
FLSI602 Génie Informatique et Réseaux
MATLAB Initiation à Matlab.
Sous-échantillonner le signal audio pour compresser
1 PolytechNice-Sophia, Département S.I., S.I.3, octobre 2012, Jean-Paul Stromboni Séance 7 : Retour sur les cinq premiers chapitres du cours S.S.I.I.
Exploitation avec Excel.
Sauver un signal audio numérique dans un fichier wave
INTRODUCTION A MATLAB ENVIRONNEMENT MATLAB.
Extraits choisis du cours S.S.I.I.
Calcul et programmation au lycée avec Scilab
4. Energie dinteraction, application à la reconnaissance de forme (texte, parole, radar …) Energie dun signal, analogie avec lélectrocinétique Par analogie.
Quelques algorithmes sur calculatrices
S.S.I.I., , n°7 : Construire et utiliser un banc de filtres Page 1 Construire et utiliser un banc de filtres pour analyser le spectre dun signal.
Cours S.S.I.I., , n°8, Créer des filtres pour compresser Cours S.S.I.I., , n°8, : Créer des filtres pour compresser Page 1 Mise en œuvre.
5. Echantillonnage Introduction
SSII : séance finale , lundi 9/01/2012 Page 1 Voici quelques questions pour assimiler la seconde partie du cours S.S.I.I., spectre, filtrage, banc.
S.S.I.I., , cours n°8 : Compresser avec un banc de filtres Page 1 Compresser avec un banc de filtres Le contenu de ce cours : T.D. n° 8 : simulation.
Outils de Programmation
FICHIERS : Définition : Algorithme général:
S.S.I.I., , n°6, Créer des filtres sur mesure pour compresser S.S.I.I., , n°6, : Créer des filtres sur mesure pour compresser 1 Créer un.
1 par Jean-Paul Stromboni, octobre 2008 Un autobilan pour réviser le devoir surveillé n°1 du cours S.S.I.I., par Jean-Paul Stromboni, octobre 2008 Elève.
Un principe de compression d’image
1 Jean-Paul Stromboni, octobre 2007, SI3 Réviser le devoir surveillé n°1 du cours S.S.I.I. Jean-Paul Stromboni, octobre 2007, SI3 Elève : ______________________.
Filtrer le signal audio numérique
Un moyen de compresser le signal audio présenté à travers un exemple
S.S.I., ESSI1, le 8 février 2004 Page 1 Numériser le signal audio Séance 2, cours, 1 heure auteur : Jean-Paul Stromboni Idées clefs de la séance De nombreuses.
1 Insérez ici votre logo Insert here your logo! ANNEXES de TICE 2002 Un cours pour introduire le traitement du signal à laide de lordinateur multimédia.
1 Introduction au module S.S.I. Signaux et Systèmes pour lInformatique le thème et les motivations du module S.S.I. les connaissances et le savoir faire.
Algèbre linéaire (GCI –100)
SCIENCES PHYSIQUES ET CHIMIQUES FONDAMENTALES ET APPLIQUEES
Utilisation avancée de linux
Utiliser le spectre et la transformée de Fourier
PHP & My SQL.
Faculté I&C, Claude Petitpierre, André Maurer Scalable vector graphics SVG (documentation en français – voir menu.
- énergie bornée (tend vers 0 lorsque
Introduction.
Energie d’un signal, énergie d’interaction, analogie avec l’électrocinétique
Digitaliser des images
Bienvenue dans Audacity
Cours S.S.I.I., , n°7, Créer des filtres pour compresser Cours S.S.I.I., , n°7, : Créer des filtres pour compresser Page 1 Retour sur le.
Extraits choisis du cours S.S.I.I.
Analyse spectrale Raphaël ARROUAS Etienne OUSS
Matlab (Matrix Laboratory)
Contenu du cours : Principe de la commande par retour d'état
Calcul de la composition fréquentielle du signal audio
Master 1 SIGLIS Java Lecteur Stéphane Tallard Correction du TD Chapitre 3.
** Flash séance 2 Action script. ** Action Script Ajoute de l’interactivité Permet de contrôler les clips  Langage de programmation orienté objet.
SSII, séance n°13, bilan du cours 15 décembre 2015 Dernière séance 2015 Résumé des chapitres et notions abordées en 2015.
A.Aarabi ´. ´ Objectifs Faciliter la prise en main du logiciel MATLAB Présenter les fonctionnalités utiles au travail scientifique.
Matlab (Matrix Laboratory) Langage de programmation évolué. Traitement direct d’opérations matricielles, dont l’inversion et l’analyse d’opérateurs ou.
O UTILS DE P ROGRAMMATION P OUR LES M ATHÉMATIQUES Mr. BENDIB. I MAA, LAMIS Laboratory, Université Larbi Tébessi - Tébessa.
Utiliser Scilab pour analyser les signaux audio
Transcription de la présentation:

Créer des signaux audio en temps discret avec Scilab Jean-Paul Stromboni, Polytech'Nice-Sophia, Dépt Sciences Informatiques, SI3 Durée 50 minutes, avec Scilab, un vidéo projecteur, des hauts parleurs Après ce chapitre, vous devez savoir comment : 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, … 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 …

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.

Bureau et environnement de travail proposé par Scilab 5.4.1

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) 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’])

Créer et gérer des signaux dans des tableaux avec Scilab

Créer et afficher des signaux audio discrets avec plot2d

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

Créer un son de cloche (fonction ‘cloche’ du fichier ‘cloche.sci’) 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 Ligne d’en tête Commentaire accessible dans l’aide Matlab p >>help cloche (mais pas en Scilab) vecteur des fréquences, composition harmoniques vecteur des amplitudes des composantes fréquentielles allure de la courbe d'enveloppe a(t) pour T=1 s

Analyser de la fonction ‘synthad’ du fichier ‘synthad.sce’ 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 discret dt = 1/Fe; t = 0:dt:T; n = length(t); // création du son, boucle pour ajouter une à 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 soient // toutes dans l'intervalle [-0.99 0.99] s = .99*s/max(abs(s)); endfunction 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

Fonction ‘envelop’ utilisée dans le script ‘sinus’ et dans la fonction ‘cloche’ 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'); // 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; 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; env = .99*env/max(env); endfunction t(k) t(k+1) a(k) a(k+1) a t 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 b a(k)=c*t(k)+b a(k+1)=c*t(k+1)+b A\B calcule la solution x de A*x = B, soit x=A-1*B on 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)];

Que réalise le script ‘gammes’ à l’aide de la fonction ‘cloche’ ? // on joue une gamme chromatique au clavier clear all exec("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 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 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 terminer note = a; // length(note)= ? while length(note) >1 note = input('note suivante ?'); if length(note) == 1 disp('termine'); break sound(note,Fe); efface toutes les variables précédemment définies vecteur ligne de caractères ‘a’  note pour k=1 Pour k=1, ‘execstr’ exécute : a = cloche(fr(1),T,fe); T*Fe échantillons ‘sound’ joue ‘note’ à la fréquence Fe

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

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

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

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

Utiliser les fonctionnalités des figures Scilab Exporter la figure Rotation 2D/3D Figure and Axes properties zoom Data tips lire coordonnées