Datenformate

Android verwendet intern eine Vielzahl von Audiodatenformaten und stellt einen Teil davon in öffentlichen APIs, Dateiformaten und der Hardware Abstraction Layer (HAL) bereit.

Properties

Die Audiodatenformate werden nach ihren Eigenschaften klassifiziert:

Komprimierung
Unkomprimiert, verlustfrei komprimiert oder verlustbehaftet komprimiert. PCM ist das gängigste nicht komprimierte Audioformat. FLAC ist ein verlustfreies Komprimierungsformat, während MP3 und AAC verlustbehaftete Komprimierungsformate sind.
Bittiefe
Anzahl der signifikanten Bits pro Audio-Sample.
Containergröße
Anzahl der Bits, die zum Speichern oder Übertragen eines Samples verwendet werden. Normalerweise entspricht dieser Wert der Bittiefe, manchmal werden jedoch zusätzliche Padding-Bits für die Ausrichtung zugewiesen. Ein 24‑Bit-Sample kann beispielsweise in einem 32‑Bit-Wort enthalten sein.
Ausrichtung
Wenn die Containergröße genau der Bittiefe entspricht, wird die Darstellung als komprimiert bezeichnet. Andernfalls wird die Darstellung entpackt. Die signifikanten Bits der Stichprobe sind in der Regel entweder mit dem äußersten linken (höchstwertigen) oder dem äußersten rechten (niedrigstwertigen) Bit des Containers ausgerichtet. Die Begriffe komprimiert und dekomprimiert werden üblicherweise nur verwendet, wenn die Bittiefe keine Potenz von 2 ist.
Signatur
Ob Samples signiert oder nicht signiert sind.
Representation
Entweder Festkomma- oder Gleitkommazahl; siehe unten.

Festkommadarstellung

Fixpunktdarstellung ist die gängigste Darstellung für nicht komprimierte PCM-Audiodaten, insbesondere an Hardwareschnittstellen.

Eine Festkommazahl hat eine feste (konstante) Anzahl von Ziffern vor und nach dem Radixpunkt. Alle unsere Darstellungen verwenden das Stellenwertsystem mit der Basis 2. Daher ersetzen wir Bit durch Stelle und Binärpunkt oder einfach Punkt durch Radixpunkt. Die Bits links vom Punkt sind der Ganzzahlteil und die Bits rechts vom Punkt sind der Bruchteil.

Wir sprechen von Integer PCM, weil Gleitkommawerte in der Regel als Ganzzahlwerte gespeichert und manipuliert werden. Die Interpretation als Fixpunkt ist implizit.

Wir verwenden das Zweierkomplement für alle signierten Gleitkommadarstellungen. Daher gilt Folgendes, wobei alle Werte in Einheiten von einem LSB angegeben sind:

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

Q- und U-Notation

Es gibt verschiedene Notationen für die Darstellung von Gleitkommazahlen als Ganzzahl. Wir verwenden die Q-Notation: Qm.n bedeutet m Ganzzahlbits und n Gleitkommabits. „Q“ zählt als ein Bit, obwohl der Wert im Zweierkomplement ausgedrückt wird. Die Gesamtzahl der Bits ist m + n + 1.

Um.n ist für vorzeichenlose Zahlen: m Ganzzahlbits und n Bruchbits. „U“ zählt als Nullbits. Die Gesamtzahl der Bits ist m + n.

Der Ganzzahlteil kann im Endergebnis verwendet werden oder vorübergehend sein. Im letzteren Fall werden die Bits, aus denen der Ganzzahlteil besteht, als Guard-Bits bezeichnet. Die Guard-Bits erlauben einen Überlauf bei einer Zwischenberechnung, solange der Endwert innerhalb des Bereichs liegt oder auf einen Wert innerhalb des Bereichs begrenzt werden kann. Die Guard-Bits für Gleitkommazahlen befinden sich rechts, während die Guard-Bits für Festkommazahlen links sind. Sie dienen dazu, Rundungsfehler zu reduzieren.

Gleitkommadarstellung

Gleitkommazahlen sind eine Alternative zu Festkommazahlen, bei denen die Position des Punktes variieren kann. Die wichtigsten Vorteile von Gleitkommazahlen:

  • Größerer Headroom und dynamischer Bereich; mit Gleitkommaarithmetik können bei Zwischenberechnungen die Nennbereiche überschritten werden und die Werte werden erst am Ende begrenzt
  • Unterstützung für spezielle Werte wie Unendlichkeit und NaN
  • In vielen Fällen einfacher zu verwenden

Früher war die Gleitkommaarithmetik langsamer als die Ganzzahl- oder Festkommaarithmetik. Heute ist sie jedoch häufig schneller, sofern Entscheidungen zur Ablaufsteuerung nicht auf dem Wert einer Berechnung basieren.

Android-Formate für Audio

Die wichtigsten Android-Formate für Audio sind in der folgenden Tabelle aufgeführt:

Notation
Attribut Q0.15 F0.7 1 Q0.23 Q0.31 float
Container
-Bits
16 8 24 oder 32 2 32 32
Wichtige Bits
einschließlich Vorzeichen
16 8 24 24 oder 32 2 25 3
Headroom
in dB
0 0 0 0 126 4
Dynamikumfang
in dB
90 42 138 138 bis 186 900 5

Alle oben genannten Gleitkommaformate haben einen Nennbereich von −1,0 bis +1,0 abzüglich eines LSb. Aufgrund der Darstellung im Zweierkomplementarformat gibt es einen negativen Wert mehr als einen positiven Wert.

