System Android używa wewnętrznie wielu różnych formatów danych audio i udostępnia ich podzbiór w publicznych interfejsach API, formatach plików i warstwie abstrakcji sprzętu (HAL).
Nieruchomości
Formaty danych audio są klasyfikowane według ich właściwości:
- Kompresja
- Nieskompresowany , skompresowany bezstratnie lub skompresowany stratnie . PCM to najpopularniejszy nieskompresowany format audio. FLAC to bezstratny format skompresowany, podczas gdy MP3 i AAC to formaty z kompresją stratną.
- Głębokość bitowa
- Liczba znaczących bitów na próbkę audio.
- Rozmiar pojemnika
- Liczba bitów używanych do przechowywania lub przesyłania próbki. Zwykle jest to to samo co głębia bitowa, ale czasami do wyrównania przydzielane są dodatkowe bity dopełniające. 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łębokości bitowej, reprezentacja nazywana jest pakietem . W przeciwnym razie reprezentacja jest rozpakowana . Znaczne bity próbki są zwykle wyrównywane z skrajnym lewym (najbardziej znaczącym) lub skrajnie prawym (najmniej znaczącym) bitem pojemnika. Konwencjonalnie używa się terminów spakowany i rozpakowany tylko wtedy, gdy głębia bitowa nie jest potęgą dwójki .
- Podpisanie
- Czy próbki są podpisane czy niepodpisane.
- Reprezentacja
- Stały punkt lub zmiennoprzecinkowy punkt; patrz poniżej.
Reprezentacja punktu stałego
Punkt stały jest najczęstszą reprezentacją nieskompresowanych danych audio PCM, zwłaszcza na interfejsach sprzętowych.
Liczba stałoprzecinkowa ma stałą (stałą) liczbę cyfr przed i za punktem podstawy . Wszystkie nasze reprezentacje używają podstawy 2 , więc podstawiamy bit za cyfrę , a punkt binarny lub po prostu punkt za radix punkt . Bity na lewo od punktu to część całkowita, a bity na prawo od punktu to część ułamkowa .
Mówimy o całkowitym PCM , ponieważ wartości stałoprzecinkowe są zwykle przechowywane i manipulowane jako wartości całkowite. Interpretacja jako punkt stały jest dorozumiana.
Używamy uzupełnienia do dwójki dla wszystkich podpisanych reprezentacji stałoprzecinkowych, więc następujące trzyma się, gdy wszystkie wartości są w jednostkach jednego LSB :
|largest negative value| = |largest positive value| + 1
Notacja Q i U
Istnieją różne notacje do reprezentacji stałoprzecinkowej w liczbie całkowitej. Używamy notacji Q : Q m . n oznacza m bitów całkowitych i n bitów ułamkowych. „Q” liczy się jako jeden bit, chociaż wartość jest wyrażona w uzupełnieniu do dwóch. Całkowita liczba bitów to m + n + 1.
U m . n oznacza liczby bez znaku: m bitów całkowitych i n bitów ułamkowych, a „U” liczy się jako bity zerowe. Całkowita liczba bitów to m + n .
Część całkowita może być użyta w wyniku końcowym lub być tymczasowa. W tym drugim przypadku bity tworzące część całkowitą są nazywane bitami ochronnymi . Bity zabezpieczające umożliwiają przepełnienie obliczeń pośrednich, o ile wartość końcowa mieści się w zakresie lub można ją ograniczyć do zakresu. Należy zauważyć, że bity ochronne stałoprzecinkowe znajdują się po lewej stronie, podczas gdy cyfry ochronne jednostek zmiennoprzecinkowych są używane w celu zmniejszenia błędu zaokrąglenia i znajdują się po prawej stronie.
Reprezentacja zmiennoprzecinkowa
Punkt zmiennoprzecinkowy jest alternatywą dla punktu stałego, w którym położenie punktu może się różnić. Podstawowe zalety zmiennoprzecinkowe to:
- Większy zapas i zakres dynamiki ; arytmetyka zmiennoprzecinkowa toleruje przekroczenie zakresów nominalnych podczas obliczeń pośrednich, a tylko wartości cęgów na końcu
- Obsługa specjalnych wartości, takich jak nieskończoności i NaN
- W wielu przypadkach łatwiejszy w użyciu
Historycznie arytmetyka zmiennoprzecinkowa była wolniejsza niż arytmetyka liczb całkowitych lub stałoprzecinkowych, ale obecnie często zdarza się, że arytmetyka zmiennoprzecinkowa jest szybsza, pod warunkiem, że decyzje dotyczące przepływu sterowania nie są oparte na wartości obliczeń.
Formaty Androida dla dźwięku
W poniższej tabeli wymieniono główne formaty dźwięku w Androidzie:
Nieruchomość | Q0.15 | Q0.7 1 | Q0.23 | Q0.31 | platforma | |
---|---|---|---|---|---|---|
Pojemnik bity | 16 | 8 | 24 lub 32 2 | 32 | 32 | |
Znaczące bity w tym znak | 16 | 8 | 24 | 24 lub 32 2 | 25 3 | |
Przestrzeń w dB | 0 | 0 | 0 | 0 | 126 4 | |
Zakres dynamiczny w dB | 90 | 42 | 138 | 138 do 186 | 900 5 |
Wszystkie powyższe formaty stałoprzecinkowe mają nominalny zakres od -1,0 do +1,0 minus jeden LSB. Istnieje jeszcze jedna wartość ujemna niż wartość dodatnia ze względu na reprezentację uzupełnienia do dwóch.
Przypisy:
- Wszystkie powyższe formaty wyrażają podpisane wartości przykładowe. Format 8-bitowy jest powszechnie nazywany „bez znaku”, ale w rzeczywistości jest to wartość ze znakiem z odchyleniem
0.10000000
. - Q0.23 może być spakowany w 24 bity (trzy 8-bitowe bajty, little-endian) lub rozpakowany w 32 bity. Jeśli rozpakowane, znaczące bity są albo wyjustowane do prawej strony w kierunku LSB z dopełnieniem rozszerzenia znaku w kierunku MSB (Q8.23), albo wyrównane do lewej w kierunku MSB z wypełnieniem zerowym w kierunku LSB (Q0.31). Q0.31 teoretycznie dopuszcza do 32 znaczących bitów, ale interfejsy sprzętowe akceptujące Q0.31 rzadko używają wszystkich bitów.
- Liczba zmiennoprzecinkowa o pojedynczej precyzji ma 23 jawne bity plus jeden ukryty bit i bit znaku, co daje łącznie 25 znaczących bitów. Liczby nienormalne mają mniej znaczących bitów.
- Liczba zmiennoprzecinkowa o pojedynczej precyzji może wyrażać wartości do ±1,7e+38, co wyjaśnia duży zapas.
- Pokazany zakres dynamiczny dotyczy odkształceń do maksymalnej wartości nominalnej ±1,0. Zauważ, że niektóre implementacje zmiennoprzecinkowe specyficzne dla architektury, takie jak NEON , nie obsługują denormalizacji.
Konwersje
W tej sekcji omówiono konwersje danych między różnymi reprezentacjami.
Konwersje zmiennoprzecinkowe
Aby przekonwertować wartość z Q m . n format na zmiennoprzecinkowy:
- Konwertuj wartość na zmiennoprzecinkową tak, jakby była liczbą całkowitą (pomijając punkt).
- Pomnóż przez 2 - n .
Na przykład, aby przekonwertować wewnętrzną wartość Q4.27 na zmiennoprzecinkową, użyj:
float = integer * (2 ^ -27)
Konwersje z liczby zmiennoprzecinkowej na stały punkt są zgodne z następującymi zasadami:
- Wartość zmiennoprzecinkowa pojedynczej precyzji ma nominalny zakres ±1,0, ale pełny zakres dla wartości pośrednich wynosi ±1,7e+38. Konwersja między wartościami zmiennoprzecinkowymi i stałymi dla reprezentacji zewnętrznej (takiej jak wyjście do urządzeń audio) będzie uwzględniać tylko zakres nominalny, z tłumieniem dla wartości przekraczających ten zakres. W szczególności, gdy +1,0 jest konwertowane na format stałoprzecinkowy, jest ograniczane do +1,0 minus jeden LSB.
- Denormals (subnormalne) i oba +/-0,0 są dozwolone w reprezentacji, ale mogą zostać po cichu przekonwertowane na 0,0 podczas przetwarzania.
- Nieskończoności albo będą przechodzić przez operacje, albo zostaną po cichu ograniczone do +/- 1,0. Generalnie ten ostatni służy do konwersji do formatu stałoprzecinkowego.
- Zachowanie NaN jest niezdefiniowane: NaN może propagować się jako identyczny NaN lub może zostać przekonwertowany na Domyślny NaN, może być dyskretnie ograniczony do +/- 1,0 lub dyskretnie przekonwertowany na 0,0 lub spowodować błąd.
Konwersje punktów stałych
Konwersje między różnymi Q m . n formaty są zgodne z następującymi zasadami:
- Gdy m jest zwiększone, znak przedłużyć część całkowitą po lewej stronie.
- Gdy m jest zmniejszane, zaciśnij część całkowitą.
- Gdy n jest zwiększone, zero wydłuża część ułamkową po prawej stronie.
- Gdy n jest zmniejszone, albo roztrząsaj, zaokrąglaj lub obcinaj nadmiarowe bity ułamkowe po prawej stronie.
Na przykład, aby przekonwertować wartość Q4.27 na Q0.15 (bez roztrząsania i zaokrąglania), przesuń w prawo wartość Q4.27 o 12 bitów i zablokuj wszystkie wyniki, które przekraczają 16-bitowy zakres ze znakiem. To wyrównuje punkt 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 przesunięcie w prawo ze znakiem o 1. Zauważ, że proste przesunięcie w prawo ze znakiem nie jest równoważne podpisany dzielenie przez 2.
Konwersje stratne i bezstratne
Konwersja jest bezstratna , jeśli jest odwracalna : konwersja z A
do B
na C
daje wynik A = C
W przeciwnym razie konwersja jest stratna .
Konwersje bezstratne umożliwiają konwersję formatu w obie strony .
Konwersje z reprezentacji stałoprzecinkowej z 25 lub mniej znaczącymi bitami na zmiennoprzecinkowe są bezstratne. Konwersje z zmiennoprzecinkowych na dowolną wspólną reprezentację stałoprzecinkową są stratne.