Formats de données

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

Propriétés

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

Compression
Non compressé , compressé sans perte ou compressé avec perte . 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.
Peu profond
Nombre de bits significatifs par échantillon audio.
Taille du conteneur
Nombre de bits utilisés pour stocker ou transmettre un échantillon. Habituellement, c'est la même chose que la profondeur de bits, mais parfois des bits de remplissage supplémentaires sont alloués pour l'alignement. Par exemple, un échantillon de 24 bits pourrait ê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 packée . Sinon, la représentation est décompressée . Les bits significatifs de l'échantillon sont généralement alignés avec le bit le plus à gauche (le plus significatif) ou le plus à droite (le moins significatif) du conteneur. Il est classique d'utiliser les termes compressés et décompressés uniquement lorsque la profondeur de bits n'est pas une puissance de deux .
Signature
Si les échantillons sont signés ou non signés.
Représentation
Soit en virgule fixe, soit en virgule flottante ; voir ci-dessous.

Représentation en point 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 a 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 bit par le chiffre , et le point binaire ou simplement le point par le point de base . Les bits à gauche du point sont la partie entière et les bits à droite du point sont la partie fractionnaire .

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

Nous utilisons le complément à deux pour toutes les représentations en virgule fixe signées, donc ce qui suit est valable lorsque toutes les valeurs sont 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 en virgule fixe dans un nombre entier. Nous utilisons la notation Q : Q m . n signifie m bits entiers et n bits fractionnaires. Le "Q" compte comme un bit, bien que la valeur soit exprimée en complément à deux. Le nombre total de bits est m + n + 1.

Euh . n est 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 composent la partie entière sont appelés bits de garde . Les bits de garde permettent à un calcul intermédiaire de déborder, tant que la valeur finale est dans la plage ou peut être bloquée pour être dans la plage. Notez que les bits de garde à virgule fixe sont à gauche, tandis que les chiffres de garde d'unité à virgule flottante sont utilisés pour réduire l'erreur d'arrondi et sont à droite.

Représentation en virgule flottante

La virgule flottante est une alternative à la virgule fixe, dans laquelle l'emplacement du point peut varier. Les principaux avantages de la virgule flottante incluent :

  • Plus de marge et de plage dynamique ; l'arithmétique à virgule flottante tolère le dépassement des plages nominales pendant le calcul intermédiaire et ne fixe les valeurs qu'à la fin
  • Prise en charge de valeurs spéciales telles que les infinis et NaN
  • Plus facile à utiliser dans de nombreux cas

Historiquement, l'arithmétique à virgule flottante était plus lente que l'arithmétique entière ou à virgule fixe, mais il est maintenant courant que la 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 Android pour l'audio sont répertoriés dans le tableau ci-dessous :

Notation
Propriété Q0.15 Q0.7 1 Q0.23 Q0.31 flotteur
Récipient
morceaux
16 8 24 ou 32 2 32 32
Bits significatifs
y compris le signe
16 8 24 24 ou 32 2 25 3
Hauteur libre
en dB
0 0 0 0 126 4
Plage dynamique
en dB
90 42 138 138 à 186 900 5

Tous les formats à virgule fixe ci-dessus ont une plage nominale de -1,0 à +1,0 moins un LSB. Il y a une valeur négative de plus que la valeur positive en raison de la représentation du 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 compressé en 24 bits (trois octets de 8 bits, petit-boutiste) ou décompressé en 32 bits. S'ils ne sont pas compressés, les bits significatifs sont soit justifiés à droite vers le LSB avec un remplissage d'extension de signe vers le MSB (Q8.23), soit justifiés à gauche vers le MSB avec un remplissage de zéro vers le LSB (Q0.31). Q0.31 autorise théoriquement jusqu'à 32 bits significatifs, mais les interfaces matérielles qui acceptent Q0.31 utilisent rarement tous les bits.
  3. La virgule flottante simple précision a 23 bits explicites plus un bit caché et un bit de signe, ce qui donne un total de 25 bits significatifs. Les nombres dénormalisés ont moins de bits significatifs.
  4. La virgule flottante simple précision peut exprimer des valeurs allant jusqu'à ± 1,7e + 38, ce qui explique la grande marge.
  5. La plage dynamique indiquée concerne les dénormalisations jusqu'à la valeur maximale nominale ±1,0. Notez que certaines implémentations à virgule flottante spécifiques à l'architecture telles que NEON ne prennent pas en charge les dénormalisations.

Conversions

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

Conversions en virgule flottante

Pour convertir une valeur de Q m . format n en virgule flottante :

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

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

float = integer * (2 ^ -27)

Les conversions de virgule flottante en virgule fixe suivent ces règles :

  • La virgule flottante simple précision a une plage nominale de ±1,0, mais la plage complète pour les valeurs intermédiaires est de ±1,7e+38. La conversion entre virgule flottante et virgule fixe pour la représentation externe (telle que la sortie vers des périphériques audio) ne prendra en compte que la plage nominale, avec un blocage pour les valeurs qui dépassent cette plage. En particulier, lorsque +1,0 est converti en un format à virgule fixe, il est limité à +1,0 moins un LSB.
  • Les dénormalités (sous-normales) et les deux +/- 0,0 sont autorisés dans la représentation, mais peuvent être silencieusement convertis en 0,0 pendant le traitement.
  • Les infinis passeront par les opérations ou seront silencieusement limités à +/- 1,0. Généralement, ce dernier est destiné à la conversion vers un format à virgule fixe.
  • Le comportement de NaN n'est pas défini : un NaN peut se propager comme un NaN identique, ou peut être converti en un NaN par défaut, peut être silencieusement limité à +/- 1,0, ou silencieusement converti en 0,0, ou entraîner une erreur.

Conversions en virgule fixe

Conversions entre différents Q m . n formats suivent ces règles :

  • Lorsque m est augmenté, le signe étend la partie entière à gauche.
  • Lorsque m est diminué, bloquez la partie entière.
  • Lorsque n est augmenté, zéro étend la partie fractionnaire à droite.
  • Lorsque n est diminué, tramez, arrondissez ou tronquez les bits fractionnaires en excès à droite.

Par exemple, pour convertir une valeur Q4.27 en Q0.15 (sans tramage ni arrondi), décalez vers la droite la valeur Q4.27 de 12 bits et bloquez tous 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 de manière équivalente le bit de signe à la quantité entière Q7.24, puis un décalage à droite signé de 1. Notez qu'un simple décalage à droite signé n'est pas équivalent à une division signée par 2.

Conversions avec 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 en virgule fixe avec 25 bits significatifs ou moins en virgule flottante sont sans perte. Les conversions de virgule flottante vers n'importe quelle représentation courante en virgule fixe entraînent des pertes.