Fußnoten:

  1. Alle oben genannten Formate geben signierte Stichprobenwerte an. Das 8‑Bit-Format wird häufig als „unsigniert“ bezeichnet, ist aber in Wirklichkeit ein signierter Wert mit einer Vorzeichenabweichung von 0.10000000.
  2. Q0.23 kann in 24 Bit (drei 8‑Bit-Byte, Little-Endian) verpackt oder in 32 Bit entpackt werden. Nach dem Entpacken sind die signifikanten Bits entweder rechtsbündig zum LSByte ausgerichtet, wobei das Vorzeichenbit mit Nullen aufgefüllt wird (Q8.23), oder linksbündig zum MSByte ausgerichtet, wobei das LSByte mit Nullen aufgefüllt wird (Q0.31). Q0.31 ermöglicht theoretisch bis zu 32 signifikante Bits, aber Hardwareschnittstellen, die Q0.31 akzeptieren, nutzen selten alle Bits.
  3. Gleitkommazahlen mit einfacher Genauigkeit haben 23 explizite Bits plus ein verstecktes Bit und ein Vorzeichenbit, was insgesamt 25 signifikante Bits ergibt. Außergewöhnliche Zahlen haben weniger signifikante Bits.
  4. Gleitkommazahlen mit einfacher Genauigkeit können Werte bis zu ± 1,7 × 1038 ausdrücken, was den großen Spielraum erklärt.
  5. Der angezeigte dynamische Bereich gilt für Denormalisierungen bis zum nominellen Maximalwert ± 1,0. Einige architekturspezifische Gleitkommaimplementierungen wie NEON unterstützen keine Denormalisierungen.

Conversions

In diesem Abschnitt werden Datenkonvertierungen zwischen verschiedenen Darstellungen beschrieben.

Gleitkommakonvertierungen

So wandeln Sie einen Wert aus dem Format Qm.n in eine Gleitkommazahl um:

  1. Der Wert wird in einen Gleitkommawert umgewandelt, als wäre er eine Ganzzahl (der Punkt wird ignoriert).
  2. Multiplizieren Sie mit 2n.

So wandeln Sie beispielsweise einen internen Wert von Q4.27 in einen Gleitkommawert um:

float = integer * (2 ^ -27)

Für die Umwandlung von Gleitkommazahlen in Festkommazahlen gelten die folgenden Regeln:

  • Gleitkommazahlen mit einfacher Genauigkeit haben einen nominellen Bereich von ± 1,0, der vollständige Bereich für Zwischenwerte beträgt jedoch ± 1,7 · 1038. Bei der Umwandlung zwischen Gleitkomma- und Festkommazahlen für die externe Darstellung (z. B. Ausgabe an Audiogeräte) wird nur der Nennbereich berücksichtigt. Werte, die diesen Bereich überschreiten, werden begrenzt. Insbesondere wird +1.0 bei der Umwandlung in ein Fixpunktformat auf +1.0 minus ein LSB begrenzt.
  • Außergewöhnliche Werte (Subnormalwerte) und sowohl −0,0 als auch +0,0 sind in der Darstellung zulässig, können aber bei der Verarbeitung geräuschlos in 0,0 umgewandelt werden.
  • Unendliche Werte werden entweder an die Vorgänge übergeben oder werden stillschweigend auf +/- 1,0 begrenzt. Letzteres dient in der Regel der Umwandlung in ein Fixpunktformat.
  • Das Verhalten von NaN ist nicht definiert: Ein NaN kann als identisches NaN weitergegeben oder in ein Standard-NaN umgewandelt werden. Es kann auch geräuschlos auf +/- 1,0 begrenzt oder in 0,0 umgewandelt werden oder zu einem Fehler führen.

Gleitkommakonvertierungen

Bei der Umwandlung zwischen verschiedenen Qm.n-Formaten gelten die folgenden Regeln:

  • Wenn m erhöht wird, wird der Ganzzahlteil links mit dem Vorzeichen erweitert.
  • Wenn m verringert wird, wird der Ganzzahlteil begrenzt.
  • Wenn n erhöht wird, wird der Bruchteil rechts durch Nullen erweitert.
  • Wenn n verringert wird, werden die überzähligen Bruchteile rechts entweder gedithert, gerundet oder abgeschnitten.

Wenn Sie beispielsweise einen Q4.27-Wert in Q0.15 umwandeln möchten (ohne Dithering oder Rundung), schieben Sie den Q4.27-Wert um 12 Bit nach rechts und begrenzen Sie alle Ergebnisse, die den signierten Bereich von 16 Bit überschreiten. Dadurch wird der Punkt der Q-Darstellung ausgerichtet.

Um Q7.24 in Q7.23 umzuwandeln, führen Sie eine vorzeichenbehaftete Division durch 2 aus oder fügen Sie der Ganzzahl Q7.24 das Vorzeichenbit hinzu und verschieben Sie sie dann vorzeichenbehaftet um 1 nach rechts. Beachten Sie, dass eine einfache rechtsverschiebende Bitoperation mit Vorzeichen nicht einer Division durch 2 mit Vorzeichen entspricht.

Verlustbehaftete und verlustfreie Konvertierung

Eine Konvertierung ist verlustfrei, wenn sie umkehrbar ist: Eine Konvertierung von A zu B zu C ergibt A = C. Andernfalls ist die Umwandlung verlustbehaftet.

Bei verlustfreien Konvertierungen ist eine umgekehrte Formatkonvertierung möglich.

Die Umwandlung von Festkommadarstellungen mit 25 oder weniger signifikanten Bits in Gleitkommazahlen ist verlustfrei. Bei der Umwandlung von Gleitkommazahlen in eine gängige Darstellung mit fester Binärdarstellung kommt es zu Verlusten.