Le but de la séance est de supprimer le bruit d’un signal sonore non compressé (.wav
).
Les fichiers wav
, dans leur généralités, sont un format étrange changeant du
tout au tout en fonction des versions et du contenu (pas forcement audio). Pour
simplifier nous ne regarderons que les fichiers wav
audio non compressés.
Les fichiers wav
audios sont toujours composé d’un en-tête principal, les
441 premiers octets du fichier. Parmi les informations contenues dans
l’en-tête on retrouve :
RIFF
WAVE
(pour les fichiers audio)Dans le cas des fichiers audio on retrouve entre autre :
fmt
Vous retrouverez une plus ample description ici.
Pour ce TP nous avons simplifié au maximum les choses en prenant : PCM (Pulse Code Modulation, comme pour les CD), 11025 Hz, mono, 8bits.
Sans rentrer dans les détails, il est possible de visualiser la “courbe” assez simplement. Pour cela on peut utiliser le programme/langage GnuPlot qui sert, comme son nom l’indique, à faire des graphiques.
Lancer gnuplot :
gnuplot
Afficher la courbe :
plot 'signal_bruite.wav' using :1 binary format='%char' skip=44 with lines
Comme on y voit rien, se limiter à afficher les 100 premiers points
set xrange [0:100]
# Puis on retape la ligne précendente (i.e., on appuye sur fleche haut)
plot <nom de ficher>
using :1
binary
format='%char'
C
skip=44
with lines
Pour ce TP, on s’aidera de ce squelette de programme. Il se peut que les deux premiers points du tp soient traités par le squelette, vérifiez à quel point.
./mon_programme < fichier_entre > fichier_sortie
Comme nous utilisons pour ce TP la sortie standard, il va s’en dire que faire un
printf
n’est pas une bonne idée. Pourquoi ? Comment faire autrement ?
int n=20; char tab[n];
),
la taille des tableaux déclaré de cette manière doit être très petite3.
Il est difficile (voire impossible) de garantir cette propriété avec des fichier externes.
Nous allouerons donc, via malloc
, l’espace mémoire nécessaire.
Comment déterminer l’espace mémoire nécessaire ?
Proposez au moins 2 solutions (n’écrivez pas le code correspondant, ayez juste les solutions en tête).wavefile_length
qui étant donné un en-tête (char *
), extrait la taille du fichier dans l’en-tête.
Note: Vous pourrez utiliser la fonction suivante extract_le2n()
.double
s, même si les données originales sont 8 bits.
Peut on lire directement dans un tableau de double ? Pourquoi ?
Lire les données grâce à fgetc
!diff -s fichier1 fichier2
En route vers le traitement du signal proprement dit.
mean3
qui, en fonction du signal d’entrée, calculera pour chaque point la moyenne de lui et de ces deux voisins. Remarque: Pour les extrémités on recopiera les valeurs tels quelles.filter_signal
calculant le signal de sortie en appliquant un filtre au signal d’entrée.filter_signal
. Pourquoi les deux courbes (fonction mean3
originale vs la version générique) différent.gaussienne
vous est donnée, appliquez votre filtre (en prenant \(\sigma = 3\)).En fait l’en-tête audio fait 36 octets + l’en-tête du bloc de données (8) = 44. ↩
Les numéros magiques, ou plus simplement magic, sont des données servant principalement à identifier les fichiers — accessoirement elles servent aussi des fois à détecter l’endianess. Elles sont généralement placé en début de fichier. Parmi les magics bien connus, on retrouve le MZ
des fichier .exe
sous windows, le cafe babe
(en hexa) des fichiers java
, etc. Liste des signatures les plus fréquentes. L’utilitaire file
possède une BD de magics, ce qui lui permet de déterminer le type probable d’un fichier. ↩
Allocation sur la pile (taille réduite 1Mo ou 2 Mo tout au plus pour tout le programme). ↩