Android verwendet intern eine Vielzahl von Audiodatenformaten und stellt eine Teilmenge davon in öffentlichen APIs , Dateiformaten und der Hardware Abstraction Layer (HAL) bereit.
Eigenschaften
Die Audiodatenformate werden nach ihren Eigenschaften klassifiziert:
- Kompression
- Unkomprimiert , verlustfrei komprimiert oder verlustbehaftet komprimiert . PCM ist das am weitesten verbreitete unkomprimierte Audioformat. FLAC ist ein verlustfrei komprimiertes Format, während MP3 und AAC verlustbehaftete komprimierte Formate sind.
- Bittiefe
- Anzahl signifikanter Bits pro Audio-Sample.
- Behältergröße
- Anzahl der Bits, die zum Speichern oder Übertragen eines Samples verwendet werden. Normalerweise entspricht dies der Bittiefe, aber manchmal werden zusätzliche Füllbits für die Ausrichtung zugewiesen. Beispielsweise könnte ein 24-Bit-Abtastwert in einem 32-Bit-Wort enthalten sein.
- Ausrichtung
- Wenn die Containergröße genau gleich der Bittiefe ist, heißt die Darstellung gepackt . Andernfalls wird die Darstellung entpackt . Die signifikanten Bits des Samples werden typischerweise entweder mit dem ganz linken (höchstwertigen) oder ganz rechten (niedrigstwertigen) Bit des Containers ausgerichtet. Es ist üblich, die Begriffe gepackt und ungepackt nur dann zu verwenden, wenn die Bittiefe keine Zweierpotenz ist.
- Unterzeichnung
- Ob Proben signiert oder unsigniert sind.
- Darstellung
- Entweder Festkomma oder Gleitkomma; siehe unten.
Festkommadarstellung
Festkomma ist die gebräuchlichste Darstellung für unkomprimierte PCM-Audiodaten, insbesondere an Hardwareschnittstellen.
Eine Festkommazahl hat eine feste (konstante) Anzahl von Ziffern vor und nach dem Basispunkt . Alle unsere Darstellungen verwenden die Basis 2 , also ersetzen wir Bit durch Ziffer und Binärpunkt oder einfach Punkt durch Radixpunkt . Die Bits links vom Punkt sind der ganzzahlige Teil und die Bits rechts vom Punkt sind der Bruchteil .
Wir sprechen von Integer-PCM , weil Festkommawerte normalerweise als Integer-Werte gespeichert und verarbeitet werden. Die Interpretation als Fixpunkt ist implizit.
Wir verwenden das Zweierkomplement für alle vorzeichenbehafteten Festkommadarstellungen, sodass Folgendes gilt, wenn alle Werte in Einheiten von einem LSB sind:
|largest negative value| = |largest positive value| + 1
Q- und U-Notation
Es gibt verschiedene Notationen für die Festkommadarstellung in einer ganzen Zahl. Wir verwenden die Q-Notation : Q m . n bedeutet m ganzzahlige Bits und n Bruchbits. Das "Q" zählt als ein Bit, obwohl der Wert im Zweierkomplement ausgedrückt wird. Die Gesamtzahl der Bits ist m + n + 1.
Ähm . n steht für vorzeichenlose Zahlen: m ganzzahlige Bits und n Bruchbits, und das „U“ zählt als Nullbits. Die Gesamtzahl der Bits ist m + n .
Der ganzzahlige Teil kann im Endergebnis verwendet werden oder temporär sein. Im letzteren Fall werden die Bits, die den ganzzahligen Teil bilden, als Schutzbits bezeichnet. Die Schutzbits lassen zu, dass eine Zwischenrechnung überläuft, solange der Endwert innerhalb des Bereichs liegt oder innerhalb des Bereichs geklemmt werden kann. Beachten Sie, dass sich die Festkomma- Schutzbits auf der linken Seite befinden, während die Gleitkomma-Einheitsschutzziffern verwendet werden, um Rundungsfehler zu reduzieren, und sich auf der rechten Seite befinden.
Fließkommadarstellung
Fließkomma ist eine Alternative zum Festkomma, bei der die Position des Punktes variieren kann. Zu den Hauptvorteilen von Gleitkommazahlen gehören:
- Größerer Headroom und Dynamikumfang ; Gleitkomma-Arithmetik toleriert das Überschreiten von Nennbereichen während der Zwischenberechnung und klemmt Werte nur am Ende
- Unterstützung für spezielle Werte wie unendlich und NaN
- In vielen Fällen einfacher zu handhaben
In der Vergangenheit war die Gleitkomma-Arithmetik langsamer als die Ganzzahl- oder Festkomma-Arithmetik, aber jetzt ist es üblich, dass die Gleitkomma-Arithmetik schneller ist, vorausgesetzt, Kontrollflussentscheidungen basieren nicht auf dem Wert einer Berechnung.
Android-Formate für Audio
Die wichtigsten Android-Formate für Audio sind in der folgenden Tabelle aufgeführt:
Eigentum | Q0.15 | Q0.7 1 | Q0.23 | Q0.31 | schweben | |
---|---|---|---|---|---|---|
Container Bits | 16 | 8 | 24 oder 32 2 | 32 | 32 | |
Bedeutende Bits inklusive Zeichen | 16 | 8 | 24 | 24 oder 32 2 | 25 3 | |
Kopffreiheit in dB | 0 | 0 | 0 | 0 | 126 4 | |
Dynamikbereich in dB | 90 | 42 | 138 | 138 bis 186 | 900 5 |
Alle oben genannten Festkommaformate haben einen Nennbereich von -1,0 bis +1,0 minus einem LSB. Aufgrund der Zweierkomplementdarstellung gibt es einen negativen Wert mehr als einen positiven Wert.
Fußnoten:
- Alle obigen Formate drücken vorzeichenbehaftete Beispielwerte aus. Das 8-Bit-Format wird allgemein als "unsigned" bezeichnet, ist aber eigentlich ein vorzeichenbehafteter Wert mit einer Abweichung von
0.10000000
. - Q0.23 kann in 24 Bit (drei 8-Bit-Bytes, Little-Endian) gepackt oder in 32 Bit entpackt werden. Im entpackten Zustand sind die signifikanten Bits entweder rechtsbündig zum LSB mit Vorzeichenerweiterung zum MSB (Q8.23) oder linksbündig zum MSB mit Nullfüllung zum LSB (Q0.31) ausgerichtet. Q0.31 erlaubt theoretisch bis zu 32 signifikante Bits, aber Hardwareschnittstellen, die Q0.31 akzeptieren, verwenden selten alle Bits.
- Gleitkommazahlen mit einfacher Genauigkeit haben 23 explizite Bits plus ein verborgenes Bit und ein Vorzeichenbit, was insgesamt 25 signifikante Bits ergibt. Denormale Zahlen haben weniger signifikante Bits.
- Gleitkommazahlen mit einfacher Genauigkeit können Werte bis zu ±1,7e+38 ausdrücken, was den großen Headroom erklärt.
- Der gezeigte dynamische Bereich gilt für Denormalitäten bis zum nominellen Maximalwert ±1,0. Beachten Sie, dass einige architekturspezifische Gleitkommaimplementierungen wie NEON keine Denormalen unterstützen.
Konvertierungen
Dieser Abschnitt behandelt Datenkonvertierungen zwischen verschiedenen Darstellungen.
Fließkomma-Konvertierungen
Um einen Wert von Q m umzuwandeln. n -Format in Fließkomma:
- Wandeln Sie den Wert in Gleitkommazahlen um, als wäre es eine ganze Zahl (indem Sie den Punkt ignorieren).
- Multipliziere mit 2 - n .
Um beispielsweise einen internen Wert von Q4.27 in Gleitkommazahlen umzuwandeln, verwenden Sie:
float = integer * (2 ^ -27)
Konvertierungen von Fließkommazahlen in Festkommazahlen folgen diesen Regeln:
- Gleitkommazahlen mit einfacher Genauigkeit haben einen Nennbereich von ±1,0, aber der volle Bereich für Zwischenwerte beträgt ±1,7e+38. Die Konvertierung zwischen Gleitkomma und Festkomma für die externe Darstellung (z. B. die Ausgabe an Audiogeräte) berücksichtigt nur den Nennbereich, wobei Werte, die diesen Bereich überschreiten, geklemmt werden. Insbesondere wenn +1,0 in ein Festkommaformat umgewandelt wird, wird es auf +1,0 minus ein LSB geklemmt.
- Denormals (Subnormals) und beide +/- 0,0 sind in der Darstellung erlaubt, können aber während der Verarbeitung stillschweigend in 0,0 konvertiert werden.
- Unendlichkeiten werden entweder Operationen durchlaufen oder stillschweigend auf +/- 1,0 begrenzt. Im Allgemeinen dient letzteres zur Konvertierung in ein Festkommaformat.
- Das NaN-Verhalten ist undefiniert: Ein NaN kann sich als identisches NaN ausbreiten oder in ein Standard-NaN konvertiert werden, kann stillschweigend hart auf +/- 1,0 begrenzt oder stillschweigend in 0,0 konvertiert werden oder zu einem Fehler führen.
Festkommaumwandlungen
Umwandlungen zwischen verschiedenen Q m . n -Formate folgen diesen Regeln:
- Wenn m erhöht wird, erweitern Sie den ganzzahligen Teil auf der linken Seite.
- Wenn m verringert wird, klemme den ganzzahligen Teil.
- Wenn n erhöht wird, wird der Bruchteil rechts um Null erweitert.
- Wenn n verringert wird, werden die überschüssigen Bruchteilbits rechts entweder gedithert, gerundet oder abgeschnitten.
Um beispielsweise einen Q4.27-Wert in Q0.15 (ohne Zittern oder Runden) umzuwandeln, verschieben Sie den Q4.27-Wert um 12 Bits nach rechts und klemmen alle Ergebnisse, die den vorzeichenbehafteten 16-Bit-Bereich überschreiten. Dies richtet den Punkt der Q-Darstellung aus.
Um Q7.24 in Q7.23 umzuwandeln, führen Sie eine vorzeichenbehaftete Division durch 2 durch oder addieren Sie entsprechend das Vorzeichenbit zur ganzzahligen Menge von Q7.24 und verschieben Sie dann eine vorzeichenbehaftete Rechtsverschiebung um 1. Beachten Sie, dass eine einfache vorzeichenbehaftete Rechtsverschiebung nicht äquivalent ist eine vorzeichenbehaftete Division durch 2.
Verlustbehaftete und verlustfreie Konvertierungen
Eine Konvertierung ist verlustfrei , wenn sie invertierbar ist: Eine Konvertierung von A
nach B
nach C
ergibt A = C
Andernfalls ist die Konvertierung verlustbehaftet .
Verlustfreie Konvertierungen ermöglichen eine Round-Trip-Formatkonvertierung .
Umwandlungen von der Festkommadarstellung mit 25 oder weniger signifikanten Bits in die Gleitkommadarstellung sind verlustfrei. Konvertierungen von Gleitkommazahlen in eine beliebige gängige Festkommadarstellung sind verlustbehaftet.