Formaty danych

Android wykorzystuje szeroką gamę dźwięków formaty danych wewnętrznie i udostępnia podzbiór tych interfejsów w publicznych interfejsach API, formaty plików, oraz Sprzętowa warstwa abstrakcji (HAL).

Właściwości

Formaty danych dźwiękowych są klasyfikowane według właściwości:

Kompresja
Nieskompresowany, skompresowane bezstratnie, stratnie skompresowany. PCM to najpopularniejszy nieskompresowany format dźwięku. Plik FLAC jest skompresowany w bezstratnym formacie a MP3 i AAC to formaty skompresowane stratnie.
Głębia bitowa
Liczba istotnych bitów na próbkę audio.
Rozmiar kontenera
Liczba bitów używanych do przechowywania lub przesyłania próbki. Zwykle jest taka sama jak głębia bitowa, ale czasami może być większa bity dopełnienia są przydzielane na potrzeby wyrównywania. Na przykład plik 24-bitowa próbka może być zawarta w 32-bitowym słowie.
Dopasowanie
Jeśli rozmiar kontenera jest dokładnie taki sam jak głębia bitowa, jest nazywany packed. W przeciwnym razie prezentacja jest bez pakietu. Istotne bity próbki są zwykle wyrównana względem lewej (najważniejszej) lub prawej (najmniej istotny) części pojemnika. Konwencjonalne jest stosowanie hasła są spakowane i rozpakowane tylko wtedy, gdy bit głębia to nie potęga dwójki.
Podpisanie
Określa, czy próbki są podpisane czy niepodpisane.
Reprezentacja
może to być liczba zmiennoprzecinkowa lub stała; patrz niżej.

Przedstawienie punktu stałego

Punkt ustalony to najczęstsza reprezentacja nieskompresowanych danych audio PCM. zwłaszcza przy interfejsach sprzętowych.

Numer z ustalonym punktem ma stałą (stałą) liczbę cyfr. przed i za punktem podstawy. Wszystkie nasze oświadczenia używają base 2, więc zamieniamy bit na cyfra, i punkt binarny lub po prostu punkt dla punktu podstawy. Bity po lewej stronie punktu to część całkowita, a bity po prawej stronie punktu to części ułamkowej.

Mówimy o całkowitym PCM, ponieważ stałe wartości punktowe są zwykle przechowywane i manipulowane jako wartości całkowite. Potraktowanie punktu stałego jest niejawne.

Używamy uzupełnienia dwuskładnikowego dla wszystkich reprezentacji podpisanych punktów stałych, więc następujące procesy są spełnione, gdy wszystkie wartości są wyrażone w jednostkach po jednej LSB:

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

Zapis pytań i U

Do wyboru masz różne notacje do reprezentowania stałego punktu w liczbie całkowitej. Używamy notacji Q: Qm.n oznacza m bitów całkowitych i n bitów ułamkowych. Ciąg znaków „Q” liczy się jako jeden bit, ale wartość jest wyrażona w uzupełnieniu dwóch. Łączna liczba bitów to m + n + 1.

Um.n oznacza liczby bez znaku: m liczb całkowitych i n bitów ułamkowych, oraz „U” liczy się jako zero bitów. Łączna liczba bitów to m + n.

Liczba całkowita może być użyta w ostatecznym wyniku lub być tymczasowa. W tym drugim przypadku bity składające się na część całkowitą są nazywane zabezpieczeń. Bity zabezpieczające umożliwiają pośrednie obliczenia o ile wartość końcowa jest w zakresie lub może zostać zmniejszona, aby mieściła się w zakresie. Zwróć uwagę, że bity zabezpieczające stałe są po lewej stronie, a jednostka zmiennoprzecinkowa cyfry zabezpieczające służą do zmniejszenia błędów zaokrąglania i znajdują się po prawej stronie.

Reprezentacja zmiennoprzecinkowa

Liczba zmiennoprzecinkowa stanowi alternatywę dla punktu stałego, w którym jego lokalizacja może się zmieniać. Główne zalety kreacji zmiennoprzecinkowych to:

  • Większe zapasy i zakres dynamiczny; tolerancje zmiennoprzecinkowe arytmetyczne przekraczające zakresy nominalne podczas obliczeń pośrednich i ogranicza tylko wartości na końcu
  • Obsługa specjalnych wartości, takich jak „nieskończoność” i „NaN”
  • Łatwiejsze zastosowanie w wielu przypadkach

Dawniej działanie arytmetyki zmiennoprzecinkowej było wolniejsze niż liczby całkowite lub stałe arytmetyczne. Teraz jednak zmiennoprzecinkowa często jest szybsza, ale decyzje dotyczące przepływu ustawień nie są oparte na wartości obliczeń.

Formaty dźwięku w Androidzie

Główne formaty audio w Androidzie znajdziesz w tabeli:

Zapis
Właściwość S0.15 Q0.7 1 K0.23 S0.31 liczba zmiennoprzecinkowa
Kontener
bitów
16 8 24 lub 322 32 32
Znaczące elementy,
w tym znak
16 8 24 24 lub 322 25 3
Pole manewru
w dB
0 0 0 0 126 4
Zakres dynamiczny
w dB
90 42 138 138–186 900 5

