Produit de convolution#
Avant propos#
Le produit de convolution entre deux signaux \(x\) et \(y\) à temps discret est défini par :
La fonction numpy.convolve
calcule le produit de convolution et renvoie le résultat complet (full
) ou tronqué (same
et valid
).
x = [ 7, 2, 1, 8 ] (len = 4)
y = [ 1, -1, 1 ] (len = 3)
"full" = [ 7, -5, 6, 9, -7, 8 ] (len = 6)
"same" = [ -5, 6, 9, -7 ] (len = 4)
"valid" = [ 6, 9 ] (len = 2)
Premier produit de convolution#
Comme pour la porte, l’impulsion discrète est définie avec numpy.where
.
Attention à l’utilisation de la fonction numpy.arange
utilisée pour définir les abscisses !
n = np.arange(-10, 10+1)
x = np.sin(2*np.pi*n/10)
y = np.where( n==5 , 3, 0)
z = np.convolve(x, y, mode="same")
On voit là l’effet de la convolution par une impulsion discrète : le signal \(x\) est décalé de 5 échantillons (lieu de l’impulsion) et amplifié de 3 (amplitude de l’impulsion).
Mais comment expliquer la présence d’échantillons nuls en début du signal \(x*y\) ?
Deuxième produit de convolution#
n = np.arange(-10, 10+1)
x = np.where( np.absolute(n)==1 , 1, 0) + np.where( n==0 , 2, 0)
y = np.where( n==-1 , -1, 0) + np.where( n==1 , 1, 0)
z = np.convolve(x, y, mode="same")
Détail du calcul du produit de convolution :
Comme précédemment, la convolution par chaque impulsion de \(y\) va décaler et amplifer le signal \(x\) d’autant. La convolution de la somme étant la somme des convolutions (opération linéaire), alors le résultat \(x*y\) est la somme des deux convolutions.
Troisième produit de convolution#
La convolution par un porte revient à calculer chaque échantillon de \(x*y\) comme la moyenne de 24×7 échantillons de \(y\).
On procède donc à un moyennage du signal, qui a pour effet d’adoucir (lisser) le signal très perturbé (« bruité ») par une porte. C’est une véritable technique pour débruiter un signal.