Formats de données

Android utilise une grande variété d'audio formats de données en interne et en expose un sous-ensemble dans les API publiques, formats de fichiers, et 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ée sans perte, ou compressée avec perte. PCM est le format audio non compressé le plus courant. FLAC est une classe de stockage compressée sans perte, le format MP3 et AAC sont des formats compressés avec pertes.
Profondeur de bits
Nombre de bits significatifs par échantillon audio.
Taille du conteneur
Nombre de bits utilisés pour stocker ou transmettre un échantillon. Habituellement est identique à la profondeur de bits, mais parfois des bits de remplissage sont alloués pour l'alignement. Par exemple, un 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, est appelée empaqueté. Sinon, la représentation est unempaqueté. Les parties significatives de l'échantillon sont généralement aligné sur l'élément le plus à gauche (le plus significatif) ou le plus à droite (le moins significatif) du conteneur. Il est conventionnel d'utiliser les termes empaqueté et non empaqueté uniquement lorsque le bit la profondeur n'est pas puissance de deux.
Signé
Indique si les échantillons sont signés ou non signés.
Representation
Valeur à virgule fixe ou à virgule flottante voir ci-dessous.

Représentation à point fixe

Point fixe est la représentation la plus courante pour les 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 base 2, Nous remplaçons donc bit par digit, et point binaire ou simplement point pour le point de base. Les bits à gauche du point sont la partie entière, et les bits à droite du point sont les partie fractionnaire.

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

Nous utilisons le complément à deux. pour toutes les représentations signées à virgule fixe, Ainsi, les éléments suivants contiennent 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érents notations pour représenter un nombre entier à virgule fixe. Nous utilisons la notation Q: Qm.n signifie m bits entiers et n bits fractionnaires. Le "Q" compte comme un bit, bien que la valeur soit exprimée dans le complément de deux. Le nombre total de bits est égal à m + n + 1.

Um.n correspond aux numéros non signés: m bits entiers et n bits fractionnaires, et le "U" compte comme zéro bit. Le nombre total de bits est égal à m + n.

Le nombre entier peut être utilisé 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 comprise dans la plage ou peut être limitée à cette plage. Notez que les bits de garde à virgule fixe se trouvent à gauche, tandis que les bits de protection à virgule flottante sont à virgule flottante. chiffres de garde servent à réduire les erreurs d'arrondi et se trouvent à droite.

Représentation à virgule flottante

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

  • Marge de progression plus importante et plage dynamique. l'arithmétique à virgule flottante tolère le dépassement des plages nominales lors des calculs intermédiaires, et ne limite les valeurs qu'à la fin
  • Prise en charge de valeurs spéciales telles que infinities et NaN
  • Plus facile à utiliser dans de nombreux cas

Auparavant, l'arithmétique à virgule flottante était plus lente que les nombres entiers ou à virgule fixe. arithmétique, mais il est courant que la virgule flottante soit plus rapide, les décisions du flux de contrôle fournies ne sont pas basées sur la valeur d'un calcul.

Formats Android pour l'audio

Les principaux formats Android pour l'audio sont listés dans le tableau ci-dessous:

Notation
Propriété Q0.15 Q0.7 1 Q0.23 Q0.31 float
Bits
du conteneur
16 8 24 ou 322 32 32
Signes significatifs
y compris le signe
16 8 24 24 ou 322 25 3
Marge de progression
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 comprise entre -1,0 et +1,0 moins un LSB. Il y a une valeur négative en plus qu'une valeur positive en raison de la la représentation du complément de 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 réalité d'une valeur signée avec un biais de 0.10000000.
  2. Q0.23 peut être empaqueté en 24 bits (trois octets 8 bits, few-endian) ou non empaqueté en 32 bits. S'ils ne sont pas empaquetés, les bits significatifs sont soit justifiés à droite. vers le LSB avec une marge intérieure d'extension de signe vers le MSB (Q8.23) ou justifié à gauche par rapport au 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 a 23 bits explicites, un bit caché et un bit de signe, ce qui donne un total de 25 bits significatifs. Numéros anormal avoir moins de bits significatifs.
  4. Les valeurs à virgule flottante à simple précision peuvent exprimer des valeurs allant jusqu'à ±1,7e + 38, ce qui explique la grande marge de progression.
  5. La plage dynamique indiquée correspond aux dénormalisations jusqu'au maximum nominal ±1,0. Notez que certaines implémentations à virgule flottante propres à l'architecture, telles que NÉON ne prennent pas en charge les dénormalités.

Conversions

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

Conversions à virgule flottante

Pour convertir une valeur du format Qm.n en virgule flottante:

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

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

float = integer * (2 ^ -27)

Pour les conversions à virgule flottante en points fixes, suivez les règles ci-dessous:

  • La virgule flottante à simple précision a une plage nominale de ±1,0, alors que la plage complète pour les valeurs intermédiaires est de ±1,7e+38. Conversion entre les valeurs à virgule flottante et fixe pour la représentation externe (comme la sortie vers des appareils audio) ne prend en compte que la plage nominale, avec pour les valeurs qui dépassent cette plage. En particulier, lorsque +1.0 est converti à un format à virgule fixe, elle est limitée à +1,0 moins un LSB.
  • Les dénormalités (sous-normales) et les valeurs +/- 0,0 sont autorisées dans la représentation, mais il peut être converti silencieusement en 0.0 lors du traitement.
  • Les infinies passeront par des opérations ou seront limitées silencieusement à +/- 1,0. Généralement, cette dernière est destinée à la conversion vers un format à virgule fixe.
  • Le comportement NaN n'est pas défini: une NaN peut se propager comme une NaN identique, ou peut être converti en une valeur NaN par défaut, peut être silencieusement limitée à +/- 1.0, ou silencieusement en 0.0 ou entraîner une erreur.

Conversions à points fixes

Les conversions entre différents formats QM.N respectent les règles suivantes:

  • Lorsque la valeur m est augmentée, le signe étend la partie entière à gauche.
  • Lorsque la valeur de m est réduite, réduisez la partie entière.
  • Lorsque vous augmentez la valeur n, la valeur zéro étend la partie fractionnaire située à droite.
  • Lorsque la valeur n est réduite, tramer, arrondir ou tronquer les bits fractionnaires en trop à droite.

Par exemple, pour convertir une valeur Q4.27 en Q0.15 (sans trame de données ni arrondir), décaler la valeur Q4.27 de 12 bits vers la droite et limiter 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 ajouter de manière équivalente le bit de signe à la quantité d'entiers 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 renvoie A = C. Sinon, la conversion est perte.

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

Les conversions d'une représentation à virgule fixe avec 25 bits significatifs ou moins en virgule flottante sont sans perte. Les conversions d'une représentation à virgule flottante à une représentation à virgule fixe courante sont perdues.