Académique Documents
Professionnel Documents
Culture Documents
Signal Proc PDF
Signal Proc PDF
Traitement du signal
Définition
Pour une fonction f (x) définie sur [−π, π], on peut écrire sa décomposition en série de Fourier de la façon
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 à l’aide de l’équation (2.1).
2. Décomposer l’expression précédente 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 représentation graphique sous Matlab pour trouver la valeur de P1.
3.b Utiliser une représentation graphique sous Matlab pour trouver la valeur de P2.
3.c Utiliser une représentation graphique sous Matlab pour trouver la valeur de P3 pour n 6= m.
3.d Utiliser une représentation graphique sous Matlab pour trouver la valeur de P3 pour n = m.
1
Rπ
4. Déduire 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 même démarche pour obtenir la valeur des coefficients bn et monter que bn = π −π
f (x) sin(nx) dx,
pour tout n.
2 2.2. Application à la synthèse de signaux sous Matlab
Notation exponentielle
Dans l’exercice précédent nous venons de voir que l’on peut décomposer une fonction définie sur [−π, π] à l’aide
de fonctions sinus et cosinus. Il est possible de faire cette décomposition de manière plus compacte à l’aide de la
notation exponentielle. On écrira alors f (x) définie sur [−π, π] sous la forme :
∞
X
f (x) = cn einπx . (2.2)
n=−∞
Notons que l’on peut étendre à des fonctions f (x) définie sur [−L, L] par :
∞
nπ
X
f (x) = cn ei L x . (2.3)
n=−∞
Exercice 2.2
En utilisant la relation d’Euler : eiθ = cos θ + i sin θ, démontrer 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 premières composantes de la série de Fourier. Ajouter au script une boucle permet-
tant de générer une série de Fourier tronquées au 6 premiers coefficients (équation 2.1).
2
4. Essayer les vecteurs an = 0 et bn = (−1)n+1 πn et afficher le signal en fonction de time. Qu’en 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 changé ? Pourquoi ?
6. Réaliser une boucle pour ajouter un nombre arbitraire de coefficients dans la série et faire un test avec an = 0
2
et bn = (−1)n+1 πn . A partir de combien de coefficients l’approximation d’un signal triangulaire vous semble bonne ?
7. Trouver la décomposition de Fourier d’une fonction créneau et réaliser un script afin de voir l’effet du nombre de
coefficients sur la qualité de l’approximation.
Traitement du signal 3
1. Créer une fonction qui prendre en paramètres d’entrée : T la durée du signal généré et f req la fréquence de la
composante. Cette fonction donnera en sortie un vecteur qui sera le signal généré.
2. La fréquence d’échantillonnage de Matlab par défaut pour le son est 8192 points par seconde. On définit donc une
variable time telle que cette variable soit un vecteur régulièrement espacé entre 0 et T avec une longueur 8192*T.
On crée aussi une variable signal de même taille et de valeur 0.
3. Créer un vecteur a de dimension égale à la fréquence maximale f req et dont tous les coefficients valent 0 sauf le
coefficient f req qui vaut 1.
4. Réaliser une boucle qui permet de faire la synthèse du signal (equation 2.1). Attention pour avoir les fréquences
en Hz et le temps en seconde, il est important d’avoir ici l’expression cos(n ∗ time ∗ 2π) dans la série de Fourier.
5. Tester le signal avec la commande sound(...). PAS plus long que 2 secondes s’il vous plait !
6. Modifier le programme pour qu’il prenne en entrée non pas une valeur de fréquence mais un vecteur contenant
plusieurs fréquences.
7. Faire un script qui appelle votre fonction afin de jouer ”Au clair de la lune”.
4 2.3. Transformée de Fourier
La bonne nouvelle est que Cooley et Tukey dans le milieu des années 60 ont trouvé un algorithme très efficace
pour faire des transformée de Fourier qui s’appelle FFT (Fast Fourier Transform). Cette algorithme repose sur
une division du problème en 2 sous-problèmes, eux même divisés en 2 sous-sous-problèmes, etc. Il faut donc un
nombre de point en 2N pour que l’algorithme FFT s’applique 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 d’un signal electrique - Rapport signal sur bruit.
On a mesuré le signal électrique U (t) (tension en fonction du temps) avec un échantillonnage temporel dt = 0.1 ms
pour des valeurs de t comprises entre 0 et 10 s. La tension U (t) mesurée est donnée dans la matrice U de dimensions
(100001,1). Elle contient une composante périodique et un bruit aléatoire.
Télécharger ce fichier depuis http://quentinglorieux.fr/matlab/files/U.mat
1.Tracer U (t).
2.Tracer le spectre S(f ), c’est à dire le carré de la norme de la transformée de Fourier, exprimé en fonction de la
fréquence f pour la fonction U (t).
3. Quelle est la période de ce signal ?
4. Calculer le rapport signal sur bruit. Ce rapport est défini comme I2I−I1
1
, avec I1 l’intégrale de S pour f entre 39.9
et 40.1 Hz et I2 l’intégrale de S pour f entre 0 et 5000 Hz.
!
6 2.3. Transformée de Fourier
On peut ouvrir un fichier .wav dans Matlab en utilisant l’icône « ouvrir » de l’espace de travail (ou avec la
commande wavplay). Ce fichier consiste en une matrice à une ligne, correspondant à un signal S(t) enregistré à
la fréquence d’échantillonnage freq c’est-à-dire que S(t) est connu pour des valeurs de t séparées de 1/f req. On
peut l’écouter à la fréquence d’échantillonnage freq par la commande wavplay(W,freq). Par défaut (si on tape
wavplay(W)) la fréquence d’échantillonnage est fixée à la valeur standard freq = 11025 Hz.
Télécharger les fichiers « flute.wav » et « violon.wav » depuis http://quentinglorieux.fr/matlab/files/
Question 1.
Une onde sonore sinusoı̈dale de fréquence 784 Hz correspond à la note Sol. Ouvrir les fichiers « flute.wav » et «
violon.wav », où la note Sol, jouée par un instrument, est enregistrée à la fréquence d’échantillonnage 10000 Hz.
a- Combien de temps dure chaque enregistrement ?
b- Tracer la transformée de Fourier de chaque enregistrement, en faisant attention à l’axe des abscisses. Décrire ces
courbes : pic principal à 784 Hz, harmoniques, dédoublement des pics, pics parasites à basse fréquence etc.
c- Tracer la courbe de l’enregistrement de flûte entre 250 et 350 ms. Comment les différentes caractéristiques obser-
vées sur la transformée de Fourier se retrouvent-elles sur le signal ?
Conclusion : c’est notamment la présence d’harmoniques qui fait la différence, pour une même note (une même
fréquence), entre deux instruments.
Question 2.
a- Par quelle commande peut-on générer artificiellement un signal sonore Wsol d’une durée de 2 secondes, à la
fréquence d’échantillonnage 11025 Hz, de la note Sol ?
c- Si une note correspond à une fréquence donnée (par exemple, Sol : 784 Hz), la fréquence double correspond à la
même note mais à l’octave suivante. Qu’obtient-on si on écoute le signal sonore Wsol à la fréquence d’échantillon-
nage 22050 Hz ? et à la fréquence 5512 Hz ?
Question 3.
On souhaite filtrer les hautes fréquences du signal « flute ». Pour cela, on calcule la transformée de Fourier, on
supprime la partie contenant les fréquences hautes, puis on effectue la transformée de Fourier inverse pour obtenir
le signal filtré :
Question 4.
On souhaite générer artificiellement la note de musique jouée par un violon. Pour cela, repérer sur le spectre du
« Sol » du violon la hauteur des harmoniques 1 à 6, que l’on notera A1 à A6 , et créer pour f = 784 Hz le signal
A1 cos(2πf t) + A2 cos(4πf t) + A3 cos(6πf t) + A4 cos(8πf t) + ...
Faire de même pour la flûte. Ecouter ces deux signaux : a-t-on correctement reconstruit les sons des instruments ?
Traitement du signal 7
différence
de marche δ
Détecteur
Question 1.
Tracer ∆P (δ) et placer les légendes.
Question 2.
La technique de spectroscopie par transformée de Fourier repose sur le fait que le spectre recherché S(k) n’est autre
que la norme de la transformée de Fourier de la fonction ∆P (δ) mesurée. Tracer donc |S(k)|.
Question 3.
Combien cette courbe comporte-t-elle de pics ? En quelles longueurs d’onde sont-ils situés ? Lesquels vous paraissent
significatifs, lesquels attribuez-vous à des artefacts ?
Question 4.
Quelle est la résolution sur k (c’est-à-dire l’échantillonnage dk entre deux valeurs de k successives) que nous pou-
vons atteindre dans ces conditions expérimentales ? Qu’aurait-il fallu changer dans l’expérience pour améliorer la
résolution ?
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 présence d’un « doublet » (deux pics très proches) dans la transformée de Fourier
et la présence de « battements » (modulation des oscillations par une enveloppe sinusoı̈dale) de ∆P (δ) ?
8 2.4. Corrigés
2.4 Corrigés
Exercice 2.3 - Correction
On crée un signal en fonction de la variable time définit à l’aide de ses composantes de Fourier. On affiche ici
les 10 premières 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 série 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
−1.5
0 2 4 6 8 10 12 14 16 18 20
1.5
0.5
−0.5
−1
−1.5
0 2 4 6 8 10 12 14 16 18 20
2
Figure 2.1: Séries 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 fréquence 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 entrée les paramètres 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. Corrigés
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 filtré.
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
Résumons les propriétés des différentes fonctions dans un tableau (on distingue une
composante périodique 1 et une éventuelle composante périodique 2) :
Fonction A B C D E F G H I
1 sinusoïdale ? Non Non Non Oui Non Oui Non Oui Non
période 2 - - 4 - 4 - 4 - -
Par ailleurs on a les transformées 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 d’amortissement et les largeurs des pics, on sait que l’un est de l’ordre
de l’autre, mais on ne donne ici que des ordres de grandeur ; pour donner des valeurs
plus précises, il faudrait avoir défini précisément la notion de largeur : par exemple
« largeur à mi-hauteur » etc
Sachant qu’une composante de période T, amortie sur un temps T2, correspond à un pic
à la fréquence 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