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ów i warstwie 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:
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:
-
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
. - 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.
- 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.
- Typ zmiennoprzecinkowy o pojedynczej precyzji może wyrażać wartości do ±1,7e+38, co tłumaczy duży zapas.
- 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ą:
- Konwertuje wartość na liczbę zmiennoprzecinkową, tak jakby była ona liczbą całkowitą (ignorując kropkę).
- 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.