Formats de données

Utilise Android une grande variété de audio formats de données interne, et expose un sous - ensemble de ceux - ci 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 selon leurs propriétés :

Compression
Décompressé , comprimé sans perte ou avec perte compressé . 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 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 bit, la représentation est appelée emballé. Sinon , la représentation est décompressé. 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 emballés ou non seulement lorsque la profondeur de bit est pas une puissance de deux .
Signature
Si les échantillons sont signés ou non signés.
Représentation
soit à virgule fixe, soit à virgule flottante ; voir ci-dessous.

Représentation en point fixe

Point fixe est la plus commune pour la représentation des données audio non compressé PCM, en particulier au niveau des interfaces matérielles.

Un nombre à virgule fixe a un nombre fixe (constante) de chiffres avant et après le point de base . Toutes nos représentations utilisent la base 2 , donc nous substituons peu pour le chiffre, et le point binaire ou simplement point pour point de radix. Les bits vers la gauche du point sont la partie entière et les bits vers la droite du point sont la partie fractionnaire .

Nous parlons de PCM entier, parce que les valeurs à virgule fixe sont généralement stockées et manipulées comme des valeurs entières. L'interprétation comme point fixe est implicite.

Nous utilisons le complément à deux pour tous signé des représentations à virgule fixe, de sorte que ce qui suit est où toutes les valeurs sont exprimées en unités d'un bit de poids faible :

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

Notation Q et U

Il existe différentes notations de représentation point fixe dans un entier. Nous utilisons la notation Q : Q m. n moyens de 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 de m + n + 1.

M U. n est de nombres non signés: m bits entiers et n bits fractionnaires, et les chiffres de « U » en tant que bits zéro. Le nombre total de bits est de 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 à la gauche, tandis que l' unité à virgule flottante chiffres de garde sont utilisés pour réduire l' erreur d' arrondi et se trouvent à droite.

Représentation en virgule flottante

Virgule flottante est une alternative au point fixe, dans lequel l'emplacement du point peut varier. Les principaux avantages de la virgule flottante comprennent :

  • Une plus grande hauteur et dynamique ; l'arithmétique à virgule flottante tolère le dépassement des plages nominales pendant le calcul intermédiaire et ne bloque 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 à nombre entier 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 A0.7 1 Q0.23 Q0.31 flotter
Récipient
morceaux
16 8 24 ou 32 2 32 32
Bits significatifs
y compris signe
16 8 24 24 ou 32 2 25 3
Hauteur sous barrot
en dB
0 0 0 0 4 126
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 est en fait une valeur signée avec le biais de 0.10000000 .
  2. Q0.23 peut être compressé en 24 bits (trois octets de 8 bits, little-endian), 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 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 des bits moins significatifs.
  4. La virgule flottante simple précision peut exprimer des valeurs jusqu'à ±1,7e+38, ce qui explique la grande marge.
  5. La plage dynamique indiquée concerne les dénormalisations jusqu'à la valeur nominale maximale ±1,0. Notez que certaines implémentations de virgule flottante spécifique à l' architecture tels que NEON ne prennent pas en charge dénormalisés.

Conversions

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

Conversions en virgule flottante

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

  1. Convertissez la valeur en virgule flottante comme s'il s'agissait d'un entier (en ignorant le point).
  2. Multiplier 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 serrage 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ées dans la représentation, mais peuvent être converties silencieusement en 0,0 pendant le traitement.
  • Les infinis passeront par les opérations ou seront limités en silence à +/- 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é en silence à +/- 1,0 ou converti en silence à 0,0, ou entraîner une erreur.

Conversions en virgule fixe

Les conversions entre différents m q. n formats suivent les règles suivantes:

  • Lorsque m est augmentée, signe de prolonger la partie entière à gauche.
  • Lorsque m est diminuée, serrer la partie entière.
  • Lorsque n augmente, zéro étendre la partie décimale à droite.
  • Lorsque n est diminuée, soit tramage, rond ou tronquer les bits fractionnaires en excès à droite.

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

Pour convertir Q7.24 à Q7.23, faire une division signée par 2 ou ajouter le bit équivalente signe à la quantité entière de Q7.24, puis signé décalage vers la droite par 1. Notez que d' un simple décalage vers la droite signé ne correspond pas à une division signée par 2.

Conversions avec et sans perte

Une conversion est sans perte si elle est inversible : une conversion de A à B à C conduit à A = C . Sinon , la conversion est lossy .

Conversions Lossless permettent la 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 à virgule fixe commune sont avec perte.