• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 04/02/2020

Reconstruire un signal à partir de sa TF

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

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 ici.

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:Te:(N-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 fonctionfft 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.

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.

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 à zero.
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 :

v=N1k=0v,δkδ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 CanoniqueFrequentiel.

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 sur le signal temporel.

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.

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.

Exemple de certificat de réussite
Exemple de certificat de réussite