On importe les bibliotheques dont on va se servir

In [13]:
import numpy as np
from scipy.fftpack import dct,idct
import matplotlib.pyplot as plt

On commence par tracer un signal $x$ de $N=1024$ points qui est la discrétisation de la parabole $t\mapsto (t-\frac{1}{2})^2$ sur l'intervalle $[0,1]$

In [14]:
N=1024
t=np.arange(0,1,1/N)
x=(t-0.5)**2

On trace le signal.

In [15]:
plt.figure(1)
plt.plot(t,x)
plt.show()

On calcule la transformee en cosinus du signal

In [16]:
xchap=dct(x,norm='ortho')

On regarde le resultat. La transformee est réelle !

In [17]:
plt.figure(2)
plt.plot(xchap)
plt.show()

Et parce qu'on est habitues, on regarde aussi le module

In [18]:
plt.figure(3)
plt.plot(np.abs(xchap))
plt.show()

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$

In [19]:
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 ?

In [20]:
K=20
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()
In [21]:
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()

Il se pourrait qu'on a presque convergé. Vérifions en traçant $|x_k[n]-x[n]|$

In [22]:
plt.figure(7)
plt.plot(np.abs(xK-x))
plt.show()

Hum.. Ce n'est pas si petit.. Continuons

In [23]:
K=200
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()
In [24]:
plt.figure(7)
plt.plot(np.abs(xK-x))
plt.show()

Calculons $\|x_K-x\|_2$

In [27]:
np.linalg.norm(xK-x,ord=2)
Out[27]:
0.0012715739405846839