Wszystkie powyższe formaty ze stałą wartością mają nominalny zakres od -1,0 do +1,0 minus jeden LSB. Jest o 1 wartość ujemna więcej niż wartość dodatnia, ponieważ dopełniającej reprezentacji dwójki.

Przypisy:

  1. Wszystkie formaty powyżej zawierają podpisane przykładowe wartości. Format 8-bitowy jest powszechnie nazywany „bez znaku”, ale jest to w rzeczywistości wartość ze znakiem z odchyleniem 0.10000000.
  2. Q0.23 może być spakowany do 24-bitowych (3 bajtów 8-bitowych, little-endian) lub rozpakowany w 32 bitach. Gdy są rozpakowane, istotne bity są odpowiednio wyjustowane w kierunku LSB z dopełnieniem rozszerzenia znaku w kierunku MSB (Q8.23) lub lewe uzasadnienie w stosunku do MSB, przy czym w przypadku LSB definicja nie została wypełniana (Q0.31). Q0.31 teoretycznie dopuszcza do 32 znaczących bitów, ale interfejsy sprzętowe, które akceptują Q0.31, rzadko z nich korzystają.
  3. Zmiennoprzecinkowy o pojedynczej precyzji składa się z 23 jednoznacznych bitów oraz 1 ukrytego bitu i bitu znaku. co daje łącznie 25 znaczących bitów. Nietypowe liczby mają mniej istotnych bitów.
  4. Zmiennoprzecinkowy o pojedynczej precyzji może podawać wartości do ±1,7e+38, co pokazuje, ile masz możliwości działania.
  5. Wyświetlany zakres dynamiczny dotyczy defektów nieprzekraczających nominalnej wartości maksymalnej wartość ±1,0. Zwróć uwagę, że niektóre implementacje zmiennoprzecinkowe zależne od architektury, takie jak NEON nie obsługują anomalii.

Konwersje

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

Konwersje zmiennoprzecinkowe

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

  1. Przekształć wartość w zmiennoprzecinkową w taki sposób, jakby była liczbą całkowitą (przez zignorowanie punktu).
  2. Pomnóż przez 2n.

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

float = integer * (2 ^ -27)

Konwersje ze zmiennoprzecinkowego do punktu stałego podlegają tym regułom:

  • Zmiennoprzecinkowa o pojedynczej precyzji ma nominalny zakres ±1,0. ale pełny zakres dla wartości pośrednich to ±1,7e+38. Konwersja między zmiennoprzecinkową i stałą reprezentacją zewnętrzną (np. wyjście na urządzenia audio) będzie uwzględniało tylko zakres nominalny, ograniczania zakresu dla wartości, które przekraczają ten zakres. Zwłaszcza, gdy następuje konwersja +1.0 do formatu z określonymi wartościami punktowymi jest ograniczany do poziomu +1, 0 minus 1 LSB.
  • Dozwolone są denormalizacje (podnormalne) i +/- 0,0. ale może zostać dyskretnie skonwertowana na 0,0 podczas przetwarzania.
  • Nieskończoność przechodzi przez operacje lub zostanie dyskretnie ograniczona do +/-1,0. Zasadniczo ten drugi sposób służy do konwersji na format z określonymi punktami.
  • Zachowanie NaN jest niezdefiniowane: NaN może być propagowane jako identyczna NaN lub może skonwertowane na domyślną NaN, może zostać dyskretnie ograniczone do +/- 1, 0 lub dyskretnie skonwertowano na 0, 0 lub spowoduje błąd.

Konwersje z punktami stałymi

Konwersje między różnymi formatami kwartałów podlegają tym regułom:

  • Gdy zwiększasz m, znak wydłuża część całkowitą po lewej stronie.
  • Gdy m zostaje zmniejszony, ogranicz część całkowitą.
  • Gdy zwiększa się wartość n, część ułamkowa nie jest rozszerzana w prawo.
  • Gdy zmniejszono n, możesz użyć ditheringu, zaokrąglenia lub obcięcia nadmiarowych bitów ułamkowych po prawej stronie.

Aby na przykład przekonwertować wartość Q4,27 na Q0,15 (bez ditheringu lub zaokrąglenie), przesuń wartość Q4.27 w prawo o 12 bitów i ogranicz wyniki przekraczające 16-bitowy zakres ze znakiem. Powoduje to wyrównanie punktu Reprezentacja Q.

Aby przeliczyć pytanie 7.24 na pytanie 7.23, podziel ze znakiem 2 przez 2, lub równoważnie dodaj bit znaku do liczby całkowitej Q7.24, a następnie przesunięcie w prawo ze znakiem 1. Pamiętaj, że proste przesunięcie w prawo ze znakiem nie jest równoważne ze znakiem dzielenia przez 2.

Stratne i bezstratne konwersje

Konwersja jest bezstratna, jeśli jest odwracalne: konwersja z A na B na C wyników w: A = C. W przeciwnym razie konwersja jest stratna.

Zezwolenie na konwersje bezstratne w obie strony.

Konwersje z reprezentacji punktu stałego o maks. 25 ważnych bitach na liczbę zmiennoprzecinkową są bezstratne. Konwersje ze zmiennoprzecinkowego na dowolną wspólną reprezentację punktu stałego są stratne.