La convolution ?
Qu'est-ce qu'une convolution ?
Que fait donc la convolution ?
Définition mathématique
Mathématiquement, la convolution est une opération mathématique qui prend deux signaux en entrée ( \( u_{1} \) et \( u_{2} \) ) et qui renvoie un nouveau signal , tel que :
\( s(t) = \int_{-\infty}^{+\infty}{u_{1}( \tau )u_{2}(t-\tau)d\tau} \)
Comme la convolution opère sur deux variables d'entrée et qu'elle est très reliée à la multiplication, on utilise souvent le symbole \( \ast \) pour symboliser cette opération :
\( s=u_{1} \ast u_{2} \)
Définition visuelle
Plutôt que de continuer avec des grands discours, vous allez voir directement visuellement ce que fait la convolution.
Commencez par créer un signal quasiment nul partout, mais avec quelques valeurs non nulles par-ci par là :
u1 = zeros(100,1); % Un vecteur avec que des zeros
u1([25;40]) = 1; % on fixe la valeur de u1 à 1 pour les indices 55,128,302 et 50
u1(60)=1.5; %u1 vaut 1.5 pour l'indice 60
u1(80) = -1; %u1 vaut -1 en 80
plot(u1,'.') % on regarde
parce que c'est joli
axis([0 100 -8 8]) % fixe la zone de traçage (un peu comme xlim, et ylim en une seule commande
Vous obtenez :

Vous pouvez ensuite créer le deuxième signal, \( u_{2} \) et je vous propose de lui donner une forme de trapèze :
u2 = [0;0;0;5;5;5;5;4;3;2;1;0];%u2 est un signal avec trois zeros, puis une rampe qui descend de 5 jusqu'à zero
plot(u2,'r')

Le signal u2 a une forme de trapèze.
Enfin vous pouvez obtenir la convolution de
Le signal rouge a été recopié partout où le signal bleu était non nul. L'amplitude du recopiage dépend de la valeur du signal bleu. En particulier, si le signal bleu était négatif, le signal rouge est recopié vers le bas (négativement).
clf
u1 = zeros(100,1); % Un vecteur avec que des zeros
u1([25;35;40]) = 1; % on fixe la valeur de u1 à 1 pour les indices 55,128,302 et 50
u1(60) = 1.5; %u1 vaut 1.5 pour l'indice 60
u1(63) = -0.5;
u1(70) = -1;
u1(80) = -1;
%u1 vaut -1 en 80
plot(u1,'.','DisplayName','u_1') % on regarde parceque c'est joli
box off
axis([0 100 -8 8]) % fixe la zone de traçage (un peu comme xlim, et ylim en une seule commande
hold on
u2 = [0;0;0;5;5;5;5;4;3;2;1;0];%u2
est un signal avec trois zeros, puis une rampe qui descend de 5 jusqu'à zero
plot(u2,'r','DisplayName','u_2')
s = conv(u1,u2);
plot(s,'color',[0.5 0 0.5],'DisplayName','u_1\ast u_2')
legend(gca,'show')
hold off

Moyenner et lisser un signal
Moyenne glissante
Une moyenne glissante d'un signal \( u(t) \) , c'est un autre signal\( u_{m}(t) \) dont les valeurs sont obtenues en faisant la moyenne de\( u(t) \) sur une plage de grandeur plus ou moins grande.
Mathématiquement, si on choisit une plage de largeur totale
:
\( u_{m}(t) = \frac{1}{T} \int_{-\frac{T}{2}}^{\frac{T}{2}}{u(t-\tau)d\tau} \)
Vous aurez peut-être remarqué que l'on peut écrire ça sous la forme de la convolution du signal \( u \) avec une porte d'épaisseur et de hauteur (vérifiez ce que je vous dis en remplaçant par \( u \) et par la porte \( \frac{1}{T}Π(t/T) \) dans la définition mathématique de la convolution).
Voyons comment cela se traduit visuellement.
Commençons par créer un signal sinusoïdal auquel on ajoute une composante aléatoire :
%Avant de commencer, un peu de nettoyage
clear all; % efface toutes les variables déjà définies
close all; % ferme toutes les fenètres graphiques
N = 400;
t = linspace(-6,6,N); % créer un vecteur t avec N = 400 valeurs réparties uniforméement
entre -6 et 6
u = sin(2*pi*0.5*t); %u est un sinus de fréquence 0.5 hz
u = u + randn(1,N); % on rajoute à u une composante aléatoire (Gaussienne)
plot(t,u)
Nous allons essayer de récupérer la moyenne glissante d'abord avec une petite fenêtre de moyennage, puis avec une fenêtre plus large.
Commençons par une fenêtre petite, c'est-à-dire que nous allons moyenner sur une points. Qu'obtient-on ?
PetiteBoite = ones(1,11)/11; % on va moyenner sur une zone qui va de -5 à +5, soit 11 points en comptant celui du milieu.
u_m1 = conv(u,PetiteBoite,'same'); % l'argument 'same' assure que la taille du signal de sortie est la même que le signal
d'entrée u
line(t,u_m1,'color','r'); %line et plot fonctionnent un peu pareil, sauf que line évite d'avoir a utiliser "hold on' (plot efface tout par défaut), mais line a moins d'options que plot
Il est donc possible d'obtenir la moyenne glissante assez simplement grâce à la convolution. Mais que se passe-t-il si nous calculons une moyenne sur un domaine plus large ?
GrosseBoite = ones(1,201)/201; %cette fois on va de -50 à +50 points.
u_m2 = conv(u,GrosseBoite,'same');
line(t,u_m2,'color','k'); %line et plot fonctionnent un peu pareil, sauf que line évite d'avoir a utiliser "hold on', mais a moins
d'options que plot
Vous obtenez alors :

Notez qu'il se passe des trucs bizarres sur les bords. C'est une chose à garder à l'esprit lorsque vous calculez une convolution numériquement. La taille du signal de sortie, ainsi que les bords posent problème. Pour plus de détails,
allez voir la documentation de la fonction conv
.
Lissage
N'avez-vous pas remarqué que finalement, le calcul de la moyenne glissante a eu pour effet de lisser le signal de base ?
C'est en effet une utilisation encore plus courante de la convolution : le lissage.
Tout comme avec la valeur moyenne se pose la question de la taille du lissage. Un autre aspect rentre toutefois en compte : la forme de la boîte de lissage.
Pour la moyenne glissante, nous avons utilisé une porte et cela a pour conséquence que le signal (en rouge) convolué reste assez anguleux. Si vous souhaitez rendre les transitions plus douces, vous pouvez convoluer le signal de base par une forme plus douce elle aussi. Le résultat obtenu ne sera plus une moyenne glissante, mais il aura le mérite d'être plus lisse.
x = [-10:10];
gauss = exp(-(x/10).^2); % une forme de gaussienne d'épaisseur environ 10, soit
a peu près la même chose que la petite boite
gauss = gauss / sum(gauss); % Normalisation, pour que la convolution ne change pas la
valeur moyenne
u_lisse = conv(u, gauss,'same');
plot(t,u_m1,'r');
line(t,u_lisse);
xlim([-2 2])

fspecial
pour
voir les différentes possibilités.
Conclusion
Vous venez de voir ce que faisait cette convolution. Dans le chapitre suivant, vous allez voir le lien qu'il existe avec la transformée de Fourier.
-
La convolution est un outil qui prend deux signaux (qui dépendent du temps) et qui en renvoie un nouveau.
- La convolution correspond visuellement à recopier un signal sur un autre.
- La convolution est l'outil de choix pour obtenir :
- une moyenne glissante ;
- un lissage.