Vous êtes sur la page 1sur 10

Frdric Legrand Licence Creative Commons 1

Srie de Fourier et ltrage d'un signal en crneaux

1. Dnition de la srie de Fourier


Les coecients de Fourier d'un signal crneau sont :
j
Cn = (1 (1)n )
n
La srie de Fourier s'crit :
  
X 2
u(t) = 2Re Cn exp jn t
n=1
T
Les coecients de Fourier sont dnis par une fonction :

import math,cmath
import numpy as np
from matplotlib.pyplot import *

def cnCreneau(n):
if n==0:
return 0
else:
return -1j/(n*math.pi)*(1-(-1)**n)

Trac du spectre en dcibel :

def plotSpectre(cn,nmax):
indices = np.arange(start=1,stop=nmax,step=2)
n = indices.size
spectre = np.zeros(n)
for k in range(n):
spectre[k] = 20*math.log10(abs(cn(indices[k])))
stem(indices,spectre)
xlabel('n')
ylabel('AdB')
grid()
figure(figsize=(8,4))
plotSpectre(cnCreneau,20)
Frdric Legrand Licence Creative Commons 2

La fonction suivante calcule la somme partielle de la srie de Fourier, avec une priode
1:

def serie(cn,nmax,t):
s = 0.0
for k in range(1,nmax):
z = cn(k)*cmath.exp(1j*2*math.pi*k*t)
s += 2*z.real
return s

Trac de la somme partielle N = 20 :

def plotSomme(cn,nmax,step):
t = np.arange(start=0.0,stop=2.0,step=step)
n = t.size
u = np.zeros(n)
for k in range(n):
u[k] = serie(cn,nmax,t[k])
plot(t,u)
xlabel('t')
ylabel('u')
grid()
figure(figsize=(8,4))
plotSomme(cnCreneau,20,0.001)
Frdric Legrand Licence Creative Commons 3

Cette somme partielle est trs loigne du signal crneau. Essayons N = 100 :

figure(figsize=(8,4))
plotSomme(cnCreneau,100,0.001)

Il y a des oscillations l'approche des discontinuits (phnomne de Gibbs). On peut es-


sayer d'augmenter encore N , mais il faut aussi augmenter la frquence d'chantillonnage
du trac car les oscilations sont de plus en plus rapides.

figure(figsize=(8,4))
plotSomme(cnCreneau,1000,0.0001)
Frdric Legrand Licence Creative Commons 4

Cela est trs couteux en calculs car il y 1000x1000 termes calculer.


On peut aussi obtenir le signal en appliquant la transforme de Fourier discrte
inverse au spectre. Dans ce cas, un spectre 1000 termes donne 1000 chantillons, ce qui
ne permet pas de restituer les oscillations :
import numpy.fft
def calculerSignal(cn,nmax):
indices = np.arange(start=0,stop=nmax,step=1)
n = indices.size
spectre = np.zeros(n,dtype=numpy.complex)
for k in range(n):
spectre[k] = cn(indices[k])
u = numpy.fft.ifft(spectre)*nmax
return u
u = calculerSignal(cnCreneau,1000)
figure(figsize=(8,4))
plot(u)
grid()
Frdric Legrand Licence Creative Commons 5

Le calcul est beaucoup plus rapide (algorithme FFT) mais le rsultat correspond un
signal dont les hautes frquences ont t attnues, ce qui fait disparaitre le phnomne
de Gibbs.

2. Filtrage
2.a. Mthode

On eectue un ltrage dans le domaine frquentiel, c'est--dire en agissant sur les


coecients de Fourier. En pratique, le ltrage numrique du signal dans les sytmes
temps-rel se fait dans le domaine temporel (par convolution). Voir ce sujet la page
Filtre rponse impulsionnelle nie..
Le ltre est dni par une fonction de transfert de la forme H(f ), f tant la frquence.
Dans le cas prsent, les frquences sont dnies par rapport la frquence du signal, qui
vaut 1 par convention.
La fonction suivante calcule les coecients de Fourier rsultant du ltrage, en les
multipliant par la valeur de la fonction de transfert aux frquences correspondantes. La
frquence de l'harmonique de rang n est simplement n puis la frquence du fondamental
est 1.
def filtrage(H,cn_in):
def cn_out(n):
return H(1.0*n)*cn_in(n)
return cn_out

