Formaty danych

Android używa wewnętrznie wielu różnych formatów danych, a podzbiór tych formatów udostępnia w publicznych interfejsach API, formatach plikówwarstwie abstrakcji sprzętowej (HAL).

Właściwości

Formaty danych audio są klasyfikowane według właściwości:

Kompresja
Nieskompresowany, skompresowany bezstratnie lub skompresowany ze stratą. PCM to najpopularniejszy nieskompresowany format audio. FLAC to bezstratny format kompresji, a MP3 i AAC to formaty stratne.
Głębia bitowa
Liczba znaczących bitów na próbkę audio.
Rozmiar kontenera
Liczba bitów użytych do przechowywania lub przesyłania próbki. Zwykle jest to takie samo jak głębia bitowa, ale czasami dodatkowe bity wypełniające są przydzielane na potrzeby wyrównywania. Na przykład próbka 24-bitowa może być zawarta w słowie 32-bitowym.
Wyrównanie
Jeśli rozmiar kontenera jest dokładnie równy głębi bitowej, reprezentacja jest nazywana spakowaną. W przeciwnym razie reprezentacja jest rozpakowana. Znaczące bity próbki są zwykle dopasowane do lewego (najbardziej znaczącego) lub prawego (najmniej znaczącego) bitu kontenera. Zwykle używa się terminów spakowany i niespakowany tylko wtedy, gdy głębokość bitowa nie jest potęgą dwójki.
Podpisany
Czy próbki są podpisane lub nie.
Reprezentacja
Dokładność stała lub zmiennoprzecinkowa (patrz poniżej).

Reprezentacja w postaci liczby zmiennoprzecinkowej

Punkt stały to najczęstsza reprezentacja nieskompresowanych danych audio PCM, zwłaszcza w przypadku interfejsów sprzętowych.

Liczba stałoprzecinkowa ma stałą (niezmienną) liczbę cyfr przed i po miejscu wykładniczym. Wszystkie nasze reprezentacje używają podstawy 2, więc zastępujemy bit cyfrą, a punkt binarny lub po prostu punkt punktem dziesiętnym. Bity po lewej stronie kropki to część całkowita, a te po prawej – część ułamkowa.

Mówimy o PCM całkowitoliczbowym, ponieważ wartości zmiennoprzecinkowe są zwykle przechowywane i przetwarzane jako wartości całkowite. Interpretacja jako liczba całkowita jest niejawna.

Do wszystkich podpisanych reprezentacji z punktami stałymi używamy komplementu dwójkowego, dlatego w przypadku, gdy wszystkie wartości są wyrażone w jednostkach LSB, obowiązuje następująca zasada:

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

Notacja Q i U

Istnieją różne notacje dla reprezentacji z punktami stałymi w liczbach całkowitych. Używamy notacji Q: Qm.n oznacza m bitów całkowitych i n bitów ułamkowych. „Q” jest liczone jako 1 bit, ale wartość jest wyrażona w komplemencie 2. Łączna liczba bitów to m + n + 1.

Um.n jest przeznaczony do nieujemnych liczb: m bitów całkowitych i n bitów ułamkowych, a „U” oznacza 0 bitów. Łączna liczba bitów to m + n.

Część całkowita może być używana w wyniku końcowym lub może być tymczasowa. W tym drugim przypadku bity, które tworzą część całkowitą, nazywane są bitami ochronnymi. Bity ochrony umożliwiają przepełnienie obliczeń pośrednich, o ile ostateczna wartość mieści się w zakresie lub może zostać ograniczona, aby mieścić się w zakresie. Pamiętaj, że licyta kontrolna liczby stałoprzecinkowej znajduje się po lewej stronie, a cyfry kontrolne liczby zmiennoprzecinkowej służą do zmniejszenia błędu zaokrągleń i znajdują się po prawej stronie.

Reprezentacja zmiennoprzecinkowa

Liczba zmiennoprzecinkowa to alternatywa dla liczby stałoprzecinkowej, w której lokalizacja punktu może się zmieniać. Główne zalety obliczeń zmiennoprzecinkowych:

  • Większy margines i zakres dynamiczny; obliczenia zmiennoprzecinkowe tolerują przekraczanie zakresów nominalnych podczas pośrednich obliczeń, a wartości są ograniczane tylko na końcu.
  • Obsługa wartości specjalnych, takich jak nieskończoność i NaN
  • W wielu przypadkach łatwiejszy w użyciu

Dawniej arytmetyka zmiennoprzecinkowa była wolniejsza niż arytmetyka całkowito- lub stałoprzecinkowa, ale obecnie arytmetyka zmiennoprzecinkowa jest zwykle szybsza, o ile decyzje dotyczące przepływu sterowania nie zależą od wartości obliczeń.

Formaty Androida dla dźwięku

Najpopularniejsze formaty audio na Androida:

Notacja
Właściwość Q0.15 Q0,7 1 Q0.23 Q0.31 float
Kontener
bitów
16 8 24 lub 32 2 32 32
znaczące bity
włącznie ze znakiem
16 8 24 24 lub 32 2 25 3
Headroom
w dB
0 0 0 0 126 4
Zakres dynamiczny
w dB
90 42 138 138–186 900 5

Wszystkie formaty liczby zmiennoprzecinkowej powyżej mają zakres nominalny od -1,0 do +1,0 z wyjątkiem 1 LSB. Ze względu na reprezentację uzupełnienia dwóch liczb jest o jedną wartość ujemną więcej niż dodatnią.

