Reconstruire un signal à partir de sa TF

Dans le chapitre précédent, vous avez vu comment tracer le spectre d'un signal.

L'idée de ce chapitre est de modifier un peu le signal dans sa représentation spectrale et de voir l'effet que cela aura sur la représentation temporelle.

Acquisition des données et obtention des paramètres importants

Vous trouverez les données à utiliser

Le fichier que vous utilisez est un vrai son, vous pouvez d'ailleurs l'écouter avec votre lecteur audio favori.

%Acquisition des données audio
[SonStereo Fe] = audioread('violon.wav'); %Fe est la fréquence d'échantillonnage (44100 Hz est une fréquence souvent utilisée pour les fichiers sonores)
SonMono = SonStereo(:,1); % SonStereo a deux colonnes car le son a été enregistré sur deux voies. Ne prenez que la première voie.
N = length(SonMono); % le nombre de points du signal
Te = 1 / Fe; % durée entre deux échantillons


Vous l'avez sans doute remarqué, une musique stéréo ne correspond pas qu'à un seul signal. Il y en a en fait deux, un pour chaque haut-parleur.

Nous n'allons travailler que sur une seule voie et nous travaillerons finalement qu'avec un son mono.

Si vous voulez, vous pouvez visualiser le son en utilisant :

t = [0:TetristeN-1)*Te]; % temps (part de 0, avance de Te en Te, et contient N points
plot(t,sonMono); %tracé de l'amplitude du HP en fonction du temps


Vous remarquerez alors qu'un son, en représentation temporelle, correspond à des oscillations (en fait les oscillations de la membrane du micro ou bien du haut-parleur) plus ou moins rapides au cours du temps et dont l'amplitude varie.

Obtention du spectre

Puisque nous avons le nombre de points et la durée d'échantillonnage vous pouvez d'ores et déjà savoir à quoi correspondra l'espace des fréquences (voir chapitre précédent) :

Freq = [0:N-1]/(N*Te); %l'espace des fréquences


Et vous devriez savoir qu'il est possible d'obtenir sa transformée de Fourier facilement avec la fonction fft de Matlab.

%représentation fréquentielle
subplot(2,1,1)
plot(Freq, abs(tf),'k') % tracé de l'amplitude en fonction de la fréquence
xlim([0 10000])% on se limitte aux fréquences <10 kHz
subplot(2,1,2)
plot(Freq, arg(tf),'r') % tracé de la phase en fonction de la fréquence
xlim([0 10000])


Vous devriez obtenir :

Tracé du spectre (amplitude et phase) du signal associé au son du violon.

Tracé du spectre (amplitude et phase) du signal associé au son du violon.

Vous remarquez que cette fois, nous avons profité de l'occasion pour représenter également la phase (l'argument) de la TF. Cela n'a pas été très utile au final, car il semble que la phase soit un nombre plus ou moins aléatoire dans notre cas.

Quant à l'amplitude, il y a plus de choses à dire :

  • Toutes les fréquences ne sont pas également représentées.
  • L'essentiel du signal est contenu dans une bande de fréquence partant de 250 Hz jusqu'à 6000 Hz.
Vous voyez plusieurs pics : par exemple autour de 1000 Hz, à 900, 1000 et 1100 Hz à peu près (zoomez !).
Attention, ça ne veut pas dire que le son contient à un moment donné un son à 1000 Hz, puis à un autre moment un son à 900 Hz et encore à un autre un son à 1100 Hz. Cela serait vrai si les spectres s'additionnaient, ce qui n'est pas le cas.
La seule chose que vous pouvez dire, c'est que l'ensemble du son contient des composantes importantes de fréquences à 900, 1000 et 1100 Hz.

Un curieux motif

Pendant que vous y êtes, zoomez un peu autour de 440 Hz.

Voici ce que nous observons:

Un motif qui rappelle curieusement le sinus cardinal associé à une porte...
Un motif qui rappelle curieusement le sinus cardinal associé à une porte...

Pour le moment, vous n'avez pas encore trop les moyens de comprendre pourquoi ce motif, associé normalement à une porte, apparaît dans le son du violon. Mais bientôt vous comprendrez.

Si vous êtes vraiment trop impatient, sachez que cela vient du fait que le signal entier n'a qu'une durée limitée (8 s). Le son idéal (qui dure depuis l'origine des temps et jusqu'à la fin des temps) a été de fait multiplié par une porte de largeur 8 secondes. En conséquence, tous les pics du spectre idéal se verront rajoutés ce motif (on parle de convolution).

