Le codec audio (méthode de compression et décompression audio) proposé est optimisé pour la voix.
Il est basé sur FFT (Transformation de Fourier Rapide, Fast Fourier Transform en Anglais) et les pics locaux.
Il décompose les trames audio en deux plans composés d'un avant-plan (les plus grands points ou les points de plus grande magnitude) et d'un arrière plan (les bandes les plus énergétiques).
Dans la version la plus simple et la plus rapide, il faut:
- Choisir une fréquence d'échantillonnage (par exemple 8 ou 16 kHz).
- Choisir une taille de tampon FFT (par exemple 256 ou 512).
- Choisir un nombre N pour les plus grands pics locaux (par exemple 16).
Voir remarques plus bas.
- Effectuer une transformation FFT sur les tampons.
- Coder les N magnitudes (par exemple à l'aide du logarithme).
- Envoyer les N positions ou positions relatives et les N magnitudes codées.
Les positions représentent les fréquences et doivent être exactes.
- Pour la décompression, pour chaque point non nul, faire amplitude des cosinus = 0 et amplitude des sinus = valeur de la magnitude décodée.
- Pour la décompression, effectuer l'inverse FFT (iFFT).
Il n'y a pas à tenir compte des phases ni de signe pour les magnitudes.
Il n'y a pas de recouvrement de trames.
Cependant, pour plus de qualité et afin d'éliminer tous les bruits (causés par les effets de bord), il faut tenir compte des phases pour les premiers ou les plus grands pics locaux, et implémenter un recouvrement de trames de 50% ou moins.
L'algorithme est très efficace contre les très petits bruits de fond puisqu'il les ignore.
Remarques:
- Dans le domaine des fréquences, un pic local est un point dont la magnitude est plus grande que celle des points situés immédiatement à gauche et à droite.
- La qualité du codec dépend du nombre de pics locaux et de la qualité de leur codage. On obtient une bonne qualité avec N compris entre 8 et 32 et avec le codage logarithmique.
- Pour accélérer les calculs, il n'est pas nécessaire de trier tous les points.
Il faut choisir un algorithme rapide permettant de s'arrêter dès qu'on a N points.
- Ce cas correspond à une absence d'arrière plan ou à un arrière plan composé de bandes à deux points uniquement. Avec les pics locaux, une bande de deux points n'a qu'un seul point utile, donc on peut ne prendre que l'avant plan.
Cette méthode sera utilisée pour VLC (Very Low Consumption).
Pour VLR (Very Low Radiation), nous ajouterons l'algorithme décrit plus bas.
Il faut noter que dans les communications vocales, il y a plus de 50% de silence et énormément de répétitions successives et non successives (en reconnaissance vocale, un travail préliminaire important consiste à enlever les répétitions dans les phrases prononcées, à l’aide par exemple de modèles de phonèmes).
En se limitant aux répétitions successives et en n'émettant que les trames successives non identiques, on peut réduire de manière considérable les émissions de trames audio donc les émissions électro-magnétiques pour les téléphones portables.
- Il faut choisir un nombre C de crédit de répétitions (par exemple 31).
Le récepteur a le droit de répéter C fois la trame tant qu'il ne reçoit pas une autre trame contenant le reste du crédit de répétitions à annuler.
- Si le crédit de répétitions est épuisé, l'émetteur envoie la trame courante avec un reste de crédit à annuler de zéro.
- Si le crédit n'est pas épuisé, l'émetteur compare la trame courante avec la trame précédente (chaque trame contient N magnitudes à N positions).
- Si les deux trames sont identiques ou presque identiques (un indice de similarité est à définir du côté de l'émetteur), l'émetteur n'envoie rien.
- Si les deux trames sont différentes, l'émetteur envoie la trame courante avec un nombre indiquant le reste du crédit à annuler.
- Les magnitudes et les positions relatives sont très redondantes, surtout à une fréquence d'échantillonnage de 8 kHz, avec une petite précision pour les magnitudes. Pour les communications, nous allons ajouter une compressions sans perte trame par trame. Pour les fichiers et les média sûrs, il sera possible d'ajouter la compression sans perte LZW. Pour les média sûrs, il faudra considérer un groupe de trames pour la construction du dictionnaire, avec un vidage complet des données compressées entre les trames.
Remarques:
- S'il y a 31 trames par seconde en mode normal, un crédit de répétitions de 31 représente une seconde et un crédit de répétitions de 62 représente deux secondes. On peut facilement atteindre des débits très bas avec ces valeurs.
- Cet algorithme est surtout utile pour les petits tampons, les silences et les parties stationnaires.
- En supposant qu'il y a 31 trames par seconde et si on suppose une crédit de répétitions de 127 ou 255 (7 ou 8 bits):
- dans les zones de silence, on émet un octet toutes les 4 ou 8 secondes;
- dans les zones stationnaires, on émet une trame toutes les 4 ou 8 secondes.
Remarques finales:
- La méthode dite VLC est brevetée en France et est à l'étude aux USA (USPTO).
- La méthode dite VLR est à l'étude en France (INPI).
- Une implémentation propriétaire et non optimisée de la méthode dite VLC se trouve dans le programme WhMic (programme tournant sur Windows,
WhMic), sous le nom de WHM Voice. Il faut installer le programme en version de démonstration (sans l'option Server Web), choisir le codec WHM Voice pour communiquer, et éventuellement changer la fréquence d'échantillonnage par défaut (qui est de 22 kHz).
- Une implémentation portable se trouve dans la librairie PJSIP à l'adresse suivante:
vlrPhone - PJSIP
Nos codecs sont basés sur FFT et peuvent être accélérés avec le support GPU
comme cette animation WebGL.
three.js