Przypisy:

  1. Wszystkie formaty powyżej wyrażają podpisane wartości przykładowe. Format 8-bitowy jest powszechnie nazywany „bez znaku”, ale w rzeczywistości jest to wartość ze znakiem o błądzie 0.10000000.
  2. Wartość Q0.23 może być zapakowana w 24 bity (3 bajty 8-bitowe, little-endian) lub rozpakowana w 32 bity. Po rozpakowaniu znaczące bity są wyrównane do prawej w kierunku najmniej znaczącego bitu z wypełnieniem znaku w kierunku najbardziej znaczącego bitu (Q8.23) lub wyrównane do lewej w kierunku najbardziej znaczącego bitu z wypełnieniem zerami w kierunku najmniej znaczącego bitu (Q0.31). Teoretycznie Q0.31 umożliwia wykorzystanie do 32 bitów znaczących, ale interfejsy sprzętowe, które obsługują Q0.31, rzadko wykorzystują wszystkie bity.
  3. Liczba zmiennoprzecinkowa o pojedynczej precyzji ma 23 wyraźne bity oraz 1 ukryty bit i bit znaku, co daje w sumie 25 znaczących bitów. Liczby zdenormalizowane mają mniej znaczących bitów.
  4. Typ zmiennoprzecinkowy o pojedynczej precyzji może wyrażać wartości do ±1,7e+38, co tłumaczy duży zapas.
  5. Wyświetlany zakres dynamiczny dotyczy denormalsów do wartości nominalnej ±1,0. Pamiętaj, że niektóre implementacje typu zmiennoprzecinkowego zależne od architektury, takie jak NEON, nie obsługują denormalizacji.

Konwersje

W tej sekcji omawiamy konwersje danych między różnymi reprezentacjami.

Konwersje liczb zmiennoprzecinkowych

Aby przekonwertować wartość z formatu Qm.n na liczbę zmiennoprzecinkową:

  1. Konwertuje wartość na liczbę zmiennoprzecinkową, tak jakby była ona liczbą całkowitą (ignorując kropkę).
  2. Pomnóż przez 2-n.

Aby na przykład przekonwertować wartość wewnętrzną Q4.27 na wartość zmiennoprzecinkową, użyj:

float = integer * (2 ^ -27)

Konwersje z typu zmiennopozycyjnego na stałoprzecinkowy podlegają tym regułom:

  • Liczba zmiennoprzecinkowa o pojedynczej precyzji ma nominalny zakres ±1,0, ale pełny zakres wartości pośrednich to ±1,7e+38. Konwersja między punktem ruchomym a stałym w przypadku reprezentacji zewnętrznej (np. wyjścia na urządzenia audio) będzie uwzględniać tylko zakres nominalny, a wartości wykraczające poza ten zakres będą przycinane. W szczególności, gdy wartość +1.0 jest konwertowana do formatu z punktami stałoprzecinkowymi, jest ona ograniczana do +1.0 z mniejszą o 1 LSB.
  • Wartości nienormalne (poniżej normy) i wartości +/- 0,0 są dozwolone w reprezentacji, ale mogą być automatycznie konwertowane na 0,0 podczas przetwarzania.
  • Wartości nieskończone będą albo przekazywane przez operacje, albo będą dyskretnie ograniczane do +/- 1,0. Druga opcja służy do konwertowania na format stałoprzecinkowy.
  • Zachowanie wartości NaN jest nieokreślone: wartość NaN może być rozpowszechniana jako identyczna wartość NaN, może być konwertowana do domyślnej wartości NaN, może być po cichu ograniczana do +/- 1,0, może być po cichu konwertowana do 0,0 lub może spowodować błąd.

Konwersje o stałym punkcie dziesiętnym

Konwersje między różnymi formatami Qm.n są realizowane zgodnie z tymi regułami:

  • Gdy m jest zwiększane, rozszerza się znakowo część całkowita po lewej stronie.
  • Gdy wartość m jest mniejsza, ograniczaj część całkowitą.
  • Gdy n jest zwiększane, zero rozszerza część ułamkową po prawej stronie.
  • Gdy n jest zmniejszane, należy zastosować dithering, zaokrąglić lub obciąć nadmiarowe cząstkowe bity po prawej stronie.

Aby na przykład przekonwertować wartość Q4.27 na Q0.15 (bez dithera ani zaokrąglenia), przesuń wartość Q4.27 o 12 bitów w prawo i ogranicz wyniki, które przekraczają zakres 16-bitowy ze znakiem. W ten sposób dopasowuje punkt do reprezentacji Q.

Aby przekonwertować Q7.24 na Q7.23, wykonaj dzielenie ze znakiem przez 2, lub równoważnie dodaj bit znaku do liczby całkowitej Q7.24, a następnie przesuń bit ze znakiem w prawo o 1. Pamiętaj, że prosta przesunięcie w prawo z sygnaturą nie jest równoważne z dzieleniem przez 2 z sygnaturą.

Konwersje stratne i bezstratne

Konwersja jest bezstratna, jeśli można ją odwrócić: konwersja z A na B na C daje wynik A = C. W przeciwnym razie konwersja jest nieopłacalna.

Konwersje bez utraty jakości umożliwiają konwersję w obie strony.

Konwersje z reprezentacji z punktami stałymi na 25 bitów lub mniej na reprezentacje z punktami zmiennoprzecinkowymi są bezstratne. Konwersje z typu zmiennopozycyjnego na dowolny typowy typ stałoprzecinkowy są nieodwracalne.