Home
signal_processing
.ipynb
%matplotlib inline
Dans ce tutorial, nous allons apprendre à utiliser Python pour synthétiser un signal périodique à partir de sa décomposition en
série de Fourier. Pour synthétiser le signal, nous allons utiliser la librairie Numpy. L'affichage du signal synthétisé sera ensuite
réalisé via la librairie Matplotlib.
Les causes primordiales ne nous sont point connues; mais elles sont assujetties à des lois simples et constantes, que l'on
peut découvrir par l'observation, et dont l'étude est l'objet de la philosophie naturelle.
En gros, même si les phénomènes naturels nous semblent compliquées au premier abord, gardons en tête que la nature fait les
choses simplement ! Cette approche est intimmement liée au Rasoir d'Ockham "Pluralitas non est ponenda sine necessitate" que
nous pouvons traduire, après de multiples approximations par, "les hypothèses suffisantes les plus simples doivent être
préférées".
Sur le plan mathématique, J. Fourier avanca qu'un signal périodique x(t) de période T pouvait se décomposer en une
1
0 =
f0
somme de signaux simples: des sinusoîdes de fréquence f n = kf0 . En utilisant des exponentielles complexes au lieu de
sinusoides (merci Euler), sa proposition se résume par l'équation suivante:
∞
2jπnf0 t
x(t) = ∑ cn e
n=−∞
où n ∈ Z et c n ∈ C . L'histoire d'aller plus loin, J. Fourier proposa également une technique pour obtenir les coefficients c en n
1
−2jπnf0 t
cn = ∫ x(t)e dt
T0
[T0 ]
Damned ! Sa proposition fit couler beaucoup d'encre à l'époque ,notamment de la part de plusieurs de ses contemporains
comme Pierre-Simon de Laplace, Joseph-Louis Lagrange, et Siméon Denis Poisson (pas n'importe qui quand même !)...Et oui,
Fourier ne peut tout de même pas nous faire croire qu'un signal présentant des discontinuités peut se décomposer en une
somme de signaux sinusoidaux.
https://www.enib.fr/~choqueuse/articles/signal_processing/decomposition_fourier.html 1/4
08/02/2022 18:05 Vincent Choqueuse Website
Dans ce tutorial, nous allons nous focaliser sur la décomposition en série de Fourier d'un signal carré de fréquence f 0 = 2 Hz et
d'amplitude crête A = 2 . Ce signal présente des discontinuité en t = kT0 /2 .
Fe = 1000
f0 = 2
T0 = 1/f0
A = 2
xlabel("temps (s)")
ylabel("$x(t)$");
Dans un premier temps, nous devons déterminer la valeur des coefficient c à partir du signal x(t). En utilisant la proposition den
1
−2jπnf0 t
cn = ∫ x(t)e dt
T0
[T0 ]
T
0
T0
A ⎛ 2 ⎞
−2jπnf0 t −2jπnf0 t
= ∫ e dt − ∫ e dt
T
T0 ⎝ 0
⎠
0
2
A
−jπn −jπn
= (1 − e − e + 1)
2jπn
A
−jπn
= (1 − e )
jπn
Nous dirons par la suite que le signal carré ne possède que des harmoniques de rang impair.
Remarquons que pour recontruire le signal x(t) avec la formule de J. Fourier, nous devons sommer une infinité de termes.
Toutefois, l'énergie du signal est portée essentiellement par les termes basse-fréquences (c-a-d pour n petit). En limitant la
reconstruction aux coefficients c à un nombre fini de termes, nous obtenons:
n
https://www.enib.fr/~choqueuse/articles/signal_processing/decomposition_fourier.html 2/4
08/02/2022 18:05 Vincent Choqueuse Website
L=9
xr = 0j*zeros(len(t))
for n in range(-L,L+1,2): #attention, on utilise un pas de 2 pour ne conserver que les harmoniques de rang impair
cn = 2*A/(1j*pi*n)
xr += cn*exp(2j*pi*n*f0*t)
plot(t,x,label="reference")
xlabel("temps (s)")
legend();
Ca marche plutôt bien ! On pourrait bien sur affiner la reconstruction en ajoutant un plus grand nombre d'harmoniques c-a-d en
augmentant la valeur de L.
Nous observons donc que le signal peut être synthétisé à partir d'un petit nombre de coefficients c . Au lieu de réprésentation
n
le signal x(t) en fonction du temps, on préfère alors changer de representation en affichant la valeur des coefficients c de sa
n
décomposition en série de Fourier. Comme ces coefficients sont complexes, on affichera à la fois leur module c-a-d |c n| et leur
argument arg[c ]. n
https://www.enib.fr/~choqueuse/articles/signal_processing/decomposition_fourier.html 3/4
08/02/2022 18:05 Vincent Choqueuse Website
n_vect = arange(-L,L+1,2)
c = 2*A/(1j*pi*n_vect)
stem(n_vect,abs(c))
xlabel("n")
ylabel("$|c_n|$")
figure()
stem(n_vect,angle(c));
xlabel("n")
ylabel("arg[$c_n$]");
Previous Next
·
·
·
·
·
https://www.enib.fr/~choqueuse/articles/signal_processing/decomposition_fourier.html 4/4