Modification du spectre

Au vu de cette représentation fréquentielle, il apparaît que certaines composantes ne contribuent pas ou pas beaucoup au signal. Que se passerait-il si nous les supprimions ?

Je propose par exemple de supprimer toutes les composantes inférieures à 50 (critère un peu arbitraire pour le moment). Voici une façon de procéder :

%Modification du spectre
tf2 = tf;% On commence par copier la tf originale
A_modifier = (abs(tf) < 50); % A_modifier est un tableau de 0(non) ou 1(oui) qui indique les indices à modifier dans le tableau tf
tf2(A_modifier) = 0; % On met à zero les composantes de faible amplitude.
% On représente notre modification
clf; %Nettoyage de la figure courante
plot(Freq,abs(tf),'k') % L'originale
hold on
plot(Freq,abs(tf2),'r') % La copie modifiée
xlim([0 2000]) % cette fois on est encore plus brutal, et on ne regarde que les fréquences < 2000 Hz
hold off

Vous obtenez alors :

Spectre original en noir, spectre modifié en rouge. Les composantes d'amplitude trop basses ont été mise à zéro.
Spectre original en noir, spectre modifié en rouge. Les composantes d'amplitude trop basses ont été mise à zéro.

OK c'est bien, mais qu'est-ce que ça change pour le signal lui-même ?

  • Est-ce que la représentation temporelle en sera beaucoup affectée ?
  • Est-ce que le son sera toujours identique à l'oreille ?

Reconstitution du signal temporel

Pour répondre à ces questions, il faut reconstituer le signal à partir de sa représentation fréquentielle.

Mathématiquement, ce n'est pas bien compliqué, il s'agit d'un nouveau changement de base, sauf que cette fois, nous sommes dans la base fréquentielle et nous voulons aller vers la base canonique.

Pour reconstituer le signal, il faut donc calculer :

\( \overrightarrow{v} = \sum_{k=0}^{N-1}<\overrightarrow{v} , \overrightarrow{\delta_{k}} > \overrightarrow{\delta_{k}} \)

Nous n'allons pas refaire toute la théorie, sachez que c'est très similaire au chemin que nous avons suivi pour faire le changement de base Canonique Frequentiel.

Nous allons nous contenter d'utiliser la fonction built-in de Matlab ifft (pour "inverse fft").

son2 = ifft(tf2); %TF inverse: retour dans l'espace temporel
clf; %Netttoyage de la figure courante
plot(t,SonMono,'k')
hold on
plot(t,son2,'r')
hold off
xlim([0 1]) % on ne regarde que ce qui se passe pendant la première seconde.
xlabel('temps (s)')
ylabel('amplitude')


Vous devriez obtenir :

Signal temporel original (en noir) et signal dont le spectre a été modifié (en rouge).

Signal temporel original (en noir) et signal dont le spectre a été modifié (en rouge).

Visuellement, les deux signaux semblent très similaires, au moins en termes d'amplitude ; vous pouvez vérifier en zoomant que c'est aussi vrai dans les détails. Il reste similaire, bien que nous ayons mis à zéro une grande partie du spectre !

Si visuellement le signal est peu affecté, qu'en est-il de façon auditive ?

Pour jouer le signal directement depuis Matlab, vous pouvez utiliser la commande "sound".

sound(son2,Fe); %Joue le signal son2, il faut préciser la fréquence d'échantillonnage (ici 44100 Hz, Fe).

Et là c'est un peu décevant, le son a été dégradé. Il n'est pas aussi clair que l'original.

On ne peut donc pas faire n'importe quoi sur le spectre, sans que cela n'ait de conséquences

Conclusion

Dans ce chapitre nous avons vu comment changer de représentation un signal, c'est-à-dire comment changer de base et  comment reconstruire un signal à partir d’éléments de base.

Les points essentiels à retenir sont : L'expression des vecteurs de base de Fourier (exponentielles complexes). Le spectre associé aux fonctions usuelles (sinusoïdes et portes). Comment en pratique tracer un spectre (utilisation de fft en Matlab) Surtout comment déterminer l'axe des fréquences : [0:N-1]/(N*Te)


Dans le chapitre suivant, vous verrez quels sont les atouts de la convolution, un outil qui va de pair avec la transformée de Fourier. Mais avant de passer au chapitre suivant, je vous invite à tester vos connaissances avec le quiz sur la représentation fréquentielle.