Formats de données

Android utilise une grande variété de formats de données audio en interne et en expose un sous-ensemble dans les API publiques, les formats de fichiers et la couche d'abstraction matérielle (HAL).

Propriétés

Les formats de données audio sont classés en fonction de leurs propriétés:

Compression
Non compressé, compressé sans perte ou compressé avec perte. Le PCM est le format audio non compressé le plus courant. FLAC est un format compressé sans perte, tandis que MP3 et AAC sont des formats compressés avec perte.
Profondeur de bits
Nombre de bits significatifs par échantillon audio.
Taille du conteneur
Nombre de bits utilisés pour stocker ou transmettre un échantillon. En règle générale, il s'agit de la même valeur que la profondeur de bits, mais il arrive parfois que des bits de marge supplémentaires soient alloués pour l'alignement. Par exemple, un échantillon de 24 bits peut être contenu dans un mot de 32 bits.
Alignement
Si la taille du conteneur est exactement égale à la profondeur de bits, la représentation est appelée compressée. Sinon, la représentation est décompressée. Les bits significatifs de l'échantillon sont généralement alignés sur le bit le plus à gauche (le plus significatif) ou le plus à droite (le moins significatif) du conteneur. Il est courant d'utiliser les termes compressé et décompressé uniquement lorsque la profondeur de bits n'est pas une puissance de deux.
Signé
Indique si les échantillons sont signés ou non.
Representation
Nombre à virgule fixe ou à virgule flottante (voir ci-dessous).

Représentation à virgule fixe

Le point fixe est la représentation la plus courante des données audio PCM non compressées, en particulier au niveau des interfaces matérielles.

Un nombre à virgule fixe comporte un nombre fixe (constant) de chiffres avant et après le point de base. Toutes nos représentations utilisent la base 2. Nous remplaçons donc le chiffre par le bit, et le point décimal ou simplement le point par le point de base. Les bits à gauche du point correspondent à la partie entière, et les bits à droite du point correspondent à la partie fractionnaire.

On parle de PCM entier, car les valeurs à virgule flottante sont généralement stockées et manipulées sous forme de valeurs entières. L'interprétation en virgule flottante est implicite.

Nous utilisons le complément à deux pour toutes les représentations à virgule flottante signées. Par conséquent, la formule suivante s'applique, où toutes les valeurs sont exprimées en unités d'un LSB:

|largest negative value| = |largest positive value| + 1

Notation Q et U

Il existe différentes notations pour la représentation à virgule flottante dans un entier. Nous utilisons la notation Q : Qm.n signifie m bits entiers et n bits fractionnaires. "Q" compte pour un bit, bien que la valeur soit exprimée en complément à deux. Le nombre total de bits est m + n + 1.

Um.n est utilisé pour les nombres non signés : m bits entiers et n bits fractionnaires, et le "U" compte comme zéro bit. Le nombre total de bits est m + n.

La partie entière peut être utilisée dans le résultat final ou être temporaire. Dans ce dernier cas, les bits qui constituent la partie entière sont appelés bits de protection. Les bits de protection permettent à un calcul intermédiaire de déborder, à condition que la valeur finale soit dans la plage ou puisse être limitée pour être dans la plage. Notez que les bits de protection à virgule fixe se trouvent à gauche, tandis que les chiffres de protection de l'unité à virgule flottante sont utilisés pour réduire l'erreur d'arrondi et se trouvent à droite.

Représentation à virgule flottante

Le point flottant est une alternative au point fixe, dans lequel l'emplacement du point peut varier. Les principaux avantages des nombres à virgule flottante sont les suivants:

  • Plage dynamique et marge plus élevées : l'arithmétique à virgule flottante tolère le dépassement des plages nominales lors du calcul intermédiaire et ne limite les valeurs qu'à la fin
  • Prise en charge des valeurs spéciales telles que les infinis et les NaN
  • Plus facile à utiliser dans de nombreux cas

Historiquement, l'arithmétique à virgule flottante était plus lente que l'arithmétique à virgule fixe ou à virgule flottante, mais il est désormais courant que l'arithmétique à virgule flottante soit plus rapide, à condition que les décisions de flux de contrôle ne soient pas basées sur la valeur d'un calcul.

Formats Android pour l'audio

Les principaux formats audio Android sont répertoriés dans le tableau ci-dessous:

Notation
Propriété Q0.15 Q0.7 1 Q0.23 Q0.31 float
Bits Container
16 8 24 ou 32 2 32 32
Bits significatifs
y compris le signe
16 8 24 24 ou 32 2 25 3
Marge
en dB
0 0 0 0 126 4
Plage dynamique
en dB
90 42 138 Entre 138 et 186 900 5

Tous les formats à virgule fixe ci-dessus ont une plage nominale comprise entre -1,0 et +1,0 moins un bit de signe. Il y a une valeur négative de plus que de valeur positive en raison de la représentation en complément à deux.

