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 $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]$
N=1024
t=np.arange(0,1,1/N)
x=(t-0.5)**2
On trace le signal.
plt.figure(1)
plt.plot(t,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()
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=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()
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]|$
plt.figure(7)
plt.plot(np.abs(xK-x))
plt.show()
Hum.. Ce n'est pas si petit.. Continuons
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()
plt.figure(7)
plt.plot(np.abs(xK-x))
plt.show()
Calculons $\|x_K-x\|_2$
np.linalg.norm(xK-x,ord=2)