Académique Documents
Professionnel Documents
Culture Documents
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)
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
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)
figure(figsize=(8,4))
plotSomme(cnCreneau,1000,0.0001)
Frdric Legrand Licence Creative Commons 4
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 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)
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
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()
cn_out = filtrage(H,cnCreneau)
figure(figsize=(8,4))
plotSpectre(cn_out,20)
Frdric Legrand Licence Creative Commons 9
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()