On importe les bibliotheques dont on va se servir
import numpy as np
from scipy.fftpack import dct,idct
import matplotlib.pyplot as plt
On commence par tracer un signal creneau $x$ de $N=1024$ points avec
$x[n]=1$ si $N/4\leq n\leq 3N/4$
$x[n]=0$ sinon.
N=1024
x=np.zeros(N)
x[N//4:3*N//4]=1
On trace le signal.
plt.figure(1)
plt.plot(x)
plt.show()
On calcule la transformee en cosinus du signal
xchap=dct(x,norm='ortho')
On regarde le resultat. La transformee est réelle !
plt.figure(2)
plt.plot(xchap)
plt.show()
Et parce qu'on est habitues, on regarde aussi le module
plt.figure(3)
plt.plot(np.abs(xchap))
plt.show()
Est ce conforme à ce qu'on attend ? Il faut donc calculer $\langle x,C_n\rangle $ avec la formule qui donne les $C_n$ (exercice 5 du TD 2) ! A vous de jouer !
On ne retient maintenant que les 10 premiers vecteurs $C_n$ et on calcule donc $x_K=\sum\limits_{n=0}^K \langle x,C_n\rangle C_n$
K=10
xKchap=np.zeros(xchap.size)
xKchap[0:K-1]=xchap[0:K-1]
xK=idct(xKchap,norm='ortho')
plt.figure(4)
plt.plot(xK)
plt.show()
On calcule $x_K$ pour $K$ de plus en plus grand. Qu'observe-t-on ?
K=50
xKchap=np.zeros(xchap.size)
xKchap[0:K-1]=xchap[0:K-1]
xK=idct(xKchap,norm='ortho')
plt.figure(5)
plt.plot(xK)
plt.show()
K=100
xKchap=np.zeros(xchap.size)
xKchap[0:K-1]=xchap[0:K-1]
xK=idct(xKchap,norm='ortho')
plt.figure(5)
plt.plot(xK)
plt.show()
K=250
xKchap=np.zeros(xchap.size)
xKchap[0:K-1]=xchap[0:K-1]
xK=idct(xKchap,norm='ortho')
plt.figure(5)
plt.plot(xK)
plt.show()
Un zoom autour de la discontinuité
plt.figure(7)
plt.plot(np.arange(N//4-100,N//4+100),xK[N//4-100:N//4+100])
plt.show()
K=700
xKchap=np.zeros(xchap.size)
xKchap[0:K-1]=xchap[0:K-1]
xK=idct(xKchap,norm='ortho')
plt.figure(5)
plt.plot(xK)
plt.show()
Encore un zoom autour de la discontinuité
plt.figure(5)
plt.plot(np.arange(N//4-100,N//4+100),xK[N//4-100:N//4+100])
plt.show()
Les oscillations parasites persistent au voisinage des discontinuités même si on a $K$ de plus en plus grand. C'est ce qu'on appelle le phénomène de Gibbs.