2.b. Filtre passe-bas du premier ordre

La fonction de transfert d'un ltre passe-bas du premier ordre est :


1
H(s) =
1+s
o la variable s est dnie par :
f
s=j
fc
Pour une frquence de coupure de 10 :
def H(f):
x = f/10
s = 1j*x
return 1.0/(1+s)

Eet du ltre sur le crneau :


cnSortie = filtrage(H,cnCreneau)
figure(figsize=(8,4))
plotSomme(cnSortie,100,0.001)
Frdric Legrand Licence Creative Commons 6

On voit que la srie de Fourier peut tre arrte au rang 100 en raison de l'attnuation
des hautes frquences ; le phnomne de Gibbs est peine visible.
Dans le cas suivant, toutes les frquences du crneau sont dans le domaine intgrateur
du ltre :
def H(f):
x = f/0.1
s = 1j*x
return 1.0/(1+s)
cnSortie = filtrage(H,cnCreneau)
figure(figsize=(8,4))
plotSomme(cnSortie,100,0.001)

2.c. Filtres passe-bas de Butterworth

Un ltre de Butterworth d'ordre n a le gain suivant ( une constante multiplicative


prs) :
1
|H| =
1 + x2n
Frdric Legrand Licence Creative Commons 7

Le gain prsente donc une dcroissance de 20ndB par dcade pour x > 1.
Voir la page Filtres passe-bas de Butterworth pour le calcul de la fonction de transfert
et pour un exemple de ralisation lectronique.
La fonction de transfert d'un ltre passe-bas de Butterworth d'ordre 2p est :
1
H(s) =
(s2 + c0 s + 1) (s2 + c1 s + 1) ... (s2 + cp s + 1)
avec :
  
1
ck = 2 sin k+
n 2

def butterworth(f,fc,p):
s = 1j*f/fc
h = 1.0
n = 2*p
for k in range(p):
c = 2*math.sin(math.pi/n*(k+0.5))
h = h*(s**2+c*s+1)
return 1.0/h

Diagramme de Bode d'un ltre de Butterworth d'ordre 2 :

def H(f):
return butterworth(f,1,1)
def reponseFrequentielle(H,start,stop):
freq = np.logspace(start=start,stop=stop,num=1000)
n = freq.size
gdb = np.zeros(n)
phi = np.zeros(n)
for k in range(n):
h = H(freq[k])
gdb[k] = 20*math.log10(abs(h))
phi[k] = cmath.phase(h)
return [np.log10(freq),gdb,phi]
[logf,gdb,phi] = reponseFrequentielle(H,-2,2)
figure(figsize=(8,4))
plot(logf,gdb)
xlabel('log(f)')
ylabel('GdB')
grid()
Frdric Legrand Licence Creative Commons 8

figure(figsize=(8,4))
plot(logf,phi)
xlabel('log(f)')
ylabel('phi')
grid()

Voici l'eet sur le spectre d'un signal en crneaux :

cn_out = filtrage(H,cnCreneau)
figure(figsize=(8,4))
plotSpectre(cn_out,20)
Frdric Legrand Licence Creative Commons 9

et sur sa reprsentation temporelle :

figure(figsize=(8,4))
plotSomme(cn_out,100,0.001)
grid()

Le signal de sortie n'est pas trs loin d'une sinusode. Comme on le voit sur le spectre,
il y a environ 30 dB entre le fondamental et l'harmonique de rang 3.
La mme chose avec un ltre de Butterworth d'ordre 4 :

def H(f):
return butterworth(f,1,2)
cn_out = filtrage(H,cnCreneau)
figure(figsize=(8,4))
plotSpectre(cn_out,20)
Frdric Legrand Licence Creative Commons 10

figure(figsize=(8,4))
plotSomme(cn_out,100,0.001)
grid()

L'cart entre le fondamental et l'harmonique de rang 3 est suprieur 40 dB et la sortie


est pratiquement sinusodale. Ce type de ltrage peut tre utile pour transformer un
signal numrique TTL en sinusode.

Vous aimerez peut-être aussi