TP2: Traitement du son Techniques Multimédia
TECHNIQUES MULTIMÉDIA
TP2 : traitement du son
I.Reconstruction des signaux à partir de leur décomposition en série
de Fourier
1. Synthèse de la note « La » du violon
a) Application 1 : Représenter la note « La » pure : qui est un signal sinusoïdale « y » de
fréquence f0=440hz, fs=3000hz et de durée=1.5.
Ecouter le son :
Pour écouter un son stocké dans le vecteur y, où fs est la fréquence d’échantillonnage en Hertz on
utilise la commande suivante :
>> sound(y, fs) ;
Afficher le signal audio: on utilise la commande
>> plot(y) ; %Afficher dans une nouvelle fenêtre le signal audio y.
% arpège de sons sinusoïdaux (Matlab)
clear all; close all;
Fe = 4000;h = 1/Fe;
f0 = 440; T = 1.5;
% création du signal sinusoïdal
th = 0:h:T;
s = sin(2*pi*f0*th);
figure(1), plot(th(1:30),s(1:30))
%wavplay(x, Fe);
sound(s,Fe)
wavwrite(s, Fe, './sinus.wav');
Représenter le spectre du signal « y » avec la fonction « fft » qui permet de calculer
la transformée de fourier selon les commandes :
%***************************spectre************
%*************calcul de la transformée de fourrier
y=s;
Yfft=fft(y);
sp=abs(Yfft);% Calcul du module de la fft du signal
%***************% tracé du spectre d’amplitude entre [0;fe/2]
%*******définiir l'axe des fréquences
Te= 1/Fe;
fe=1/Te;
N=length(y);
fr= 0:(fe/N):(fe/2-fe/N);% determiner l’axe des fréquences-
figure(3),plot(fr,sp(1:(N/2)))
Page 1 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
grid on
b) Application 2 : sons purs
Générer trois autres sons purs : yi(t)= A sin(2 pi (i*f0)t). (A=0.5, f0=400hz).
Avec (f1=880hz, f2=1320hz, f3=1760hz ).
Proposer une fréquence d’échantillonnage pour chaque cas
Visualiser et Ecouter yi.
Fs1 = 1000; % Sampling frequency théorème de shanonon
fsampl>=2*f0
T1 = 1/Fs1; % Sampling period
%********
Fs2 = 2000; % Sampling frequency
T2 = 1/Fs2; % Sampling period
%******************
Fs3 = 3000; % Sampling frequency
T3 = 1/Fs3; % Sampling period
%*ù*******
Fs4 = 4000; % Sampling frequency
T4 = 1/Fs4; % Sampling period
%*******
L = 1000; % Length of signal
t1 = (0:L-1)*T1; % Time vector
t2 = (0:L-1)*T2; % Time vector
t3 = (0:L-1)*T3; % Time vector
t4 = (0:L-1)*T4; % Time vector
x1 = 0.5*cos(2*pi*440*t1); % First row wave
x2 = 0.5*cos(2*pi*880*t2); % Second row wave
x3 = 0.5*cos(2*pi*1320*t3); % Third row wave
x4 = 0.5*cos(2*pi*1760*t4); % Third row wave
X = [x1; x2; x3; x4];
t = [t1; t2; t3; x4];
for i = 1:4
subplot(4,1,i)
plot(t(i,1:100),X(i,1:100))
title(['Row ',num2str(i),' in the Time Domain'])
end
sound(x1,Fs1)
pause;
sound(x2,Fs2)
pause;
sound(x3,Fs3)
pause;
sound(x4,Fs4)
pause;
c) Application 3 :
Générer la note « la » du violon selon l’équation :
Page 2 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
.
Avec (f0=440hz, f1=880hz, f2=1320hz, f3=1760hz ).
Proposer une fréquence d’échantillonnage pour onde puis Visualiser et Ecouter
onde
Représenter le spectre du signal onde
% arpège de sons sinusoïdaux (Matlab)
clear all; close all;
Fe = 4000;h = 1/Fe;% selon le théoreme de shanon Fechantillo>=2fsinalmax-->fsinalmax=4*f0
f0 = 440; T = 1.5;
% création du signal onde
th = 0:h:T;
s = 1*sin(2*pi*f0*th)+0.5*sin(4*pi*f0*th)+0.5*sin(2*pi*3*f0*th)+0.5*sin(2*pi*4*f0*th);
figure(1), plot(s(1:50))
grid on
%wavplay(x, Fe);
sound(s,Fe)
wavwrite(s, Fe, './sinus.wav');
%***************************spectre************
%*************calcul du transformé de fourrier
y=s;
Yfft=fft(y);
sp=abs(Yfft);% Calcul du module de la fft du signal
%***************% tracé du spectre d’amplitude entre [0;fe/2]
%*******définiir l'axe des fréquences
Te= 1/Fe;
fe=1/Te;
N=length(y);
fr= 0:(fe/N):(fe/2-fe/N);% determiner l’axe des fréquences-
figure(3),plot(fr,sp(1:(N/2)))
grid on
2. Synthèse d’une gamme de musique
Les notes de musique produites par un instrument de musique peuvent être synthétisées
approximativement numériquement. En effet, chaque note peut être considérée comme étant un
son pur produit par un signal sinusoïdal. La fréquence de la note La est par exemple de 440 Hz.
Page 3 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
Créez un programme td2_2.m qui permet de jouer une gamme de musique. La fréquence de
chaque note est précisée dans le tableau ci-dessous.
Do1 Ré Mi Fa Sol La Si Do2
262 Hz 294 Hz 330 Hz 349 Hz 392 Hz 440 Hz 494 Hz 523 Hz
Chaque note aura une durée de 1s. La durée de la gamme sera donc de 8s.
La fréquence d’échantillonnage fe sera fixée à 8192 Hz.
La période d’échantillonnage pour la définition du temps sera donc égale à Te = 1/f e.
Rappel : la mise bout à bout de vecteurs en ligne X, Y, Z s’effectue à l’aide de la commande :
[X Y Z]; Sauvegardez la gamme synthétisée dans une variable G. Ecoutez la gamme générée via
la commande : sound(G,fe)
Fs = 8192; % Sampling frequency théorème de shanonon
fsampl>=2*f0
T = 1/Fs; % Sampling period
%*******
% Length of signal
t = 0:T:1; % Time vector
do1 = cos(2*pi*262*t); % First row wave
re = cos(2*pi*294*t); % Second row wave
mi = cos(2*pi*330*t); % Third row wave
fa = cos(2*pi*349*t); % Third row wave
sol = cos(2*pi*392*t); % Third row wave
la = cos(2*pi*440*t); % Third row wave
si = cos(2*pi*494*t); % Third row wave
do2 = cos(2*pi*523*t); % Third row wave
%***********
%G1 = [do; re; mi; fa; sol; la; si; do2];
G = [do1 re mi fa sol la si do2];
sound(G,Fs)
2. Synthèse d’un signal créneau par série de fourrier :
Soit un signal créneau s(t) de période To d’amplitude A représenté sur la figure 1.1.
Figure 1.1 – Signal créneau
Page 4 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
La décomposition en série de Fourier de ce signal créneau ne comprend que des
harmoniques de rang impair et les amplitudes de chaque harmonique s’écrit
sous la forme :
Les calculs d’a0, an et bn sont effectués en cours
%synthèse d'un signal carré par série de fourrier
f0=5;
Fe=100;
Te=1/Fe;
N=50;
K=[0:N-1];
%la composante continue
signal=ones(1,N)*0.5;
figure(1), plot(signal);
pause;
Nharmonique=21;
for n=1:2:Nharmonique %les valeurs impaire
% on ajoute une harmonique à chaque fois
signal=signal+(sin(2*pi*n*f0*K*Te))*2/(pi*n);
figure (3), plot(signal)
pause;
end
3. La représentation fréquentielle d’un signal:
Pour calculer la représentation fréquentielle d’un signal, la fonction de base est la transformée
de Fourier discrète, intitulée fft (Fast Fourier Transform). Pour un signal temporel « signal »,
on calcule la transformée de Fourier comme suit :
>> z = fft(signal)
Si le signal est de longueur N, il en sera de même de sa transformée de Fourier qui sera
constituée de N nombres complexes. Si le signal « signal » a été échantillonné avec une
fréquence Fe.
Ainsi, on peut tracer la représentation spectrale du signal comme suit :
>>N=50 ;
>> f=(0 :N-1)/N*Fe ;
>> plot(f(1 :20),abs(z(1 :20)))
Pour ne tracer que les 20 premières raies.
II.Jeux de mots
2.1 Formats de fichiers son :
Il existe de nombreux formats de fichiers son. Parmi les formats les plus courant : ‘raw’
fichier binaire nu et ‘wav’ introduit par Microsoft. En plus du fichier brut, ces formats
encapsulent des informations complémentaires, comme la valeur de la fréquence
d’échantillonnage, la quantification utilisée, le nombre de canaux...
Windows propose un standard des fichiers son : Le format ‘.wav’. Ce format est
rudimentaire et non compressé.
II.2. Sauvegarder un son dans un fichier :
Page 5 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
Enregistrer une séquence audio « une phrase= hello et bonjour tout le monde » avec votre propre
voix selon les commandes suivantes:
fe=8000 ;%fréquence d’échantillonnage
nbits1=8 ;%bits par échantillon
mode1=1 ;%Choisir mode stéréo ou mono
D1=5 ; %Durée de l’enregistrement en secondes
recObj = audiorecorder(fe,nbits1,mode1); % recObj est une variable objet
disp('Start speaking.')
recordblocking(recObj, D1); % parler au micro pendant 5 secondes
disp('End of Recording.');
A faire: Enregistrer d’autre séquence audio en faire varier la durée (variable D1)
2.3 Sauvegarder un son dans un fichier :
La fonction « audiowrite » permet de crée un fichier son ‘son_enregi.wav’ dont les échantillons
(compris entre -1 et 1) se trouvant dans le vecteur myRecording, avec une fréquence
d’échantillonnage fe.
A faire :
Créer le vecteur myRecording en tapant le code suivant en utilisant le signal audio acquis précédemment
;
% Store data in double-precision array.
myRecording = getaudiodata(recObj); % myRecording contient les données son de
type double
Puis Enregistrer ce signal audio dans le fichier ‘son_enregi.wav’
>> audiowrite ('son_enregi.wav', myRecording, fe);
A faire :
- Essayer d’écouter le signal : myRecording.
- Tapez les commandes suivantes et donnez la différence entre eux :
% Play back the recording.
>> play(recObj); % Ecouter le son enregistré
>> wavplay(y,Fe,'sync') ;% L'option 'sync' est facultative,
%voir sa signification dans la
% documentation Matlab.
>> sound(myRecording,fe, nbits1); % Ecouter le son enregistré
Enregistrer signal
fs=16000; % Sampling rate (¨ú¼ËÀW²v)
nbits=16;
nChannels=1;
duration=3; % Recording duration (¿ýµ®É¶¡)
arObj=audiorecorder(fs, nbits, nChannels);
fprintf('Press any key to start %g seconds of recording...', duration); pause
Page 6 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
fprintf('Recording...');
recordblocking(arObj, duration);
fprintf('Finished recording.\n');
fprintf('Press any key to play the recording...'); pause; fprintf('\n');
play(arObj);
fprintf('Plotting the waveform...\n');
y=getaudiodata(arObj); % Get audio sample data
plot(y); % Plot the waveform
wavwrite(y, Fs, './parolephrase.wav');
2.4 Lecture d’un fichier son :
La fonction « AUDIOREAD » Lit un son Microsoft WAVE (.wav) et le stocke dans un vecteur
(ou matrice 2D).
>> y=audioread(‘filename’) ; 'filename' est le chemin où se trouve le fichier à lire,
y est un vecteur colonne si le son est mono et une matrice à deux colonnes si le son est stéréo
qui contient les données. Les données sont dans la plage [-1,1].
>> [y, fs]=audioread(‘filename’) ;% fs est la fréquence d’échantillonnage en Hertz,
A faire :
Lire le nouveau fichier son_enregi.wav.
Réécouter le son.
Tester aussi les commandes ci-dessous.
%On peut savoir le nombre de colonnes (de pistes, noté p) et le nombre d’échantillons N par
>> [N,p]=size(y)
%On peut extraire une piste par
>> y-piste=y( :,1) ;
%On peut extraire une partie d’une piste audio par
>> y-extrait=y-piste(k1:k2) ;
2.5 Inverser un son :
La commande suivante permet d’inverser le son « y ». son_inv présente l’inversement du son
y. Les éléments de ce son inversé sont dans la plage [-1,1].
>> son_inv = flipud(y);
A faire :
Ecouter le son inversé.
Afficher dans des figures différentes les signaux y et son_inv.
Afficher un extrait du signal audio y :
>> figure ;
>> subplot(2, 1, 1) ;
>> plot(y) ;
>> extrait = y(100 :1123) ;
>> subplot(2, 1, 2) ;
Page 7 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
>> plot(extrait) ;
Visualiser les valeurs se trouvant dans le fichier son « y » et commenter
Ecoutez la phrase en modifiant la fréquence d’échantillonnage à 15000 Hz et 45000 Hz
pour me faire parler comme comme « Terminator » ou « Donald Duck ».
2.6 Segmentation de la phrase enregistrée
Essayez de repérer les indices de début et de fin du début de la phrase enregistrée.
Pour segmenter le premier mot, il faut par exemple créer un vecteur « hello »
contenant les 300 premières valeurs du signal enregistré x.
>>hello = x(1:300);
Segmentez la phrase initiale en créant les variables suivantes : hello, etbonjour,
toutlemonde. Puis écouter chaque partie.
2.7 Synthèse d’une nouvelle phrase
Réorganisez les mots pour générer par exemple la phrase suivante : « tout le monde etbonjour
hello »
Notez que le signal initial de parole est un vecteur colonne de « ? » valeurs. Pour produire un
signal réarrangé, vous devez construire un autre vecteur colonne.
Pour écouter la phrase, il faut mettre bout à bout les 2 vecteurs verticaux contenant le début de la
phrase à l’aide de la commande :
sound([tout le monde ; etbonjour ; hello], fs);
Application :
Mixage : Enregistrer deux sons différents x1 et x2(on peut les charger aussi) et
fusionner les données alternativement (un morceau de x1 suivi d’un morceau
de x2…etc) dans un fichier y.
Ecouter x1, x2 et y.
7. Compression MP3 (simplifié):
La compression mp3 (mpeg-1 couche 3) est basée sur la représentation fréquentielle du signal.
a. Principe
Il s'agit de calculer la représentation fréquentielle du signal et d'oublier les fréquences
inaudibles car elles sont trop peu puissantes par rapport aux autres fréquences audibles au
même instant. On va travailler sur chaque piste indépendamment.
On considère le signal "guitar.wav". Charger dans Matlab ce fichier
Question : Décrire la source audio contenue dans ce fichier. Préciser :
–s’il s’agit d’un son mono ou stéréo
– La fréquence d’échantillonnage
–La durée de ce signal audio (en millisecondes)
–Le nombre de bits de stockage des données.
Représenter graphiquement le signal.
Pour sous-échantillonner le signal à la fréquence Fe . Il suffit d’écrire
>> y2=y(1 :2 :N) ;
Ce qui revient à prendre les échantillons de 1 à N par pas de 2.
Page 8 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
Ecouter ce signal ; >> wavplay(y2,Fe/2,’sync’) ;
b. Représentation fréquentielle du signal
Pour calculer la représentation fréquentielle d’un signal, la fonction de base est la transformée
de Fourier discrète, intitulée fft (Fast Fourier Transform).
Pour le signal temporel y, on calcule la transformée de Fourier comme la partie 2 ci-dessus avec
la fonction (z = fft(y)).
c. Compression
On considère le signal "guitar.wav". On notera r le facteur de compression souhaité. On va
commencer par traiter le signal complet d'un seul coup.
Le plus difficile maintenant est de calculer un seuil s tel que :
- toutes les fréquences de puissance inférieure à s seront négligées ;
- les fréquences de puissance supérieure à s seront gardées ;
- le pourcentage de fréquences gardées sera de ce qui correspond à un facteur de
compression de r.
Il faut suivre les étapes suivantes :
1. On commence par trier les modules de la transformée de Fourier z de y :
>> zs=sort(abs(z)) ;
2. On cherche la valeur s en fonction du facteur de compression r :
>> s=zs(round(N*(1-1/r)) );%N=50
3. On met à 0 les valeurs inférieures au seuil s :
>> z(abs(z)<s)=0 ;
Dans une réalisation pratique, il conviendrait maintenant de ne stocker que les coefficients non
nuls. Pour reconstituer le signal (c'est ce que fait un lecteur mp3), on fait la transformée de
Fourier inverse :
>> y_inv=ifft(z) ; Ecoutez le résultat.
Application :
Faire un script Matlab qui lit le fichier "guitar.wav" et le compresse. Essayer plusieurs facteurs
de compression.
Déterminer le facteur de compression à partir duquel le résultat devient inacceptable.
Code avec le facteur5
%compressionmp3 a
clear all; close all;
y=audioread('guitar.wav') ;
figure(1), plot(y)% afficher le signal
%sound(y,44100)
N=length(y);
%**********************
%s’agit d’un son mono ou stéréo///mono car un seul colonne
%pour les autres tapez --> ""info=audioinfo('guitar.wav')""
% La fréquence d’échantillonnage -->
%La durée de ce signal audio (en millisecondes)
%Le nombre de bits de stockage des données.--> le type double occupe 8
%octets pour une valeur -->utilisez whos y
%*******************************************
y2=y(1 :2 :N) ;
figure(2), plot(y2)% afficher le signal
sound(y2,44100/2) ;
Page 9 sur 10 LFSI3 –2017/2018
TP2: Traitement du son Techniques Multimédia
N2=length(y2);
%**********************************
%***************calcul fourier et affichage spectre
fe=44100;
z = fft(y);
zaa=floor(abs(z));%Calcul fft et module
fr= 0:(fe/N):(fe-fe/N);% determiner l’axe des fréquences-
figure(3),plot(fr,zaa(1:(N)))
grid on
%********on commence par trier les modules de la transform´ee de Fourier z de
y et
%l'afficher
zs=sort(zaa) ;
figure(5), plot(zs)
%on cherche la valeur du seuil "s" en fonction du facteur de compression r
s=zs(round(N*(1-1/5)) )
%On met à 0 les valeurs inférieures au seuil s et afficher le résultat:
z2=z;
z2(zaa<s)=0 ;
figure(6), plot(fr,abs(z2))
%il conviendrait maintenant de ne stocker que les coefficients non nuls. Un
%fichier mp3 contient dont des informations de nature fr´equentielles.
j=1;
for i=1:N-1
if abs(z2(i))~=0
zv(j) = (z2(i));
j=j+1;
end
end
mmm=zv';
n = j-1% la taille du fichier aprés la compression
%Afficher la représentation fréquentielle aprés compression et réduction
%du taille du fichier
f1=0 :(fe/n):fe-(fe/n) ;
figure(7), plot(f1(1 :n),abs(mmm(1 :n)))
%Pour reconstituer le signal (c’est ce que fait un lecteur mp3), on fait la
transform´ee de
%Fourier inverse :on revient à la représentation temporelle
y_inv=(ifft((mmm))) ;
% Afficher et entendre le signal qui a subi une compressionMP3 simplifié
figure(8), plot(real(y_inv))
pause;
sound(real(y_inv),44100)
Page 10 sur 10 LFSI3 –2017/2018