Tout comme les vecteurs peuvent être décomposés sur des vecteurs de base, un signal peut être décomposé sur des composantes de base.
Encore faut-il avoir une base. Je vous le rappelle : pour que des vecteurs forment une base orthonormée, il faut :
autant de vecteurs que la dimension de l'espace
qu'ils soient tous de norme 1
qu'ils soient tous orthogonaux entre eux
Acquérir et visualiser les données
Dans le fichier composition.dat, vous trouverez 5 colonnes correspondant à 5 signaux.
Qu'y a-t-il vraiment dans ce fichier ? Vous pouvez vous rendre compte qu'il s'agit d'un simple fichier texte, malgré le fait que son extension soit ".dat". Vous pouvez le vérifier en utilisant n'importe quel éditeur de texte et en ouvrant le fichier avec.
Par exemple, sous Windows : clic-droit > ouvrir avec ... > Bloc-notes.
Le premier est un signal quelconque, les 4 suivants sont des vecteurs de base de l'espace dans lequel nous travaillons.
D'ailleurs, quelle est la dimension de cet espace?
Réponse : au bas de cette page.
Commençons par acquérir les données et à regarder ce dont on parle.
data = load('composition.dat'); %chargement des données
signal = data(:,1); %la première colonne est un signal
%les autres colonnes sont des vecteurs de base
b1 = data(:,2);
b2 = data(:,3);
b3 = data(:,4);
b4 = data(:,5);
%On regarde la tête de tout ça:
subplot(5,1,1) % subplot permet de mettre plusieurs graph sur une même figure
plot(signal)
title('signal')
subplot(5,1,2)
plot(b1)
title('b1')
subplot(5,1,3)
plot(b2)
title('b2')
subplot(5,1,4)
plot(b3)
title('b3')
subplot(5,1,5)
plot(b4)
title('b4')
Vous devriez obtenir :

Avez-vous remarqué que le premier signal semble avoir été composé à partir des quatre signaux de base ?
Composantes de base d'un signal
Le premier signal serait-il une combinaison des autres signaux ?
Pour tester cette hypothèse, nous allons tout simplement utiliser le fait que pour obtenir la composante d'un vecteur sur un vecteur de base, il suffit de le projeter sur le vecteur de base en question (or projeter, c'est simplement effectuer un produit scalaire) :
Quelles sont ces composantes dans notre cas ? Aucun souci, puisque vous savez calculer un produit scalaire, vous devriez pouvoir les déterminer.
%on définit une fonction produit scalaire
prodscal= @(u,v) sum(u.*v);
%on détermine les composantes
comp1 = prodscal(signal,b1)
comp2 = prodscal(signal,b2)
comp3 = prodscal(signal,b3)
comp4 = prodscal(signal,b4)
Ici, les composantes semblent réalistes :
comp1 = 1.0061 comp2 = -0.99199 comp3 = 0.59959 comp4 = 0.29124
Vous obtenez une composante de 1 pour le premier, ce qui était prévisible en remarquant que le signal et b1 avaient exactement la même forme.
Vous obtenez -1 pour le deuxième, ce qui est cohérent avec le triangle inversé dans le signal.
Et pour les deux autres, les choses sont moins claires.
Recomposer un signal
Par la relation de Chasles, on devrait normalement pouvoir recomposer un vecteur sur une base orthonormale {→ui,i=1…N} :
Testons cela !
%on recompose le signal:
signal_recomp = comp1*b1 + comp2*b2 + comp3*b3 + comp4*b4;
clf;%nettoie la fenetre graphique
plot(signal,'k')
hold on
plot(signal_recomp,'r')
hold off
Vous devriez obtenir :

Pas mal !
Avions-nous bien une base orthonormée ?
Les vecteurs sont-ils unitaires ?
Si la recomposition a si bien marché, c'est que plusieurs conditions ont été réunies. En premier lieu les vecteurs de bases sont bien unitaires.
Vérifions que cette assertion est vraie. Un vecteur unitaire, c'est un vecteur de norme 1, c'est-à-dire que :
Testons cela sur le vecteur →b1 (le signal en forme de porte) :
% test du caractère unitaire:
norm1 = sqrt(prodscal(b1,b1))
La console répond :
norm1 = 1.00000
Nous avons donc la confirmation que le premier vecteur de base est bien unitaire. Vous pouvez vérifier que c'est également le cas pour les autres vecteurs.
Les vecteurs sont-ils orthogonaux entre eux ?
Toujours pour que la décomposition soit valide, il faut que les vecteurs de base soient orthogonaux entre eux.
Que signifie orthogonal ? Eh bien, tout simplement que leur produit scalaire est nul :
Vérifions si c'est bien le cas pour →b1 (le signal en forme de porte) et →b2 (le signal en forme de triangle) :
%test de l'orthogonalité
orthob1b2 = prodscal(b1,b2)
La console répond :
orthob1b2 = 0
Là où l'on pourrait être plus sceptique, c'est pour b3 et b4 qui ont des valeurs non nulles au même endroit. Le produit scalaire de ces deux vecteurs risque donc d'être non nul.
Regardons ce qui se passe :
%test de l'orthogonalité
orthob3b4 = prodscal(b3,b4)
Cette fois, la réponse n'est pas tout à fait 0 :
orthob3b4 = -1.2250e-17
Certes, ce n'est pas tout à fait nul, mais c'est très petit. Donc, on pourra considérer que ces deux vecteurs sont quasiment orthogonaux et cela ne devrait pas trop affecter notre décomposition.
Vous allez dire : "c'est un peu un miracle tout ça".
Eh bien, pas tant que ça. Les deux signaux b3 et b4 n'ont pas été choisis au hasard. Comme vous le remarquerez surement, il s'agit dans un cas d'un sinus et dans l'autre d'un cosinus de même période. Et le tout pris sur une période complète.
Or, si vous vous rappelez de vos cours de maths, vous vous souviendrez sûrement (ou pas du tout ) que :
Donc, ce n'est pas tant que ça un miracle.
Vous pouvez vérifier que toutes les combinaisons possibles des vecteurs de base qui vous sont fournis sont orthogonales.
Nous avions donc bien des vecteurs de base orthonormés.
Y-t-il autant de vecteurs de base que la taille de l'espace ?
Enfin, pour que vous soyez assuré de recomposer le signal complètement, il faut autant de vecteurs de base que la taille de l'espace.
Or ici, la taille de l'espace est le nombre de points, il y en a N = length(signal)
, soit dans notre cas : 100.
Nous n'avions que 4 vecteurs de base, c'est donc bien insuffisant pour pouvoir constituer une base complète, c'est d'ailleurs pour cela qu'il y a au final une différence entre le signal reconstitué et les données.
Conclusion
Vous venez de recomposer un signal à partir d'éléments de base. Pour le moment, ces éléments de base étaient visuellement faciles à reconnaître (triangle, carré, vague) mais ils ne sont pas très utilisés pour le reste des signaux.
Dans la suite du cours, vous allez voir que les signaux de base en forme de sinusoïdes sont particulièrement intéressants.