Notes de bas de page:

  1. Tous les formats ci-dessus expriment des valeurs d'échantillon signées. Le format 8 bits est communément appelé "non signé", mais il s'agit en fait d'une valeur signée avec un biais de 0.10000000.
  2. Q0.23 peut être empaqueté en 24 bits (trois octets de 8 bits, little-endian) ou décompressé en 32 bits. Si le dépaquetage est effectué, les bits significatifs sont alignés à droite vers le bit de poids faible avec un remplissage d'extension de signe vers le bit de poids fort (Q8.23), ou alignés à gauche vers le bit de poids fort avec un remplissage à zéro vers le bit de poids faible (Q0.31). Q0.31 permet théoriquement jusqu'à 32 bits significatifs, mais les interfaces matérielles qui acceptent Q0.31 utilisent rarement tous les bits.
  3. Le format à virgule flottante à précision simple comporte 23 bits explicites, plus un bit masqué et un bit de signe, ce qui représente 25 bits significatifs au total. Les nombres non normaux ont moins de bits significatifs.
  4. Les nombres à virgule flottante à simple précision peuvent exprimer des valeurs allant jusqu'à ±1,7 e+38, ce qui explique la grande plage de valeurs.
  5. La plage dynamique affichée est destinée aux valeurs non normales jusqu'à la valeur maximale nominale ±1,0. Notez que certaines implémentations à virgule flottante spécifiques à l'architecture, telles que NEON, ne sont pas compatibles avec les valeurs dénormalisées.

Conversions

Cette section traite des conversions de données entre différentes représentations.

Conversions à virgule flottante

Pour convertir une valeur au format Qm.n en nombre à virgule flottante:

  1. Convertissez la valeur en valeur à virgule flottante comme s'il s'agissait d'un entier (en ignorant la virgule).
  2. Multiplier par 2-n.

Par exemple, pour convertir une valeur interne Q4.27 en valeur à virgule flottante, utilisez:

float = integer * (2 ^ -27)

Les conversions de nombres à virgule flottante en nombres à virgule fixe respectent les règles suivantes:

  • La plage nominale de la précision simple à virgule flottante est de ±1,0, mais la plage complète des valeurs intermédiaires est de ±1,7e+38. La conversion entre les nombres à virgule flottante et les nombres à virgule fixe pour la représentation externe (telle que la sortie vers des appareils audio) ne tient compte que de la plage nominale, avec un forçage pour les valeurs qui dépassent cette plage. En particulier, lorsque +1,0 est converti en format à virgule flottante, il est limité à +1,0 moins un bit de signe.
  • Les valeurs non normales (sous-normales) et les valeurs +/- 0,0 sont autorisées dans la représentation, mais peuvent être converties en 0,0 de manière silencieuse lors du traitement.
  • Les infinités seront transmises aux opérations ou seront limitées de manière silencieuse à +/- 1,0. En général, ce dernier est utilisé pour la conversion vers un format à virgule flottante.
  • Le comportement de NaN n'est pas défini: un NaN peut se propager en tant que NaN identique, ou être converti en NaN par défaut, ou être limité de manière silencieuse à +/- 1,0, ou être converti en 0,0 de manière silencieuse, ou entraîner une erreur.

Conversions à virgule fixe

Les conversions entre différents formats Qm.n respectent les règles suivantes:

  • Lorsque m est augmenté, la partie entière est étendue à gauche.
  • Lorsque m est diminué, limitez la partie entière.
  • Lorsque n est augmenté, la partie fractionnaire est étendue à droite par des zéros.
  • Lorsque n est réduit, les bits fractionnaires excédentaires sont soit ditherisés, soit arrondis, soit tronqués à droite.

Par exemple, pour convertir une valeur Q4.27 en Q0.15 (sans tramage ni arrondi), décalez la valeur Q4.27 de 12 bits vers la droite, puis limitez les résultats qui dépassent la plage signée de 16 bits. Cela aligne le point de la représentation Q.

Pour convertir Q7.24 en Q7.23, effectuez une division signée par 2, ou ajoutez le bit de signe à la quantité entière Q7.24, puis effectuez un décalage à droite signé de 1. Notez qu'un simple décalage à droite signé n'est pas équivalent à une division par 2 avec signe.

Conversions avec perte et sans perte

Une conversion est sans perte si elle est inversible : une conversion de A en B en C donne A = C. Sinon, la conversion est avec perte.

Les conversions sans perte permettent une conversion de format aller-retour.

Les conversions de la représentation à virgule fixe avec 25 bits significatifs ou moins en virgule flottante sont sans perte. Les conversions de nombres à virgule flottante vers une représentation à virgule fixe courante sont sujettes à des pertes.