Chap2 FFT
Chap2 FFT
Chap2 FFT
Traitement du signal
Definition
Pour une fonction f (x) definie sur [, ], on peut ecrire sa decomposition en serie de Fourier de la facon
suivante :
a0 X
f (x) = + an cos(nx) + bn sin(nx). (2.1)
2 n=1
Exercice 2.1
R
1. Ecrire f (x) cos(mx) dx a laide de lequation (2.1).
2. Decomposer lexpression precedente et isoler les 3 termes :
a0
Z
P1 = cos(mx) dx,
2
X Z
P2 = an cos(nx) cos(mx) dx,
n=1
X Z
P3 = bn sin(nx) cos(mx) dx.
n=1
3.a Utiliser une representation graphique sous Matlab pour trouver la valeur de P1.
3.b Utiliser une representation graphique sous Matlab pour trouver la valeur de P2.
3.c Utiliser une representation graphique sous Matlab pour trouver la valeur de P3 pour n 6= m.
3.d Utiliser une representation graphique sous Matlab pour trouver la valeur de P3 pour n = m.
1
R
4. Deduire de ce calcul la valeur des coefficients an et monter que an =
f (x) cos(nx) dx, pour tout n.
1
R
5. Effectuer la meme demarche pour obtenir la valeur des coefficients bn et monter que bn =
f (x) sin(nx) dx,
pour tout n.
2 2.2. Application a la synthese de signaux sous Matlab
Notation exponentielle
Dans lexercice precedent nous venons de voir que lon peut decomposer une fonction definie sur [, ] a laide
de fonctions sinus et cosinus. Il est possible de faire cette decomposition de maniere plus compacte a laide de la
notation exponentielle. On ecrira alors f (x) definie sur [, ] sous la forme :
X
f (x) = cn einx . (2.2)
n=
Notons que lon peut etendre a des fonctions f (x) definie sur [L, L] par :
n
X
f (x) = cn ei L x . (2.3)
n=
Exercice 2.2
En utilisant la relation dEuler : ei = cos + i sin , demontrer que :
a. cn = an ib2
n
pour n > 0
an +ibn
b. cn = 2 pour n < 0.
c. c0 = a20 .
2. Les vecteurs a et b sont les 6 premieres composantes de la serie de Fourier. Ajouter au script une boucle permet-
tant de generer une serie de Fourier tronquees au 6 premiers coefficients (equation 2.1).
2
4. Essayer les vecteurs an = 0 et bn = (1)n+1 n et afficher le signal en fonction de time. Quen dites vous ?
2
5. Ajouter maintenant 2 termes dans a et b (toujours an = 0 et bn = (1)n+1 n ) et afficher le signal en fonction de
time. A-t-il change ? Pourquoi ?
6. Realiser une boucle pour ajouter un nombre arbitraire de coefficients dans la serie et faire un test avec an = 0
2
et bn = (1)n+1 n . A partir de combien de coefficients lapproximation dun signal triangulaire vous semble bonne ?
7. Trouver la decomposition de Fourier dune fonction creneau et realiser un script afin de voir leffet du nombre de
coefficients sur la qualite de lapproximation.
Traitement du signal 3
1. Creer une fonction qui prendre en parametres dentree : T la duree du signal genere et f req la frequence de la
composante. Cette fonction donnera en sortie un vecteur qui sera le signal genere.
2. La frequence dechantillonnage de Matlab par defaut pour le son est 8192 points par seconde. On definit donc une
variable time telle que cette variable soit un vecteur regulierement espace entre 0 et T avec une longueur 8192*T.
On cree aussi une variable signal de meme taille et de valeur 0.
3. Creer un vecteur a de dimension egale a la frequence maximale f req et dont tous les coefficients valent 0 sauf le
coefficient f req qui vaut 1.
4. Realiser une boucle qui permet de faire la synthese du signal (equation 2.1). Attention pour avoir les frequences
en Hz et le temps en seconde, il est important davoir ici lexpression cos(n time 2) dans la serie de Fourier.
5. Tester le signal avec la commande sound(...). PAS plus long que 2 secondes sil vous plait !
6. Modifier le programme pour quil prenne en entree non pas une valeur de frequence mais un vecteur contenant
plusieurs frequences.
7. Faire un script qui appelle votre fonction afin de jouer Au clair de la lune.
4 2.3. Transformee de Fourier
La bonne nouvelle est que Cooley et Tukey dans le milieu des annees 60 ont trouve un algorithme tres efficace
pour faire des transformee de Fourier qui sappelle FFT (Fast Fourier Transform). Cette algorithme repose sur
une division du probleme en 2 sous-problemes, eux meme divises en 2 sous-sous-problemes, etc. Il faut donc un
nombre de point en 2N pour que lalgorithme FFT sapplique bien, ce qui est une condition importante lorsque vous
travaillerez avec la commande Matlab fft. Voyons maintenant comment utilise-t-on cette commande.
L=20;
n=128;
x2=linspace(-L/2,L/2,n+1); x=x2(1:n);
u=exp(-x.^2);
plot(x,u)
ut=fft(u)
plot(ut) % sur certaine version de Matlab il faut faire plot(real(ut)).
k=(2*pi/L)[0:n/2-1 -n/2:-1];
Exercice 2.6 : FFT dun signal electrique - Rapport signal sur bruit.
On a mesure le signal electrique U (t) (tension en fonction du temps) avec un echantillonnage temporel dt = 0.1 ms
pour des valeurs de t comprises entre 0 et 10 s. La tension U (t) mesuree est donnee dans la matrice U de dimensions
(100001,1). Elle contient une composante periodique et un bruit aleatoire.
Telecharger ce fichier depuis http://quentinglorieux.fr/matlab/files/U.mat
1.Tracer U (t).
2.Tracer le spectre S(f ), cest a dire le carre de la norme de la transformee de Fourier, exprime en fonction de la
frequence f pour la fonction U (t).
3. Quelle est la periode de ce signal ?
4. Calculer le rapport signal sur bruit. Ce rapport est defini comme I2II1
1
, avec I1 lintegrale de S pour f entre 39.9
et 40.1 Hz et I2 lintegrale de S pour f entre 0 et 5000 Hz.
!
6 2.3. Transformee de Fourier
On peut ouvrir un fichier .wav dans Matlab en utilisant licone ouvrir de lespace de travail (ou avec la
commande wavplay). Ce fichier consiste en une matrice a une ligne, correspondant a un signal S(t) enregistre a
la frequence dechantillonnage freq cest-a-dire que S(t) est connu pour des valeurs de t separees de 1/f req. On
peut lecouter a la frequence dechantillonnage freq par la commande wavplay(W,freq). Par defaut (si on tape
wavplay(W)) la frequence dechantillonnage est fixee a la valeur standard freq = 11025 Hz.
Telecharger les fichiers flute.wav et violon.wav depuis http://quentinglorieux.fr/matlab/files/
Question 1.
Une onde sonore sinusodale de frequence 784 Hz correspond a la note Sol. Ouvrir les fichiers flute.wav et
violon.wav , ou la note Sol, jouee par un instrument, est enregistree a la frequence dechantillonnage 10000 Hz.
a- Combien de temps dure chaque enregistrement ?
b- Tracer la transformee de Fourier de chaque enregistrement, en faisant attention a laxe des abscisses. Decrire ces
courbes : pic principal a 784 Hz, harmoniques, dedoublement des pics, pics parasites a basse frequence etc.
c- Tracer la courbe de lenregistrement de flute entre 250 et 350 ms. Comment les differentes caracteristiques obser-
vees sur la transformee de Fourier se retrouvent-elles sur le signal ?
Conclusion : cest notamment la presence dharmoniques qui fait la difference, pour une meme note (une meme
frequence), entre deux instruments.
Question 2.
a- Par quelle commande peut-on generer artificiellement un signal sonore Wsol dune duree de 2 secondes, a la
frequence dechantillonnage 11025 Hz, de la note Sol ?
c- Si une note correspond a une frequence donnee (par exemple, Sol : 784 Hz), la frequence double correspond a la
meme note mais a loctave suivante. Quobtient-on si on ecoute le signal sonore Wsol a la frequence dechantillon-
nage 22050 Hz ? et a la frequence 5512 Hz ?
Question 3.
On souhaite filtrer les hautes frequences du signal flute . Pour cela, on calcule la transformee de Fourier, on
supprime la partie contenant les frequences hautes, puis on effectue la transformee de Fourier inverse pour obtenir
le signal filtre :
Question 4.
On souhaite generer artificiellement la note de musique jouee par un violon. Pour cela, reperer sur le spectre du
Sol du violon la hauteur des harmoniques 1 a 6, que lon notera A1 a A6 , et creer pour f = 784 Hz le signal
A1 cos(2f t) + A2 cos(4f t) + A3 cos(6f t) + A4 cos(8f t) + ...
Faire de meme pour la flute. Ecouter ces deux signaux : a-t-on correctement reconstruit les sons des instruments ?
Traitement du signal 7
diffrence
de marche
Dtecteur
Question 1.
Tracer P () et placer les legendes.
Question 2.
La technique de spectroscopie par transformee de Fourier repose sur le fait que le spectre recherche S(k) nest autre
que la norme de la transformee de Fourier de la fonction P () mesuree. Tracer donc |S(k)|.
Question 3.
Combien cette courbe comporte-t-elle de pics ? En quelles longueurs donde sont-ils situes ? Lesquels vous paraissent
significatifs, lesquels attribuez-vous a des artefacts ?
Question 4.
Quelle est la resolution sur k (cest-a-dire lechantillonnage dk entre deux valeurs de k successives) que nous pou-
vons atteindre dans ces conditions experimentales ? Quaurait-il fallu changer dans lexperience pour ameliorer la
resolution ?
Question 5.
On sait que :
(k1 + k2 )x (k1 k2 )x
cos(k1 x) + cos(k2 x) = 2 cos cos( ).
2 2
Quel lien peut-on faire entre la presence dun doublet (deux pics tres proches) dans la transformee de Fourier
et la presence de battements (modulation des oscillations par une enveloppe sinusodale) de P () ?
8 2.4. Corriges
2.4 Corriges
Exercice 2.3 - Correction
On cree un signal en fonction de la variable time definit a laide de ses composantes de Fourier. On affiche ici
les 10 premieres composantes.
L=20;
time=linspace(0,L,100*L);
signal=zeros(100*L,1);
a=[1 1 0 0 0 0 0 0 0 0 ];
b=[0 0 0 0 0 0 0 0 0 0 ];
for n=1:length(a)
signal=signal+a(n)*cos(n*time)+b(n)*sin(n*time);
end
plot(time,signal)
2
On affiche ensuite la serie de Fourier avec an = 0 et bn = (1)n+1 n , avec les 6 premiers coefficients.
L=20;
time=linspace(0,L,100*L);
signal=zeros(100*L,1);
for n=1:6
signal=signal+(-1)^(n+1)*2/(pi*n)*sin(n*time);
end
plot(time,signal)
1.5
0.5
0.5
1.5
0 2 4 6 8 10 12 14 16 18 20
1.5
0.5
0.5
1.5
0 2 4 6 8 10 12 14 16 18 20
2
Figure 2.1: Series de Fourier avec an = 0 et bn = (1)n+1 n pour 6 (haut) et 20 (bas) coefficients.
a=zeros(1000,1);
b=zeros(1000,1);
a(440)=1; %choix de la frequence ici
for n=1:length(a)
signal=signal+a(n)*cos(n*time*2*pi)+b(n)*sin(n*time*2*pi);
end
signal=signal/max(abs(signal));
plot(time,signal)
sound(signal)
On peut transformer ce code relativement simplement en une fonction qui prenne en entree les parametres T et
freq :
function [signal]=note(T,freq)
L=T;
time=linspace(0,L,8192*L);
signal=time; signal=0;
a=zeros(freq,1);
b=zeros(freq,1);
a(freq)=1;
for n=1:length(a)
signal=signal+a(n)*cos(n*time*2*pi)+b(n)*sin(n*time*2*pi);
end
signal=signal/max(abs(signal));
sound(signal)
Et voila comment modifier le code pour en faire une fonction acceptant un vecteur pour T et pour freq. Par
exemple note([0.5 0.5 0.5],[400 800 400]);.
function [signal]=note(T,freq)
for i=1:length(T)
L=T(i);
time=linspace(0,L,8192*L);
signal=time; signal=0;
a=zeros(freq(i),1);
b=zeros(freq(i),1);
a(freq(i))=1;
for n=1:length(a)
signal=signal+a(n)*cos(n*time*2*pi)+b(n)*sin(n*time*2*pi);
end
signal=signal/max(abs(signal));
sound(signal)
pause(T(i))
end
10 2.4. Corriges
plot (U)
Ut=abs(fft(U)).^2;
k=(1/10)*[0:100000];
plot(k,Ut)
axis([1 100 0 5e7])
signal = Ut(401);
bruit = sum(Ut([1:50001])) - signal;
RSB=signal/bruit
center=40;
sigma=5;
gauss=exp(-(k-center).^2/sigma^2);
subplot (3,1,2); plot(k,gauss)
axis([1 100 0 1])
6
x 10
10
0
10 20 30 40 50 60 70 80 90 100
0.8
0.6
0.4
0.2
0
10 20 30 40 50 60 70 80 90 100
6
x 10
10
0
10 20 30 40 50 60 70 80 90 100
Figure 2.2: De haut en bas, on obtient le spectre brut, le filtre gaussien, et le spectre filtre.
signalf=ifft(gauss.*Ut);
figure(2)
subplot (2,1,2);plot (real(signalf))
axis([1 1000 -1e5 1e5])
subplot (2,1,1);plot (U)
axis([1 1000 0 15])
15
10
0
100 200 300 400 500 600 700 800 900 1000
5
x 10
1
0.5
0.5
1
100 200 300 400 500 600 700 800 900 1000
Rsumons les proprits des diffrentes fonctions dans un tableau (on distingue une
composante priodique 1 et une ventuelle composante priodique 2) :
Fonction A B C D E F G H I
1 sinusodale ? Non Non Non Oui Non Oui Non Oui Non
priode 2 - - 4 - 4 - 4 - -
Par ailleurs on a les transformes de Fourier suivantes (on distingue les pics 1 et 2) :
T. Fourier 1 2 3 4 5 6 7 8 9
Harmoniques de 1 ? Non Oui Non Non Non Non Oui Oui Non
largeur 2 - - 0,2 - - 0 - - 0
Pour les temps damortissement et les largeurs des pics, on sait que lun est de lordre
de lautre, mais on ne donne ici que des ordres de grandeur ; pour donner des valeurs
plus prcises, il faudrait avoir dfini prcisment la notion de largeur : par exemple
largeur mi-hauteur etc
Sachant quune composante de priode T, amortie sur un temps T2, correspond un pic
la frquence 1/T de largeur 1/T2 on conclut :
Fonction A B C D E F G H I
T. Fourier 4 5 9 7 6 2 3 8 1