Recomposer un signal

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 :

  1. autant de vecteurs que la dimension de l'espace
  2. qu'ils soient tous de norme 1
  3. qu'ils soient tous orthogonaux entre eux
Plus exactement, il faut que ces vecteurs forment une famille libre et génératrice de l'espace de travail. Mais contentons-nous de l'approximation ci-dessus.

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.

Faites-moi confiance, je ne me suis pas trompé, il s'agit bien de vecteurs de base.  <img class=" src="https://openclassrooms.com/bundles/common/images/smiley/smile.png">  (Ils sont unitaires et orthogonaux entre eux.)


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 :

Représenter tous les signaux qui vous sont fournis
Représenter tous les signaux qui vous sont fournis

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) :

\( composante \ de \overrightarrow{v} sur \ \overrightarrow{u_{1}} = ⟨ \overrightarrow{v} , \overrightarrow{u_{1}}⟩ \)

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  \( \{ {\overrightarrow{u_{i}},i=1…N} \} \) :

\( \overrightarrow{v} = \sum_{i=1}^n <\overrightarrow{v},\overrightarrow{u_{i}}> \overrightarrow{u_{i}} \)

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 :

Le signal original (en noir) et votre reconstitution (en rouge)

Le signal original (en noir) et votre reconstitution (en rouge

Pas mal !

Avions-nous bien une base orthonormée ?

J'ai prétendu tout à l'heure que b1, b2, b3 et b4 étaient des signaux de base. Et si vous décidiez de ne pas me croire ? À ce stade, vous devriez savoir comment vérifier mes dires.

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 :

\( \begin{Vmatrix}\overrightarrow{u} \end{Vmatrix} = \sqrt{<\overrightarrow{u},\overrightarrow{u}>} \\ =1 \)

Testons cela sur le vecteur  \( \overrightarrow{b_{1}} \) (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 :

\( \overrightarrow{u} ⊥ \overrightarrow{v} \Leftrightarrow <\overrightarrow{u},\overrightarrow{v}> = 0 \)

Vérifions si c'est bien le cas pour \( \overrightarrow{b_{1}} \) (le signal en forme de porte) et \( \overrightarrow{b_{2}} \) (le signal en forme de triangle) :

%test de l'orthogonalité
orthob1b2 = prodscal(b1,b2)


La console répond :

orthob1b2 = 0

Ce n'est pas une énorme surprise : comme b1 et b2 ont des valeurs non nulles à des endroits strictement différents, chaque terme du produit scalaire fera intervenir une multiplication par 0. La somme totale est donc nulle.

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.

Plus exactement, \( ⟨\overrightarrow{b_{3}}\overrightarrow{b_{4}}⟩≪⟨\overrightarrow{b_{3}},\overrightarrow{b_{3}}⟩=1 \) . Dire qu'une grandeur est petite n'a de sens que lorsqu'elle est négligeable devant une autre grandeur de référence.

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 :

\( \int_{0}^{2 \Pi } sin(x)cos(x)dx=0 \)


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.