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 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 emballé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 conventionnel d'utiliser les termes compressé et décompressé uniquement lorsque la profondeur de bits n'est pas une puissance de deux .
Signature
Si les échantillons sont signés ou non.
Représentation
Soit à virgule fixe, soit à virgule flottante ; voir ci-dessous.

Représentation en 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 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 bit par chiffre et point binaire ou simplement point par 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 sous forme de valeurs entières. L'interprétation en virgule fixe est implicite.

Nous utilisons le complément à deux pour toutes les représentations signées à virgule fixe, 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 à virgule fixe dans un entier. Nous utilisons la notation Q : Q m . n signifie m bits entiers et n bits fractionnaires. Le « 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.

Euh . n correspond aux nombres non signés : m bits entiers et n bits fractionnaires, et le "U" compte pour 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 le débordement d'un calcul intermédiaire, tant que la valeur finale est dans la plage ou peut être fixée pour être dans la plage. Notez que les bits de garde à virgule fixe se trouvent à gauche, tandis que les chiffres de garde d'unité à virgule flottante sont utilisés pour réduire les erreurs d'arrondi et se trouvent à droite.

Représentation à 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 sont les suivants :

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

Historiquement, l'arithmétique à virgule flottante était plus lente que l'arithmétique à virgule fixe ou entière, 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 flotter
Récipient
morceaux
16 8 24 ou 32 2 32 32
Éléments importants
y compris le signe
16 8 24 24 ou 32 2 25 3
Hauteur sous plafond
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 en complément à deux.

Notes de bas de page :

  1. Tous les formats ci-dessus expriment des exemples de valeurs signées. Le format 8 bits est communément appelé « non signé », mais il s'agit en réalité 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 sont dé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 nul 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 comporte 23 bits explicites plus un bit caché et un bit de signe, ce qui donne un total de 25 bits significatifs. Les nombres dénormaux 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énormalités jusqu'à la valeur nominale maximale ±1,0. Notez que certaines implémentations à virgule flottante spécifiques à l'architecture telles que NEON ne prennent pas en charge les dénormalités.

Conversions

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

Conversions en virgule flottante

Pour convertir une valeur de Q m . n format 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) prendra en compte uniquement la plage nominale, avec un blocage pour les valeurs qui dépassent cette plage. En particulier, lorsque +1,0 est converti au 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 convertis silencieusement 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 limité silencieusement à +/- 1,0, ou converti silencieusement à 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 diminue, serrez 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 la valeur Q4.27 de 12 bits vers la droite 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 de manière équivalente, ajoutez le bit de signe à la quantité entière Q7.24, puis signez un décalage à droite 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 vers B vers 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 se font sans perte. Les conversions de la virgule flottante vers toute représentation à virgule fixe commune entraînent des pertes.