Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Utilisation de la transformée de Fourier discrète réelle pour récupérer les harmoniques d'un son
Le but de cette page est de voir un peu ce qui se cache derrière des compressions de sons qu'on retrouve dans des formats de sons comme le MP3 par exemple. Elle est déstinée à des lycéens et/ou curieux donc nous présenterons seulement ce qu'est la transformée de Fourier discrète réelle et comment l'implémenter à la main en python pour la voir fonctionner.
La théorie
Nous avons vu, page précèdente, qu'un son wave est simplement une suite de données joué à une certaine fréquence. Notons la taille de ces données et
et
On a alors le miracle suivant : à partir de ces deux suites, on peut retrouver celle de départ par la formule d'inversion :
Exemple à la main
Si je considère le "son" dont les données sont
Calculons les coefficients :
a 0 = d 0 ∗ c o s ( 2 π ∗ 0 ∗ 0 3 ) + d 1 ∗ c o s ( 2 π ∗ 0 ∗ 1 3 ) + d 2 ∗ c o s ( 2 π ∗ 0 ∗ 2 3 )
a 0 = 1 ∗ 1 + 2 ∗ 1 + ( − 1 ) ∗ 1 = 2 a 1 = d 0 ∗ c o s ( 2 π ∗ 1 ∗ 0 3 ) + d 1 ∗ c o s ( 2 π ∗ 1 ∗ 1 3 ) + d 2 ∗ c o s ( 2 π ∗ 1 ∗ 2 3 )
a 1 = 1 ∗ 1 + 2 ∗ ( − 1 2 ) + ( − 1 ) ∗ ( − 1 2 ) = 1 2 a 2 = d 0 ∗ c o s ( 2 π ∗ 2 ∗ 0 3 ) + d 1 ∗ c o s ( 2 π ∗ 2 ∗ 1 3 ) + d 2 ∗ c o s ( 2 π ∗ 2 ∗ 2 3 )
Pour les coefficientsa 2 = 1 ∗ 1 + 2 ∗ ( − 1 2 ) + ( − 1 ) ∗ ( − 1 2 ) = 1 2 les calculs sont très similaires et on obtientb k ,b 0 = 0 etb 1 = 3 3 2 .b 2 = 3 3 2
Utilisons maintenant la formule d'inversion pour se convaincre qu'elle marche bien :
1 3 ( a 0 ∗ c o s ( 2 π ∗ 0 ∗ 0 3 ) + b 0 ∗ s i n ( 2 π ∗ 0 ∗ 0 3 ) + a 1 ∗ c o s ( 2 π ∗ 1 ∗ 0 3 ) +
b 1 ∗ s i n ( 2 π ∗ 1 ∗ 0 3 ) + a 2 ∗ c o s ( 2 π ∗ 2 ∗ 0 3 ) + b 2 ∗ s i n ( 2 π ∗ 2 ∗ 0 3 ) )
= 1 3 ( 2 ∗ 1 + 0 ∗ 0 + 1 2 ∗ 1 + 3 3 2 ∗ 0 + 1 2 ∗ 1 + 3 3 2 ∗ 0 ) = 1 = d 0 1 3 ( a 0 ∗ c o s ( 2 π ∗ 0 ∗ 1 3 ) + b 0 ∗ s i n ( 2 π ∗ 0 ∗ 1 3 ) + a 1 ∗ c o s ( 2 π ∗ 1 ∗ 1 3 ) +
b 1 ∗ s i n ( 2 π ∗ 1 ∗ 1 3 ) + a 2 ∗ c o s ( 2 π ∗ 2 ∗ 1 3 ) + b 2 ∗ s i n ( 2 π ∗ 2 ∗ 1 3 ) )
Missing or unrecognized delimiter for \right - Je vous laisse le plaisir de prouver que le dernier calcul donne -1...
Quelques précisions encore : En utilisant les formules de trigonométrie classiques, on peut trouver un
La pratique
On peut se demander quel est l'intérêt de faire tous ces calculs avec les données de notre son si au final on retrouve les mêmes qu'au départ. Nous allons voir que c'est pourtant extrêment astucieux. En effet, une fois nos
De plus, tous les coefficients
Cette simple réecriture de nos données en somme de Fourier nous permet donc naturellement d'éliminer un grand nombre de données et ainsi réduire la place nécessaire pour stocker notre son. Bien sûr les compressions comme le MP3 sont un peu plus optimales encore que cette méthode mais elles en sont grandement inspirées.
Le codage
Je vais me contenter d'expliquer l'idée général du code ci-dessous. Tout d'abord, le code est séparé en 2 onglets : le premier où on travaille sur notre son et le second où sont regroupées les fonctions calculatoires en lien avec les coefficients de Fourier.
Commençons par le second onglet : Il contient les fonctions correspondant à la théorie présentées ci-dessus. Une qui calcule les coefficients de Fourier. Une qui donne le coefficient si on regroupe le cosinus et le sinus en un seul cosinus. Enfin une fonction d'inversion qui redonne les coefficients initiaux à partir des coefficients de Fourier. Comme sur ce site on est limité à 30 sec de calculs, on est obligé d'utiliser numpy pour accélérer grandement nos calculs. Ils respectent cependant les calculs présentés dans la partie théorique.
Le premier onglet est normalement assez lisible. On charge les données de notre son. On ne peut malheureusement pas faire le traitement avec toutes les données (car le temps de calcul est trop limité sur ce site) donc on coupe un peu la fin du son et on ne garde qu'une donnée sur 3. Du coup notre fréquence d'échantillonage est divisée par 3 aussi.
On calcule ensuite les coefficients de Fourier de notre son. Comme dit précédemment, il ne sert à rien de conserver les coefficients correspondant à des fréquence trop haute. On choisit de couper ici à 4000Hz ce qui est en gros la note la plus aigue d'un piano. On cherche alors à quel indice
On affiche ensuite les coefficients harmoniques en fonction des frequences (voir précisions en bas de page). Ce graphique est important car il permet de voir quelles frequences fondamentales se trouve dans notre son. Ici on peut voir qu'il y a un gros pic pour la frequence 440hz (Normal puisque le son représente un LA joué au piano) mais aussi un pic pour les multiples de 440 : 880hz, 1320 hz, 1760 hz, 2200 hz... qui correspondent respectivement à un LA(à l'octave), un MI, un LA (2 octaves au dessus) et un DO#. Donc en réalité, quand on joue une note avec un instrument, le son n'est pas pur mais au contraire il y a plusieurs notes dans une. Par exemple les notes LA+MI+DO# forment l'accord de LA Majeur. Autre remarque : ce qui permet de différencier des instruments (on reconnait très facilement si un LA est joué au piano ou à la guitare ou à la trompette...) c'est simplement les différences de hauteurs des pics dans ce diagramme.
On termine le traitement de notre son en arrondissant à 0 tous les coefficients trop faibles (ici inférieur à 2 mais vous pouvez tester avec un seuil plus grand).
Enfin on écoute le résultat après tant d'efforts. Il n'est pas si différent par rapport à l'original pourtant il contient presque 10 fois moins de coefficients.
Tout ce qui précède est très perfectible. Le but était ici de montrer les idées qui sont derrière beaucoup de type de compression de données (sons, images...). Si on veut le faire plus efficacement, il vaut mieux utiliser des fonctions déjà existantes comme celles se trouvant dans le module numpy.fft
qui vont beaucoup beaucoup beaucoup plus vite que les fonctions naives présentées ici. Mais ce n'est qu'en codant à la main les techniques qu'on les comprend vraiment. N'hésitez pas à adapter les codes précédents pour pouvoir les utiliser sur votre ordinateur où vous pourrez laisser calculer davantage et sur des sons plus longs.
Quelques précisions sur les fréquences harmoniques
Le fait qu'un son représenté par des valeurs discrètes soit la somme de sons "purs" n'est pas réellement une évidence à partir des formules ci-dessus. En effet, dans ces formules on a
Pour mieux comprendre ce qui se passe, il faut revenir à l'origine : Un son peut être vu comme une fonction
On traite ces données comme on a vu précédemment pour obtenir la décomposition
On remarque que pour les valeurs
Une dernière remarque : pour connaitre la fréquence associée au son "pur" il suffit de calculer