La conversion audio sous linux

Transcription

La conversion audio sous linux
GILBERT Louis-Marie
LETOURNEAU Christophe
LE TEXIER Nicolas
Licence T&E3
ISTIA
2006-2007
La conversion audio sous linux
Mai
- juin 2007
Responsable de projet : M. Julien ROUSSEAU
Remerciements
Nous remercions vivement Julien ROUSSEAU pour ses suggestions et ses observations qui
nous ont permis de nous guider durant nos travaux. Ses connaissances dans le domaine
informatique, et plus particulièrement sur le système d’exploitation linux nous ont été utiles
pour nous débloquer de situations difficiles.
Nous avons aussi une pensée particulière pour MM DANIEAU, DUTHIL et LASTERRA.
Même si nous travaillions sur des sujets sensiblement différents, nous oeuvrions ensemble
pour obtenir un résultat qui soit compatible. Leur acquis sur linux et leur disponibilité nous
ont été profitable pour l’avancement de nos travaux.
Une dernière pensée pour l’ensemble des étudiants et des professeurs qui étaient présent
durant ce projet : l’atmosphère de bonne humeur et le sérieux présent du début à la fin nous
ont été très bénéfique.
Licence T&E3
-2-
Mai – Juin 2007
Sommaire
Introduction ........................................................................................................................................p.4
Chapitre I : Qu’est-ce que le son ? ..................................................................... p.5
I.1 – Présentation du son .........................................................................................p.6
I.2 – Le son en informatique...................................................................................p.7
Chapitre II : Les différents formats de fichiers........................................... p.9
II.1 – Le format WAVE................................................................................................p.10
II.2 – La compression.................................................................................................p.13
II.3 – Les autres formats..........................................................................................p.14
Chapitre III : Le passage d’un format à un autre ...........................................p.17
III.1 – Pourquoi convertir ........................................................................................p.18
III.2 – Des formats différents. ...............................................................................p.18
III.3 – Comment convertir ?....................................................................................p.18
Chapitre IV : La compression par Fourier et Huffman ................................p.20
IV.1 – La compression par transformée de Fourier ...................................p.21
IV.2 – La compression par la méthode d’Huffman......................................p.26
Chapitre V : Notre application .....................................................................................p.31
V.1 – L’organisation des tâches...........................................................................p.32
V.2 – Les fonctionnalités du logiciel .................................................................p.32
V.3 – Problèmes rencontrés et solutions apportées.................................p.31
Conclusion..........................................................................................................................................p.32
Licence T&E3
-3-
Mai – Juin 2007
Introduction
1 - Conditions de réalisation.
Le projet a été réalisé dans le cadre de la licence LTE3. Il permet aux étudiants de
mettre en pratique leurs acquis et de développer de nouvelles connaissances.
Encadré par un enseignant, chaque groupe prend en charge un projet depuis sa
conception jusqu’à sa réalisation. Pendant une période d’un mois, des postes informatiques
sont mis à disposition des étudiants.
A l’issue du temps imparti, le projet donne lieu à une soutenance.
Notre groupe composé des étudiants GILBERT Louis-Marie, LETOURNEAU
Christophe et LE TEXIER Nicolas s’est vu confié le projet son temps réel sous linux, sous la
responsabilité de M.ROUSSEAU.
2 - Objectifs du projet.
Le projet avait pour but de passer d’un format sonore à un autre. Il fallait ensuite créer
une application pour changer de format. Cette application devait être programmé en langage
C.
De cette application, nous devions en faire une bibliothèque. Il fallait donc savoir
comment créer une bibliothèque sous linux.
Cette première phase accomplie, nous pouvions développer une application graphique en
C++ : orienté objet.
Nous devions ainsi : - Trouver un environnement de développement sous linux,
- Faire appel à la bibliothèque,
- Réfléchir aux options intéressantes pour une application de type
acquisition.
3 - Choix du thème.
Nous avons choisi de développer ce projet en premier lieu pour découvrir
l’environnement de linux. En effet, aucun de nous trois n’avions de connaissance sur ce
système d’exploitation. Linux étant de plus en plus utilisé dans le domaine informatique, et le
fait qu’il soit développé dans le programme de master, découvrir linux par ce projet nous a
paru une bonne introduction.
Un autre point que ce projet développe : le langage C++. Ici aussi, nous ne
connaissions aucun langage orienté objet. Nous pensions que le projet nous permettrait de
découvrir ce concept de langage par nous même et à notre propre rythme.
Un dernier aspect qui nous a fait choisir ce projet informatique plus qu’un autre est le
fait qu’il traite le domaine des sons. Nous avions au préalable quelques notions que nous
avions acquises soit par nous même, soit durant nos années d’études précédentes. Nous avions
envie de développer ces acquis et surtout de pouvoir utiliser nos connaissances,
principalement dans le domaine physique et de pouvoir les manipuler dans le domaine
informatique. Cette dualité hardware-software nous a paru utile pour nous car elle est très
présente dans le monde professionnel.
Licence T&E3
-4-
Mai – Juin 2007
Chapitre I :
Qu’est-ce que le
son ?
Licence T&E3
-5-
Mai – Juin 2007
I.1 – Présentation du son.
Afin de mieux appréhender notre projet, notre travail nécessitait une recherche sur le
comportement physique du son.
Le son est une vibration de l’air, c'est-à-dire une suite de surpressions et de dépressions de
l’air par rapport à une moyenne, qui est la pression atmosphérique. La façon la plus simple de
reproduire un son est de faire vibrer un objet.
Pour reproduire des sons, on utilise généralement des haut-parleurs. Il s’agit en fait d’une
membrane reliée à un électroaimant qui, suivant les sollicitations d’un courant électrique, va
aller en avant et en arrière très rapidement, ce qui provoque une vibration de l’air situé devant
lui, c’est-à-dire du son.
De cette façon, on produit des ondes sonores qui peuvent être représentées sur un graphique
comme les variations de la pression de l’air (ou bien de l’électricité dans l’électroaimant) en fonction
du temps. On obtient alors une représentation de la forme suivante :
Cette représentation du son est appelée « spectre de modulation d’amplitude » (modulation de
l’amplitude d’un son en fonction du temps). Le sonogramme représente par contre la variation des
fréquences sonores en fonction du temps. On peut remarquer qu’un sonogramme présente une
fondamentale, à laquelle se superposent des fréquences plus élevées, appelées harmoniques.
Licence T&E3
-6-
Mai – Juin 2007
C’est ce qui permet d’arriver à distinguer plusieurs sources sonores : les sons graves
auront des fréquences basses, et les son aigus, des fréquences élevées.
I.2 – Le son en informatique.
Après avoir étudier ce qu’était le son dans le monde physique, nous devions comprendre
comment ce déroule le passage du son de hardware à software. Pour appréhender ce
processus, nous avons cherché comment le son est codé après qu’il soit échantillonné.
I.2.A – L’échantillonnage du son.
Pour pouvoir représenter un son sur un ordinateur, il faut arriver à le convertir en
valeurs numériques, car celui-ci ne sait travailler que sur ce type de valeurs. Il s’agit donc
de relever des petits échantillons de son (ce qui reviens à relever des différences de
pression) à des intervalles de temps précis. On appelle cette action, « l’échantillonnage »
ou « la numérisation du son ». L’intervalle de temps entre deux échantillons est appelé
taux d’échantillonnage. Etant donné que pour arriver à restituer un son qui semble continu
à l’oreille il faut des échantillons tous les 100 000ièmes de seconde, il est plus pratique de
raisonner sur le nombre d’échantillons par seconde, exprimés en Hertz (Hz). Voici
quelques exemples de taux d’échantillonnage et de qualités du son associées :
Taux d’échantillonnage
44 100 Hz
22 000 Hz
8 000 Hz
Qualité du son
Qualité CD
Qualité radio
Qualité téléphone
La valeur du taux d’échantillonnage, pour un CD audio par exemple, n’est pas
arbitraire, elle découle du théorème de Shannon. La fréquence d’échantillonnage doit être
suffisamment grande, afin de préserver la forme du signal. Le théorème de Nyquist –
Shannon stipule que la fréquence d’échantillonnage doit être égale ou supérieure au
double de la fréquence maximale contenue dans ce signal. Notre oreille perçoit les sons
jusqu’à environ 20 000 Hz, il faut donc une fréquence d’échantillonnage d’au moins
40 000Hz pour obtenir une qualité satisfaisante.
I.2.B – Le codage du son.
A chaque échantillon (correspondant à un intervalle de temps) est associé une valeur
qui détermine la valeur de la pression de l’air à ce moment, le son n’est donc plus
représenté comme une courbe continue présentant des variations, mais comme une suite
de valeur pour chaque intervalle de temps :
Licence T&E3
-7-
Mai – Juin 2007
L’ordinateur travail avec des bits, il faut donc déterminer le nombre de valeurs que
l’échantillon peut prendre, cela revient à fixer le nombre de bits sur lequel on code les
valeurs des échantillons, par exemple :
Avec un codage sur 8 bits, nous aurons 28 soit 256 valeurs possibles
Avec un codage sur 16 bits, nous aurons 216 soit 65536 valeurs possibles
Nous aurons bien évidemment une meilleure qualité du son avec un codage en 16 bits,
mais aussi un besoin en mémoire plus important.
Enfin, la stéréophonie nécessite (procédé de reproduction des sons qui permet de faire
croire à l’auditeur qu’il est dans une salle de concert) deux canaux sur lesquels on
enregistre individuellement un son qui sera fourni au haut-parleur de gauche, et un son qui
sera diffusé à celui de droite.
Le son est donc représenté informatiquement par plusieurs paramètres :
La fréquence d’échantillonnage
Le nombre de bits d’un échantillon
Le nombre de voie (1 : Mono ; 2 : Stéréo ; 4 : quadriphonie)
I.2.C – Mémoire requise pour stocker un son.
Il est simple de calculer la taille d’une fréquence sonore non compressée. En effet, en
connaissant le nombre de bits sur lequel est codé un échantillon, on connaît la taille de
celui-ci (la taille est le nombre de bits).
Pour connaître la taille d’une voie, il suffit de connaître le taux d’échantillonnage, qui
va nous permettre de savoir le nombre d’échantillons par seconde, donc la taille
qu’occupe une seconde de musique. Celle-ci vaut :
Taux d’échantillonnage x Nombre de bits
Ainsi, pour connaître l’espace mémoire que consomme un extrait sonore de plusieurs
secondes, il suffit de multiplier la valeur précédente par le nombre de secondes :
Taux d’échantillonnage x Nombre de bits x Nombre de secondes
Enfin, la taille finale de l’extrait est à multiplier par le nombre de voies (elle sera alors
deux fois plus importante en stéréo qu’en mono). La taille en bit d’un extrait sonore est
ainsi égale à :
Taux d’échantillonnage x Nombre de bits x Nombre de secondes x Nombre de voies
Licence T&E3
-8-
Mai – Juin 2007
Chapitre II :
Les différents formats
de fichiers
Licence T&E3
-9-
Mai – Juin 2007
II.1 – Le format WAVE.
Le format WAVE est un pilier pour notre application. Il est par exemple utilisé comme
pivot pour les conversions de fichier. Nous utilisions ce format pour notre application car la
majorité des autres formats est protégé en écriture. Ainsi, leur structure et leur fonctionnement
ne nous étaient pas dévoilés. Il nous a donc fallu connaître la structure du format WAVE.
Le format WAVE est à la base un format de fichier développé par Microsoft, destiné à
contenir du son. Pour être plus précis, le format WAVE est un format d'encapsulage (comme
le format AVI pour la vidéo). Il ne définit pas de méthode d'encodage du son, sauf pour le
format brute que nous allons étudier ici.
II.1.A – Structure d’un fichier WAVE.
Le WAVE est un format structuré, composé d'une suite de blocs clairement
identifiables dont le rôle est plus ou moins établit. Typiquement, un bloc est composé de
trois parties :
Nom/identifiant du bloc (différencie ce bloc de tous les autres)
Taille des données du bloc (en octet)
Données du bloc
La structure globale d'un fichier WAVE est un superbloc, le bloc RIFF, qui encapsule
d'autres blocs que nous verrons au paragraphe suivant. Le bloc RIFF est appelé ainsi car
les 4 octets du champ Chunk_ID est composé des 4 caractères ASCII : R, I, F, F.
Le champ Chunk_Size correspond à la taille totale du fichier WAVE auquel on
retranche les 8 octets occupés par les champs Chunk_ID et Chunk_Size du bloc RIFF.
II.1.B – Codage des entiers.
Les entiers signés stockés dans les fichiers WAVE sont codés en little-endian
complément à 2 (le format des entiers sur les plate-forme Intel). Ceci signifie qu'un entier
stocké sur plusieurs octets sera enregistré avec l’octet de poids le plus faible d'abord.
En pratique, l'entier 12345678 en base 10 s'écrit BC614E en base 16. On complète
par des zéros pour obtenir un entier sur 32 bits (4 octets) : 00BC614E. Notre fichier
WAVE contiendra donc la suite d'octets suivante : 4E 61 BC 00 (les octets ont été
« renversés »).
Ce codage est valable pour tous les entiers d'un fichier WAVE, y compris les champs
Chunk_Size.
Licence T&E3
- 10 -
Mai – Juin 2007
II.1.C – Deux blocs principaux.
À l'intérieur des données du bloc RIFF, nous retrouvons plusieurs autres blocs. Il est
important de noter que l'ordre d'apparition de ces autres blocs n'a pas d'importance.
Nous allons traiter deux des blocs les plus importants : le bloc Format et le bloc Data.
Le bloc Format.
De manière générale, les blocs peuvent être enregistrés dans n'importe quel ordre.
Il existe une exception : le bloc Format doit toujours être placé avant le bloc Data.
Le bloc format est identifié par le Chunk_ID « fmt » (notez l'espace pour le
quatrième caractère après fmt), ou 66 6D 74 20 dans le fichier WAVE.
Ce bloc contient un certain nombre d'informations sur l'échantillonnage du son,
l'algorithme de compression utilisé, etc. Ci-dessous, la description des différents
champs :
wFormatTag (2 octets) :
Indique la façon dont le bloc Data doit être interprété.
- 00 00 indique que le format est inconnu.
- 00 01 indique qu'il s'agit de données brutes (c'est ce format qui nous intéresse).
- FF FF indique un format expérimental.
D'autres codes existent permettant de stocker des données MP3 par exemple. Dans
ce cas, le bloc format peut contenir des champs supplémentaires (en fin de bloc)
pour permettre la décompression.
wChannels (2 octets)
Spécifie le nombre de canaux enregistrés.
- 00 01 signifie qu'il s'agit d'un son monophonique
- 00 02 stéréophonique
- 00 04 quadriphonique
- etc.
Toutes les valeurs sont possibles pour ce champ, excepté zéro.
dwSamplesPerSec (4 octets)
Indique le nombre d'échantillons enregistrés par seconde et par canal. Ce champ
est exprimé en Hertz (Hz).
Licence T&E3
- 11 -
Mai – Juin 2007
On retrouve généralement des valeurs telles que 44100, 22050, 11025, 8000, etc.
Bien entendu, n'importe quelle autre valeur est acceptable.
dwAvgBytesPerSec (4 octets)
wBlockAlign (2 octets)
wBitsPerSample (2 octets)
Indique la taille en bit d'un échantillon. Pour des raisons de performances, les
échantillons sont enregistrés en les alignant à l'octet supérieur le plus proche.
Classiquement, des échantillons de 12 bits seront enregistrés sur 16 bits. Le
champs wBitsPerSample permet d'indiquer que seuls les 12 premiers bits sur les
16 sont significatifs.
Le bloc Data
Le bloc de données suit normalement directement le bloc format, mais ce n'est pas
obligatoire. La seule contrainte est qu'il soit placé après le bloc format.
Le bloc format est identifié par le Chunk_ID "data" ou 64 61 74 61 dans le fichier
WAVE.
Le bloc de données regroupe les données brutes du son (pour le format PCM, c'est
à dire non compressé). Les données sont organisées sous la forme d'une suite
d'échantillons (dont la taille est donnée par le bloc Format). Chaque échantillon est
découpé en un certain nombre de chaînes :
une chaîne pour le mono
deux chaînes pour le stéréo
etc
La figure ci-dessous montre comment ces informations s'imbriquent et se
succèdent :
Pour comprendre comment lire ces données, il faut différencier deux cas.
Tout d'abord, il y a le cas des échantillons d'une taille de 8 bits. Les valeurs
stockées sont des entiers non signés sur 8 bits.
Le second cas concerne toutes les autres tailles d'échantillons. Dans ce cas, les
données sont enregistrées sous la forme d'entiers signés en codage little-endian.
Licence T&E3
- 12 -
Mai – Juin 2007
Le codage little-endian consiste à découper un entier écrit en binaire en paquets de
8 bits, puis à renverser l'ordre des paquets (mais pas l'ordre des bits au sein des
paquets!).
Par exemple, voici un nombre binaire sur 24 bits : 00110110 10110100 01101110.
En le codant en little-endian, il devient : 01101110 10110100 00110110. Cette
conversion est nécessaire lors de la lecture et de l'écriture d'un fichier WAVE.
Notez enfin que les valeurs stockées correspondent à la position de la membrane
du haut-parleur à un instant donné. Ainsi, pour les paquets de 8 bits, 0 signifie que la
membrane du haut-parleur est complètement enfoncée, et 255 signifie que la
membrane est complètement en avant.
Les autres blocs
Il existe d'autres blocs, plus ou moins standardisés. Ce qu'il faut comprendre c'est qu'il
ne faut pas altérer ou supprimer un bloc dont on ne comprend pas la signification. Lors de
l'écriture d'un programme qui modifie un fichier WAVE, ce programme ne doit pas faire
de modifications sur des données qu'il ne comprend pas.
II.1.D – Quelques informations supplémentaires.
Voici quelques formules intéressantes qu'il est possible de calculer à partir des
informations d'en-tête :
Débit (en Kbps) : dwAvgBytesPerSec * 8 / 1000
Durée (en secondes) : Data_Size / dwAvgBytesPerSec
Nombre d'échantillons : Data_Size / wChannels / wBitsPerSamples
Taux d'échantillonnage audio (KHz) : dwSamplesPerSec / 1000
Concernant le traitement du signal, l'interprétation des données brutes d'un son WAVE
peut être effectuée grâce à une transformation de Fourier (rapide). Cette transformation
permet notamment d'obtenir une représentation graphique du son (fréquence et/ou
amplitude en fonction du temps) à partir des données brutes. Ceci sera développé plus tard
dans le rapport.
II.2 – La compression.
Une des fonctionnalités de notre application est la compression de fichier. Il existe deux
types de compression, la compression destructrice (aussi appelées Lossy) et la compression
non destructrice (aussi appelée Lossless). Notre application permet les deux. La compression
est utilisée afin de réduire l’espace mémoire utilisé par les fichiers audio.
II.2.A – La compression destructrice.
Une compression destructrice, c'est une compression qui est réalisée en perdant de
l'information. Cela signifie que si l'on décompresse le signal compressé à l'aide d'une telle
technique, on ne retrouvera pas le signal de départ.
Licence T&E3
- 13 -
Mai – Juin 2007
Parmi les techniques de compression destructrices, on a essentiellement des méthodes
qui exploitent les propriétés de l'oreille humaine. Cette dernière entend les fréquences
situées dans la gamme 20 Hz 20 kHz. Si un morceau contient des fréquences hors de cette
gamme, on peut donc purement et simplement les supprimer sans perte de qualité audio
puisque l'oreille ne les entend pas. En fait, on entend surtout correctement les fréquences
situées dans la gamme 2 kHz 5 kHz.
Ces constatations peuvent être exploitées pour réduire la taille des fichiers. On peut
par exemple décider que toutes les fréquences au dessus de 15kHz seront supprimées. On
peut utiliser aussi le principe des fréquences masquées. Si dans un groupe de fréquences,
certaines ont un niveau sonore beaucoup plus élevé que d'autres, il n'est pas nécessaire de
conserver les fréquences de niveau sonore faible puisque l’on ne les entendra pas. Par
exemple, imaginez que vous êtes dans votre jardin et que vous entendez le pépiement des
oiseaux. Un avion passe au dessus de votre tête (même très haut). Vous n'entendrez plus
les oiseaux car le son qu'ils produisent est beaucoup plus faible que celui généré par
l'avion. C'est comme si les oiseaux n'existaient plus ou avaient arrêté de chanter.
II.2.B – La compression non destructrice.
Petit rappel : une seconde de musique c'est une succession de fréquences.
Imaginons que dans la suite d'échantillons composant une seconde de musique on ait
plusieurs fois de suite la même fréquence, par exemple 10 fois. Si au lieu de stocker ces
10 points, on en stocke 1 seul et le nombre de fois où il se répète, on a besoin de coder 2
nombres et non 10.
On utilise également l'algorithme de Huffman comme méthode de codage des
informations. Cette méthode est utilisée dans tous les algorithmes de compression. Le
Chapitre IV explique cet algorithme.
II.3 – Les autres formats.
Dans cette partie, nous ne traiterons pas de tous les formats existants, car il y en a trop, mais
simplement de 3 formats courants, le MP3, le WMA et l’OGG.
II.3.A – Le format MP3.
Le MP3 (MPeg Audio Layer 3) est un format de fichier son compressé obtenu par
suppression de données. Il fut développé par l'organisation de standardisation
internationale (ISO) en 1990.
La compression Mpeg Layer-3 permet de diminuer d'environ 12 fois la taille d'un
fichier audio habituel. Le principal intérêt de ce format est d'atteindre un taux de
compression très important sans perte de qualité sonore. Après la compression, vous ne
ferez aucune différence entre le son original d'un CD et le son de ce CD compresser en
MP3.
Licence T&E3
- 14 -
Mai – Juin 2007
Pour un petit comparatif, avec une compression de 1:12, les fichiers sons ne font plus
que 4 Mo pour 3 minutes alors qu'un fichier WAVE de qualité CD atteint facilement les
40 Mo ( le tout sans dégradation sonore ).
La lecture de tels fichiers se fait via l'intermédiaire de logiciels dédiés qui permettent
le décodage (décompression) de ceux-ci.
II.3.B – Le format WMA.
Le WMA est une technique de compression des formats numériques audio. Le brevet
en a été déposé par Microsoft en 1999. Face au succès du MP3 et l'engouement des
internautes pour ce format, Microsoft se devait de réagir. Ainsi est né le Windows Media
Audio codec.
Le WMA exploite en 1er lieu les propriétés de l'oreille pour réduire la taille d'un
morceau, puis on traite l'aspect stéréo et enfin on applique des codages en terminant par le
codage de Huffman. L'utilisation de toutes les possibilités de réduction évoquées dépend
de la place que l'on souhaite accorder à 1 mn de son compressé et donc du taux de
compression que l'on va devoir appliquer. Pour l'encodage de fichiers son en WMA on
parle plutôt en terme de bitrate que de taux de compression. Le bitrate est le nombre de
bits que l'on autorise pour coder 1 seconde. On aura donc la relation suivante : plus on
veut compresser un morceau (pour qu'il prenne le moins de place possible) plus le bitrate
à choisir devra être faible.
Les fichiers encodés à l'aide du codeur WMA portent l'extension .wma. Dans sa forme
actuelle, le WMA encode des sons numériques provenant de signaux sonores analogiques
échantillonnés à une fréquence pouvant aller de 8 kHz à 48 kHz, sur 8 ou 16 bits, en mono
ou stéréo. L'encodage se fait à bitrate constant. Ce dernier peut se régler à n'importe quelle
valeur comprise entre 5 kbits/s et 192 kbits/s.
Microsoft revendique la qualité suivante : un morceau encodé à 192 kbits/s en WMA
ne peut pas se distinguer de son homologue WAVE issu d'un CD audio et une qualité
audio dite proche du CD est atteinte pour 96 kbits/s. Ceci nous donne 720 ko (à 96 kbits/s)
pour stocker 1 minute de son stéréo. A qualité audio identique, un fichier encodé en
WMA (96 kbits/s) occupe donc 25% de place en moins qu'un fichier encodé en MP3 (128
kbits/s).
II.3.C – Le format OGG.
Le ogg vorbis est un nouveau format audio libre de droit, c'est à dire que ce
format appartient à tout le monde donc vous ne payez personne pour son utilisation.
Vorbis est le nom du schéma de compression audio spécifiquement utilisé pour
créer des fichiers Ogg Vorbis. Il fait partit du projet Ogg constitué pour créer un
système multimédia libre et ouvert. Dès maintenant, Ogg Vorbis, est la première
étape fonctionnelle du projet. Ogg est l'extension de ce format audio.
Ce format a été créé pour faire disparaître tous les formats audio propriétaire, afin
de permettre à ceux qui n'ont pas les moyens de payer une licence, de pouvoir quand
même diffuser leur musique. En effet, un particulier qui écoute le mp3 ou un autre
format ne paye rien, mais les fabricants de logiciels, eux payent pour pouvoir utiliser
le format audio.
Licence T&E3
- 15 -
Mai – Juin 2007
Vorbis utilise des principes mathématiques très différents que ceux du MP3. Les
challenges de compression sont donc différents. Dans des conditions d'écoute
classiques, un fichier .ogg et un autre .mp3 encodés au même taux de Bitrate auront
une qualité d'écoute similaire, mais le ogg vorbis aura une taille plus petite que le
mp3 (et donc beaucoup plus petite que le WAVE) mais par contre le temps
d'encodage est plus long.
Vous pouvez lire le ogg avec le célèbre lecteur winamp, mais il faudra lui ajouter
un plug-in qui se trouve en téléchargement sur le net. Les musiques .ogg se trouvent
aussi en téléchargement sur des sites.
Licence T&E3
- 16 -
Mai – Juin 2007
Chapitre III :
Le passage d’un
format à un autre
Licence T&E3
- 17 -
Mai – Juin 2007
III .1 Pourquoi convertir ?
Il existe un grand nombre de formats audio. Quelque uns nous sont familiers (wave, mp3,
wma, cda), d’autres moins (ogg, midi, mp2, flac) et certains semblent même n’être connus
que de leurs créateurs : vqf, asf, m3u, ram, voc… Et la liste est loin d’être exhaustive. En
réalité, la plupart de ces formats ont été créés dans un but particulier et possèdent des
avantages aussi divers que leurs domaines d’utilisation.
Pour l’anecdote : le format MIDI, créé en 1982 pour permettre l’échange de données entre
instruments de musique électroniques, a été assez populaire (surtout dans le domaine
informatique) mais il est maintenant presque complètement abandonné. En effet, on attend
deux qualités d’un format audio aujourd’hui : une bonne qualité et un espace de stockage
réduit. Si le format midi peut offrir une qualité de son exceptionnelle (ce que beaucoup
ignorent !), il exige également un espace de stockage… exceptionnel ! Il a donc été
abandonné au profit de formats peut-être moins performants mais, en tout cas, moins
gourmands en espace mémoire (le mp3 par exemple).
D’autres formats, utilisés dans la technologie, la recherche, permettent l’enregistrement
de fréquences inaudibles pour l’oreille humaine… Là encore, où est l’intérêt pour un
mélomane ?
Devant cette grande diversité et l’impossibilité de créer des supports s’adaptant à tous les
formats, une mesure s’imposait : la conversion de formats audio.
Avant de parler de conversion, il est néanmoins important de comprendre en quoi ces
formats sont différents.
III.2 Des formats différents.
Quelques rares formas audio n’utilisent pas de compression : le wave, qui contient les
données brutes du son, ou le midi qui utilise un canal de données par instrument. Cependant,
beaucoup de formats audio sont tout simplement des fichiers wave compressés. La différence
entre ces formats réside alors dans leur algorithme de compression. Il en existe plusieurs,
malheureusement, beaucoup sont protégés par des droits commerciaux. Pour cette raison, il
nous a été impossible d’accéder aux algorithmes de codage de plusieurs formats étudiés.
Nous avons néanmoins pu étudier deux méthodes de compression, qui seront présentées
dans le chapitre suivant.
III.3 Comment convertir ?
Pour convertir un fichier audio A, il suffit de connaître son algorithme de codage
(comment il a été codé), puis de lire ce fichier et d’en extraire les données brutes pour en faire
une suite d’échantillons de sons (le corps d’un fichier wave, en somme).
Il ne reste plus ensuite qu’à re compresser le fichier grâce à l’algorithme de codage d’un autre
format pour arriver à la création d’un fichier audio B.
Attention cependant : cette conversion de format peut parfois entraîner la perte de données
et donc produire un fichier B de moindre qualité que le fichier A (et en aucun cas l’inverse !).
Par exemple, un extrait de musique classique enregistré au format wma converti au format
mp3 perdra beaucoup en qualité en raison d’une faiblesse du mp3 à enregistrer les sons ai
Licence T&E3
- 18 -
Mai – Juin 2007
Chapitre IV :
La compression par
Fourier et
Huffman
Licence T&E3
- 19 -
Mai – Juin 2007
IV.1 - La compression par transformée de Fourier.
Il s’agit ici d’une méthode de compression. On part d’un fichier au format WAV
caractérisé par son bitrate (débit binaire). Ce son est un signal échantillonné. Par une
transformation de Fourier, on va analyser son spectre. On obtiendra ainsi des valeurs dans le
domaine fréquentiel.
L’objectif de cette compression est de revenir au domaine temporel à partir de ces valeurs
de fréquences, mais avec un bitrate plus petit. Cela revient à diminuer le nombre d’échantillon
dans le fichier WAV. Au lieu de supprimer directement des données, ce qui pourrait modifier
radicalement l’intégrité du son, on utilise toutes les données pour en calculer de nouvelles.
IV.1.B - La transformation par Fourier.
Grâce à la transformation de Fourier, on peut décomposer un signal : on considère que
tout signal est le composée d’une infinité de sinusoïde ayant chacune une amplitude, une
fréquence et un déphasage.
domaine temporelle
domaine fréquentielle
Avant d’opérer sur la transformation de Fourier, il faut voir ce qui se passe lors de
l’opération d’échantillonnage (lorsque l’on enregistre le son) : on prélève (périodiquement
– période ∆) des valeurs représentatives du signal analogique. x(t) signal
analogique : x n = x(n∆)
On peut représenter le principe de l’échantillonnage par un échantillonneur à impulsions :
x(t )
x * (t )
δ ∆ (t )
On obtient un signal échantillonné x*(t)
La transformée de Fourier du signal échantillonné : F(x*(t))
1 ∞
n
x * (t ) = x(t ).δ T (t ) ⇒ X * ( f ) = X ( f ) * ∑ δ ( f − )
∆ n = −∞
∆
Licence T&E3
- 20 -
Mai – Juin 2007
⇒ X *( f ) =
1 ∞
n
X(f − )
∑
∆ n = −∞
∆
On obtient : X * ( f ) = f e
∞
∑ X ( f − nf
n = −∞
e
) avec f e : fréquence d’échantillonnage
On observe sur cette dernière équation qu’il y a une périodicité dans le signal fréquentielle
(pour différentes valeurs de n).
Cette périodicité introduit une loi qu’il faut respecter lorsque l’on acquiert du son : la
fréquence d’échantillonnage doit être au moins égale au double de la fréquence du signal
analogique. Ce principe est connu sous le nom de théorème de Shannon.
Si l'on se situe sous cette limite théorique, il y a perte d'information dans le signal.
Ce graphique est obtenu en calculant les amplitudes de chaque fréquence d’un fichier
sonore. Ce fichier sonore à une fréquence d’échantillonnage de 11025 Hz. On retrouve ici
la périodicité du signal. On se rend ainsi compte que les fréquences qui nous intéressent
sont comprise entre 0 et 11025 / 2.
Dans les futurs calculs, nous pouvons donc ne manipuler que les fréquences comprises
entre 0 et la moitié de la fréquence d’échantillonnage.
Pour pouvoir calculer les valeurs du signal dans le domaine fréquentielle, il faut
trouver la formule qui passe des valeurs temporelles aux valeurs fréquentielles.
La formule de Fourier nous donne : X * ( f ) =
∞
∑x e
n = −∞
− j 2πfn∆
n
=
∞
∑x e
n = −∞
− j 2π
f
n
fe
n
2π
fréquence d ' échantillonnage
n = −∞
On applique cette formule dans le langage C sur un fichier échantillonné. La formule
∞
On simplifie la formule par :
∑x e ω
j fn
n
en prenant ω = −
Nb échantillon
devient :
∑x e ω
j fn
n=0
n
. On s’aperçoit ici que l’on obtiendra un complexe pour chaque
fréquence.
Licence T&E3
- 21 -
Mai – Juin 2007
On utilise deux boucles for : une pour toutes les fréquences à calculer et une autre à
l’intérieur de la précédente qui parcourra tous les échantillons du fichier afin de calculer le
réel et l’imaginaire de la fréquence.
On obtient ces lignes de codes :
double omega = -2 * M_PI / pforme.Freq;
for (n = FreqMin ; n <=FreqMax; n ++) // Calcul des fréquences souhaitées
{
Fou_re[n] = 0; //Initialisation des coefficients
Fou_im[n] = 0;
for (t = 0; t < pforme.NbEchant ; t ++) //Parcours de tous les échantillons du fichier
{
Fou_re[n] += pforme.canal[0][t] * cos(omega * t * n);
Fou_im[n] += pforme.canal[0][t] * sin(omega * t * n);
}
}
Si on souhaite avoir l’amplitude d’une fréquence, on utilise la formule suivante :
Fou_Ampli[n] = fou_cos[n] + i*fou_sin[n] Il s’agit de calculer le module d’un complexe :
on insere cette ligne à la fin de la première boucle for : Fou_Ampli[n] =
pow(pow(Fou_re[n] / pforme.Freq, 2) + pow(Fou_im[n] / pforme.Freq, 2),0.5 ;
C’est la formule que l’on utilise pour afficher graphiquement les amplitudes de chaque
fréquence.
IV.1.C – La transformation de Fourier inverse.
A ce stade, nous avons les réels et les imaginaires des fréquences comprises entre 0 et
la moitié de la fréquence d’échantillonnage. La transformée de Fourier directe et la
∞
f
n
fe
f
j 2π n
1
fe
transformée inverse sont : X ( f ) = ∑ x n e
et x n =
X
(
f
)
e
df
∫
fe
n = −∞
L’utilisateur nous fournis le nouveau débit qu’il souhaite pour son fichier.
Grâce au débit, on calcul le nouveau nombre d’octet par seconde : nouveau.BytePerSec=
Debit*1000/8
La taille du nouveau fichier est : taille de l’ancien fichier * nouveau BytePerSec / ancien
BytePerSec
Le nouveau nombre d’échantillon est : taille du nouveau fichier * 8 / Nb canaux / nombre
de bits par donnée.
La fréquence d’échantillonnage devient nouveau Nb d’échantillon * nouveau BytePerSec
/ taille du nouveau fichier
Ainsi, nous faisons les mêmes calculs qu’avec la transformation de Fourier, mais en
prenant un nouveau ω. En effet, nous souhaitons diminuer le nombre d’échantillon. La
durée du fichier sonore ne variant pas, cela revient à diminuer la fréquence
d’échantillonnage.
2π
Calcul de ω : ω =
nouveau fe
La transformée dans le langage C s’opère ainsi :
Licence T&E3
− j 2π
- 22 -
Mai – Juin 2007
omega = 2 * M_PI / compresse.Freq; //nouveau w
for(t = 0 ; t < compresse.NbEchant ; t ++) //Pour chaque t : pour chaque échantillon du
nouveau fichier
{
Signal_re[t] = 0; //Initialisation du réel
Signal_im[t] = 0; //Initialisation de l’imaginaire
for(n = 0 ; n < pforme.Freq / 2 ; n ++) //Représente la somme
{
Signal_re[t] += Fourier_re[n] * cos(omega * n * t); - Fourier_im[n] * sin(omega * n * t);
Signal_im[t] += Fourier_re[n] * sin(omega * n * t); + Fourier_re[n] * cos(omega * n * t);
}
compresse.canal[t] = sqrt(pow(Signal_re[t], 2) + pow(Signal_im[t], 2)) / pforme.Freq;
//Calcul de l'amplitude (module du signal complexe obtenue)
}
Il suffit d’intégrer ces nouvelles données dans un fichier au format WAV avec un
nouvel en-tête pour obtenir un fichier compressé par la méthode Fourier.
IV.1.D – The Fast Fourier Transformation (FFT).
Nous avons vu que la transformée de Fourier que l’on utilise précédemment passe par
l’emploie de deux boucles for. La complexité du calcul s’exprime donc en
.
L'amélioration de l'algorithme est permise grâce à la factorisation récursive de la
formule générale.
L'algorithme original de Cooley-Tukey était dit radix-2. Cela signifie que la
dimension était une puissance de 2, et la factorisation à l'échelle k fait appel à 2
transformées de Fourier à l'échelle k-1. D'autres algorithmes par la suite ont d'autres radix
pour des tailles qui ne sont pas des puissances de 2.
Voici comment on arrive à la décomposition récursive :
Une autre propriété est la suivante :
On effectue donc une FFT de taille inférieure sur les échantillons pairs et une autre sur
les impairs à un facteur d'échelle près. La formule du radix-2 met en évidence une cellule
Licence T&E3
- 23 -
Mai – Juin 2007
de base qu'on appelle butterfly (on calcule simultanément 2 coefficients de la FFT en
prenant en compte la différence de signe des termes de la formule). On voit dans l'image
suivante l'utilisation de ce butterfly pour résoudre ce problème.
On peut réaliser la FFT entre 2 espaces mémoires distincts ou en place, en écrasant le
signal précédent. Dans ce cas, le résultat ne sera pas dans l'ordre et pour le retrouver, il
faut permuter les bits des indices du tableau, comme indiqué dans le schéma précédent. Si
un indice a la forme b3b2b1b0, l'indice dans la FFT correspondant est b0b1b2b3. C'est ce
qu'on appelle le bit-reversal.
Pour la transformée inverse, on procède de la même manière avec l'exponentielle
inverse. Dans les formules présentées, le facteur général de la FFT inverse n'est pas
présenté. Il est possible de l'appliquer à la transformée directe, ou même en partie à la
transformée directe et en partie à la transformée indirecte. Cela peut être judicieux - et
indispensable en fait - dans le cas d'une FFT d'entiers.
Le principal problème rencontré avec l’utilisation de la FFT es le fait qu’il ne
manipule que des données de l’ordre de 2 n . Un subterfuge consiste à rajouter à la fin du
fichier sonore des données inutiles : des échantillons qui représente une amplitude de 0V
sur l’ampli. On supprime ensuite ces données une fois la FFT inverse effectuée.
Le fait d’être forcé d’utiliser des nombres d’échantillons de la forme 2 n nous contraint
à utiliser pour le fichier compressé un débit que l’utilisateur ne peut choisir avec
précision.
IV.1.E - Remarques.
Les amplitudes des fréquences.
L’utilisation de la Transformée rapide de Fourier ne permet pas d’obtenir un rendu
graphique des amplitudes des fréquences d’un fichier WAV. Pour avoir un rendu exact, il
faut utiliser la transformée de Fourier « traditionnelle » qui est malheureusement plus
longue.
L’intensité sonore du fichier produit.
On remarque que le fichier WAV produit peut avoir une intensité sonore inférieur au
fichier original. On résout ce problème en prélevant la valeur maximale des échantillons
du fichier original et produit, puis on applique à ce nouveau fichier un accroissement
proportionnel de toutes ses valeurs.
Licence T&E3
- 24 -
Mai – Juin 2007
IV.2 - La compression par la méthode d’Huffman.
La méthode de compression Huffman consiste à diminuer au maximum le nombre de bits
utilisés pour coder un fragment d'information. Prenons l'exemple d'un fichier de texte : le
fragment d'information sera un caractère ou une suite de caractères. Plus le fragment sera
grand, plus les possibilités seront grandes et donc la mise en œuvre complexe à exécuter.
L'algorithme de Huffman se base sur la fréquence d'apparition d'un fragment pour le coder :
plus un fragment est fréquent, moins on utilisera de bits pour le coder. Dans notre exemple de
fichier texte, si on considère que notre fragment est la taille d'un caractère, on peut remarquer
que certaines voyelles sont beaucoup plus fréquentes que certaines consonnes : par exemple la
lettre ‘e' est largement plus fréquente que la lettre ‘x' par conséquent la lettre ‘e' sera peut-être
codée sur 2 bits alors que la lettre ‘x' en prendra 10.
Pour pouvoir compresser puis décompresser l'information, on va donc devoir utiliser une
table de fréquences. Deux choix s'offrent à nous : calculer une table et l'intégrer au fichier ou
utiliser une table générique intégrée dans la fonction de compression. Dans le premier cas, la
compression est meilleure puisqu'elle est adaptée au fichier à compresser, mais elle nécessite
le calcul d'une table de fréquences et le fichier sera plus important également du fait de la
présence de cette table dans le fichier. Dans le second cas, la compression sera plus rapide
puisque elle n'aura pas à calculer les fréquences, par contre l'efficacité de la compression sera
moindre et le gain obtenu par la première méthode (ratio de compression + taille de la table)
peut être supérieur à celui de la deuxième (ratio de compression).
IV.2.B - La table des fréquences d'apparition des fragments.
Cette table consiste en un comptage empirique des fragments au sein des données à
compresser. Prenons l'exemple d'un texte : nous allons analyser la phrase :
« gRRosminet et GoldenEye programment Huffman »
Pour simplifier l'exemple, nous ignorerons la casse :
Lettres
G
O
S
M
I
N
E
T
L
D
Y
P
A
H
Licence T&E3
Occurrences
3
3
1
4
1
4
6
3
1
1
1
1
2
1
- 25 -
Fréquence
4,14%
7,14%
2,38%
9,52%
2,38%
9,52%
14,29%
7,14%
2,38%
2,38%
2,38%
2,38%
4,76%
2,38%
Mai – Juin 2007
U
F
[ESPACE]
Total
1
2
4
42
2,38%
4,76%
9,52%
100%
IV.2.C - Création de l'arbre de Huffman.
L'arbre de Huffman est la structure données qui va nous permettre de donner un code pour
chaque lettre en fonction de sa fréquence.
Etape 1
Il faut commencer par trier la liste par ordre croissant de fréquences. On observe que le tri
a été fait sur la fréquence puis sur la lettre ce qui sera important pour permettre la
diminution de la taille de l'entête :
Lettres
D
H
I
L
P
S
U
Y
A
F
G
O
R
T
[ESPACE]
M
N
E
Occurrences
1
1
1
1
1
1
1
1
2
2
3
3
3
3
4
4
4
6
Fréquence
2,38%
2,38%
2,38%
2,38%
2,38%
2,38%
2,38%
2,38%
4,76%
4,76%
7,14%
7,14%
7,14%
7,14%
9,52%
9,52%
9,52%
14,29%
Nous allons maintenant construire un nœud de l'arbre pour chaque fragment et les placer
dans une liste ordonnée de noeuds. Un nœud doit avoir une structure qui suit le schéma
suivant :
Licence T&E3
- 26 -
Mai – Juin 2007
Etape 2
Nous construisons l'arbre à partir de la liste ordonnée de nœuds. Il faut prendre les deux
nœuds les moins fréquents (D et H) et de les ajouter comme fils d'un nouveau nœud qui
aura pour fréquence la somme des deux.
Il suffit de réitérer cette étape jusqu'à ne plus avoir qu'un seul nœud. Après cela, descendre
vers la gauche équivaut à un 0, et descendre vers la droite à un 1.
On en déduit le codage suivant :
Lettres
D
H
I
L
P
S
U
Licence T&E3
Occurrences
1
1
1
1
1
1
1
- 27 -
Fréquence
6
6
6
6
6
6
6
Codage
111000
111001
111010
111011
111100
111101
111110
Mai – Juin 2007
Y
A
F
G
O
R
T
[ESPACE]
M
N
E
Total de
bits
(normal |
compressé
)
1
2
2
3
3
3
3
4
4
4
6
6
4
4
4
4
4
4
3
3
3
3
336
166
111111
0000
0001
1000
1001
1010
1011
001
010
011
110
La dernière ligne du tableau nous montre qu'une fois compressée, la phrase n'occupe
même plus la moitié de l'espace original (hors entête).
IV.2.D - Compression / Décompression.
Compression
Pour la compression des données, on va donc devoir écrire un nouveau fichier contenant
deux parties : l'entête et les données compressées. L'entête : il doit contenir le nom
original du fichier, la taille originale et une table de correspondance qui permette de
reconstituer le fichier original.
Pour compresser les données, on va donc lire le fichier original fragment par fragment (ici
octet par octet) et on écrira le code Huffman correspondant dans le fichier de destination.
Les codes de Huffman ne font pas toujours un multiple de 8 bits et par conséquent ils
nécessitent d'être mis dans une zone tampon avant d'être écris dans le fichier.
Décompression
Pour la décompression, on lira l'entête du fichier, puis, pour chaque bit lu, on descendra
dans l’arbre et à chaque feuille terminale, on décodera un caractère original que l’on écrira
dans le fichier de restitution.
IV.2.E - Remarques.
taill _ compressé
taille _ normale
166
Dans notre exemple, nous avons : ρ = 1 −
= 50,6%
336
En règle générale, un fichier texte est compressé par cette méthode suivant un ratio de 30
à 60%.
On définit le ratio de compression : ρ = 1 −
Licence T&E3
- 28 -
Mai – Juin 2007
Sur de très petits fichiers ( moins de 1 Ko), l'en-tête est assez volumineux par rapport aux
informations compressées. Le fichier réduit a alors une taille supérieure au fichier
original…
Sur de gros fichiers, on peut appliquer l'algorithme de Huffman non pas caractère par
caractère mais par tranche de 2, 3 ou 4 caractères. Le problème est que la construction de
l'arbre prend beaucoup plus de temps (l'arbre est plus gros,il y 65536 doublets possibles de
caractères ASCII étendu par exemple). De même, l'en-tête prend une place considérable.
Licence T&E3
- 29 -
Mai – Juin 2007
Chapitre V :
Notre application
Licence T&E3
- 30 -
Mai – Juin 2007
V.1 - L’organisation des tâches.
Les réunions préliminaires avec notre chef de projet M .Rousseau avaient clairement
délimité trois aspects principaux de notre future application, sans perdre de vue l’objectif
principal : la conversion de formats audio en C sous Linux.
Ces trois aspects étaient :
_la recherche sur le codage informatique du son.
_la création d’une bibliothèque de fonctions.
_l’interface graphique.
Nous devions également penser à la compatibilité de notre application avec celle conçue
par un autre groupe (Romain, Benjamin et Maxime) mais il nous a paru plus judicieux
d’avancer chacun de notre côté, au moins au début.
Notre groupe étant composé de trois personnes, nous avons convenu dès le début que nous
pouvions étudier chacun un des aspects pré-cités. Nous discutions cependant beaucoup et
chaque nouvelle idée était exposée avant d’être appliquée. De même, chaque fonction de la
bibliothèque était intégrée à l’application graphique dès lors qu’elle était terminée.
M.Rousseau nous avait également demandé un rapport hebdomadaire de nos travaux, ce
qui nous permettait de prendre du recul par rapport à l’application et donc de mieux identifier
les points importants. Cela nous permettait aussi de déceler, le cas échéant, les éléments qui
s’éloignaient trop de notre projet initial.
V.2 - Les fonctionnalités du logiciel.
Nous avions pour objectif de proposer le plus de formats audio possibles. Il nous fallait
donc connaître les algorithmes de compression des formats que nous souhaitions convertir.
Cependant, comme il a été expliqué précédemment, beaucoup de ces algorithmes ne sont pas
accessibles, nous avons donc dû nous rabattre sur de petites applications disponibles dans les
paquets Linux et permettant ces conversions. Cela nous a épargné beaucoup de travail puisque
nous n’avions plus à compresser et décompresser les fichiers mais, d’un autre côté, cela a
rendu l’application plus difficile à exporter.
En effet, pour pouvoir être utilisées, ces applications doivent être préalablement installées
sur le système, ce qui est une contrainte pour l’utilisateur.
Nous n’avions néanmoins pas le choix et nous avons donc installé ces paquets. Un point
important a découlé de cette contrainte : puisque nous ne pouvions intervenir directement sur
les différents formats, nous étions obligés de convertir au préalable le fichier choisi par
l’utilisateur au format wave. Ce format s’est donc retrouvé au centre de notre application,
même si cela est transparent pour l’utilisateur (il ne sait pas, en convertissant un fichier mp3
en ogg par exemple, que l’on est passé par un fichier wave).
A l’heure actuelle, notre application permet d’ouvrir des fichiers wave, mp2, mp3, midi,
flac, ogg, wma et de créer des fichiers wave, mp2, mp3, midi, flac, ogg.
Comme nous l’avons expliqué précédemment, le format wave est très simple à manipuler.
Nous avons donc ajouté d’autres fonctionnalités qui nous paraissait, sinon utiles, du moins
amusantes :
_découpage d’un fichier son : l’utilisateur ouvre un fichier son et choisit ensuite les deux
bornes délimitant le découpage qu’il souhaite effectuer (en milli-secondes) (par exemple, en
Licence T&E3
- 31 -
Mai – Juin 2007
choisissant les intervalles 1000 et 2500, il va découper 2,5 secondes dans le fichier original).
Il peut ensuite nommer le fichier créé et l’enregistrer.
_modification de la vitesse de lecture : l’utilisateur choisit un facteur de modification,
supérieur à 0 et inférieur 2 (le facteur 1 restituant le fichier non modifié). De même , il peut
renommer son fichier et l’enregistrer.
_concaténation de fichier : l’utilisateur peut « coller » deux fichiers l’un à l’autre à la
condition qu’ils aient le même nombre de canaux et la même fréquence d’échantillonnage.
_lecture d’un fichier son : l’utilisateur peut écouter un fichier son en voyant se dérouler en
temps réel un graphique représentant les amplitudes de son fichier audio.
_compression et décompression Huffman
_compression et décompression Fourier
L’utilisateur peut compresser un fichier audio, celui-ci sera enregistré avec une extension
particulière et ne peut être décompressé que par la fonction inverse.
_modification du nombre de canaux d’un fichier audio: cette opération peut entraîner une
perte de données (et non l’inverse !) et peut donc paraître inutile. Cependant, dans le cas où
l’utilisateur souhaite concaténer deux fichiers n’ayant pas le même nombre de canaux, elle
permet d’uniformiser les deux fichiers.
V.3 - Problèmes rencontrés et solutions apportées
V.3.A - L’installation de Linux.
Au tout début du projet, nous ne parvenions pas à installer Linux (pas plus que le
groupe de Messieurs Duthil, Danieau et Lasterra). Nous avons fini par demander de l’aide
à M.Rousseau, qui a réalisé que le CD était défectueux. Il nous a donc fourni un autre CD,
valide cette fois. Il nous a également fourni un descriptif précis de l’installation qui nous a
été bien utile : en effet, nous devions installer Linux en mode expert pour partitionner les
disques, ce qu’aucun de nous n’avait fait auparavant.
V.3.B - Recherche d’un environnement de développement.
Nous devions trouver un environnement de développement offrant la possibilité
d’utiliser la bibliothèque wxWidget, bibliothèque d’objets graphiques. Après quelques
recherches sur Internet, et plusieurs tentatives ratées, nous avons trouvé un manuel
d’installation pour l’utilisation de cette bibliothèque sous Eclipse. Ce manuel était très
complet et détaillé et nous a donc permis d’installer notre environnement de
développement.
V.3.C - Codage des différents formats.
Comme nous l’avons expliqué précédemment, beaucoup de formats audio sont
protégés : nous ne pouvions donc pas créer les fichiers correspondant comme nous le
faisions avec les fichiers wave (écriture octet par octet des informations dans un fichier).
Nous avons dû utiliser des logiciels de conversion déjà existants (ffmpeg, timidity,
lame…). Cela nous a paru une contrainte, particulièrement pour l’utilisateur, mais avec le
recul, nous avons réalisé que la connaissance et la maîtrise de tous les formats audio
présentés nous aurait demandé beaucoup trop de temps.
Licence T&E3
- 32 -
Mai – Juin 2007
V.3.D - Transfert de Windows à Linux.
L’installation de Linux a présenté des difficultés : nous avons donc choisi de
commencer à travailler sous Windows pour ne pas perdre de temps. Cependant, après
l’installation réussie de Linux, nous avons trop tardé à transférer notre travail (la
bibliothèque de fonctions et l’application graphique) sur ce système d’exploitation et ce,
malgré les conseils de M.Rousseau qui nous avait prévenus que cela pouvait présenter des
difficultés. Nous pensions en effet que ce ne serait qu’une formalité et qu’il n’y aurait que
quelques modifications à apporter dans le code. C’était une grosse erreur et nous avons
perdu beaucoup de temps à adapter notre code à l’environnement Linux. L’application
graphique en particulier a été difficile à adapter, la bibliothèque de fonctions n’ayant
nécessité que peu de modifications.
V.3.E - Utilisation des threads.
Après un mois de développement, nous avons voulu améliorer l’application graphique
et, notamment, créer une fonction de lecture du son : celle-ci devait proposer l’affichage
en temps réel d’un graphique représentant les amplitudes du son. Nous avons créé cette
fonction mais nous avons réalisé que durant la durée de la lecture, toutes les autres
fonctionnalités de l’application étaient inaccessibles. Nous avons donc cherché un moyen
de corriger cela et c’est finalement le groupe de Messieurs Danieau, Duthil et Lasterra qui
nous a donné la solution : les threads. Ils en utilisaient déjà pour leur application et ont
donc pu nous expliquer leur principe. Cela paraissait la solution idéale (et c’était
assurément la solution) mais nous ne connaissions pas du tout ces objets, ni les problèmes
qu’ils pouvaient générer. Nous avons également oublié de prendre en compte le fait que le
temps initialement imparti pour le projet était terminé, et que nous ne disposions, au
mieux, que d’une ou deux semaines supplémentaires pour finaliser l’application. Quoi
qu’il en soit, nous avons ajouté les threads et l’application est devenue très instable : elle
se bloquait parfois, ou se fermait tout simplement sans prévenir. M.Rousseau nous a
expliqué que c’était sans doute dû à des conflits d’interrogations de variable : si le thread
principal (l’application) et le thread créé par l’application interrogent une même variable
au même moment, l’application « plante ». M.Rousseau nous a parlé des mutex, objet
servant à protéger une variable mais nous n’avons pas eu le temps de corriger ces défauts.
L’application finale est donc très instable.
V.3.F - Compatibilité des deux projets.
Notre application était axée sur la conversion de fichiers audio, mais nous devions
également envisager la lecture et l’acquisition de son via la bibliothèque développée par
Messieurs Danieau, Duthil et Lasterra. Nous discutions beaucoup de nos avancées et de
nos idées et nous pensions, comme eux, avancer vers le même but. Cependant, il était
difficile de confronter réellement nos applications avant un stade avancé de
développement. Quand cela a été finalement possible, nous avons réalisé que qu’elles
n’étaient pas compatibles. Malgré une bonne compréhension des projets, nous n’avons pu
déterminer la cause de cette incompatibilité : les fichiers wave créés étaient parfois lus
normalement par leurs fonctions, mais, approximativement deux fois sur trois, on
n’entendait qu’un son informe, semblable à des parasites radio. Nous avons longuement
cherché la cause de ces différences mais sans succès. M.Rousseau lui-même n’a pu
identifier le problème et nous avons dû nous résoudre à abandonner la compatibilité de
nos projets.
Licence T&E3
- 33 -
Mai – Juin 2007
Conclusion
La réalisation de ce projet a eu plusieurs points positifs.
Tout d’abord, il nous a permis d’élargir nos connaissances sur le son. Nous connaissons tous
le principe de la membrane d’un haut-parleur qui vibre pour produire du son. Il a été
intéressant de comparer ces connaissances avec les méthodes utilisées pour coder le son en
informatique. Des notions de fréquence d’échantillonnage, de compression avec ou sans perte
de données nous étaient alors inconnues. Nous avons également découvert qu’il existait une
grande variété de formats audio, et leurs avantages respectifs.
Ce projet a également été une occasion de nous préparer à la première année de Master
puisque nous avons utilisé un langage orienté objet. De plus, nous avons pu découvrir
l’environnement de Linux, que nous ne connaissions pas et qui sera lui aussi étudié.
Enfin, la conduite de ce projet nous a fait prendre conscience de l’importance de la
communication au sein du groupe, ainsi qu’avec les étudiants travaillant sur le deuxième
projet. Nos discussions nous ont permis de confronter nos idées et elles ont souvent été d’une
grande aide : en nous obligeant à expliquer un problème à une autre personne, elles nous
permettaient de prendre du recul par rapport à ce problème.
Bien entendu, les discussions avec M.Rousseau ont également été très bénéfiques.
Les problèmes d’instabilité de l’application, dues à l’utilisation des threads, sont regrettables.
Nous avons commis une erreur en intégrant une notion qui nous était totalement inconnue
alors que le temps imparti pour le projet touchait à son terme. Cependant, ce n’est qu’un
problème d’affichage ; nous aurions sans doute pu le corriger avec un peu plus de temps.
Le principal point négatif reste l’incompatibilité de notre application avec celle de Messieurs
Danieau, Duthil et Lasterra. Ce point faisait partie des éléments importants du projet et il est
frustrant de n’avoir même pas pu identifier la cause du problème.
Nous pouvons tout de même dire que l’objectif principal du projet est atteint : notre
application permet de convertir un grand nombre de formats audio. De plus, elle propose
quelques fonctionnalités originales. Finalement, la réalisation de ce projet a été agréable en
plus d’être bénéfique et l’application pourrait même être reprise et améliorée.
Licence T&E3
- 34 -
Mai – Juin 2007
Les formats audio sous linux
Projet réalisé par :
GILBERT Louis-Marie
LETOURNEAU Christophe
LE TEXIER Nicolas
Projet encadré par :
ROUSSEAU Julien
Résumé : Ce projet s’intéresse à la conversion des fichiers audio sous linux. Ce
dossier présente les bases nécessaires pour comprendre le concept de son en
informatique, la notion de compression et l’idée de format, utilisés pour le projet.
Utilisant le format WAV comme pivot, de multiples fonctionnalités ont pu être
programmées. Ce rapport présente les moyens de conversions du son : de façon
courante, via les bibliothèques et les commandes de linux ou de façon ‘manuelle’ via
la compression de Fourier et de Huffman. Ces travaux ont été rendus accessible à
travers une application graphique construite à l’aide de l’environnement Widget.
Mots-clés : formats audio ; son ; linux ; WAV ; compression ; conversion ; Fourier ;
Huffman ; Widget ; Thread
Summary : This project points out the conversion of the audio files under linux. This
file introduces the necessary foundations to understand the concept of sound in
computing, the notion of compression and the idea of format used for our project.
Using format WAV as a spindle, numerous functionalities could have been
programmed. This report introduces the means of conversions of sound: in a common
manner, via libraries and the orders of linux or in a 'manual' manner via the
compression of Fourier and Huffman. These jobs were made approachable across a
graphic application made with the aid of environment Widget.
Keywords : audio format ; sound ; linux ; WAV ; compression ; conversion ; Fourier ;
Huffman ; Widget ; Thread
Licence T&E3
- 35 -
Mai – Juin 2007

Documents pareils