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 :

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:

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 :

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

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.