Formaty danych

Android korzysta wewnętrznie z szerokiej gamy 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 format skompresowany bezstratnie, natomiast MP3 i AAC to formaty skompresowane stratnie.
Głębia 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łębokość bitowa, ale czasami w celu wyrównania przydzielane są dodatkowe bity dopełniające. Na przykład 24-bitowa próbka może być zawarta w 32-bitowym słowie.
Wyrównanie
Jeśli rozmiar kontenera jest dokładnie równy głębokości bitowej, reprezentację nazywa się spakowaną . W przeciwnym razie reprezentacja zostanie rozpakowana . Znaczące bity próbki są zazwyczaj wyrównane z skrajnym lewym (najbardziej znaczącym) lub skrajnym prawym (najmniej znaczącym) bitem kontenera. Konwencjonalne jest używanie terminów spakowany i rozpakowany tylko wtedy, gdy głębia bitowa nie jest potęgą dwójki .
Podpis
Określa, czy próbki są podpisane czy niepodpisane.
Reprezentacja
Albo stały punkt, albo zmiennoprzecinkowy; patrz poniżej.

Reprezentacja punktu stałego

Punkt stały jest najczęstszą reprezentacją nieskompresowanych danych audio PCM, szczególnie w interfejsach sprzętowych.

Liczba stałoprzecinkowa ma stałą (stałą) liczbę cyfr przed i po punkcie podstawy . Wszystkie nasze reprezentacje używają podstawy 2 , więc zastępujemy bit cyfrą i punkt binarny lub po prostu punkt zamiast punktu podstawy . Bity po lewej stronie kropki to część całkowita, a bity po prawej stronie kropki 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 reprezentacji stałoprzecinkowych ze znakiem, więc gdy wszystkie wartości są wyrażone w jednostkach jednego LSB , obowiązuje następujący zapis:

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

Notacja Q i U

Istnieją różne oznaczenia 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 wynosi m + n + 1.

Um . 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 wynosi m + n .

Część całkowita może zostać wykorzystana w wyniku końcowym lub mieć charakter tymczasowy. W tym drugim przypadku bity tworzące część całkowitą nazywane są bitami ochronnymi . Bity ochronne pozwalają na przekroczenie obliczeń pośrednich, o ile wartość końcowa mieści się w zakresie lub można ją zacisnąć tak, aby mieściła się w zakresie. Należy zauważyć, że bity zabezpieczające o stałym przecinku znajdują się po lewej stronie, podczas gdy cyfry zabezpieczające jednostki zmiennoprzecinkowej służą do 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ę zmieniać. Do głównych zalet zmiennoprzecinkowych należą:

  • Większy zapas mocy i zakres dynamiki ; arytmetyka zmiennoprzecinkowa toleruje przekraczanie zakresów nominalnych podczas obliczeń pośrednich i ogranicza wartości tylko na końcu
  • Obsługa wartości specjalnych, takich jak nieskończoności i NaN
  • W wielu przypadkach łatwiejszy w użyciu

Historycznie rzecz biorąc, 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 obliczenia.

Formaty audio dla Androida

W poniższej tabeli wymieniono główne formaty audio systemu Android:

Notacja
Nieruchomość Q0.15 Q0.7 1 Pytanie 0.23 Q0.31 platforma
Pojemnik
bity
16 8 24 lub 32 2 32 32
Znaczące bity
łącznie ze znakiem
16 8 24 24 lub 32 2 25 3
Nad głową
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ą zakres nominalny od -1,0 do +1,0 minus jeden LSB. Istnieje o jedną wartość ujemną więcej niż wartość dodatnia ze względu na reprezentację uzupełnienia do dwóch.

Przypisy:

  1. Wszystkie powyższe formaty wyrażają podpisane wartości próbek. Format 8-bitowy jest powszechnie nazywany „bez znaku”, ale w rzeczywistości jest to wartość ze znakiem z odchyleniem 0.10000000 .
  2. Q0.23 można spakować do 24 bitów (trzy 8-bitowe bajty, small-endian) lub rozpakować do 32 bitów. Jeśli są rozpakowane, bity znaczące są albo wyrównywane w prawo w kierunku LSB z rozszerzeniem znaku w kierunku MSB (Q8.23), albo wyrównywane w lewo w kierunku MSB z zerowym wypełnieniem w kierunku LSB (Q0.31). Q0.31 teoretycznie dopuszcza do 32 znaczących bitów, ale interfejsy sprzętowe akceptujące Q0.31 rzadko wykorzystują wszystkie bity.
  3. Liczba zmiennoprzecinkowa o pojedynczej precyzji ma 23 bity jawne plus jeden bit ukryty i bit znaku, co daje łącznie 25 bitów znaczących. Liczby nietypowe mają mniej bitów znaczących.
  4. Liczba zmiennoprzecinkowa o pojedynczej precyzji może wyrażać wartości do ±1,7e+38, co wyjaśnia duży zapas mocy.
  5. Przedstawiony zakres dynamiczny dotyczy wartości denormalnych do maksymalnej wartości nominalnej ±1,0. Należy zauważyć, że niektóre implementacje zmiennoprzecinkowe specyficzne dla architektury, takie jak NEON, nie obsługują denormalów.

Konwersje

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

Konwersje zmiennoprzecinkowe

Aby przekonwertować wartość z Q m . n format na zmiennoprzecinkowy:

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

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

float = integer * (2 ^ -27)

Konwersje ze zmiennoprzecinkowego na stałoprzecinkowe przebiegają według następujących zasad:

  • Wartość zmiennoprzecinkowa pojedynczej precyzji ma zakres nominalny ±1,0, ale pełny zakres wartości pośrednich wynosi ±1,7e+38. Konwersja między zmiennoprzecinkowym a stałym przecinkiem na potrzeby reprezentacji zewnętrznej (takiej jak wyjście do urządzeń audio) będzie uwzględniać tylko zakres nominalny, z zaciskaniem dla wartości przekraczających ten zakres. W szczególności, gdy +1,0 jest konwertowane do formatu stałoprzecinkowego, jest ono ograniczane do +1,0 minus jeden LSB.
  • Wartości denormalne (podnormalne) i obie wartości +/- 0,0 są dozwolone w reprezentacji, ale można je po cichu przekonwertować na 0,0 podczas przetwarzania.
  • Nieskończoności albo będą przechodzić przez operacje, albo będą dyskretnie ograniczone do +/- 1,0. Generalnie ten ostatni służy do konwersji do formatu stałoprzecinkowego.
  • Zachowanie NaN jest niezdefiniowane: NaN może rozprzestrzeniać się jako identyczna NaN lub może zostać przekonwertowana na domyślną NaN, może być dyskretnie na stałe ograniczona do +/- 1,0 lub dyskretnie przekonwertowana na 0,0 lub spowodować błąd.

Konwersje o stałym punkcie

Konwersje pomiędzy różnymi Q m . n formatów podlega następującym regułom:

  • Gdy m zostanie zwiększone, znak przedłuży część całkowitą po lewej stronie.
  • Kiedy m jest zmniejszane, zaciśnij część całkowitą.
  • Kiedy n wzrasta, zero wydłuża część ułamkową po prawej stronie.
  • Gdy n zostanie zmniejszone, wykonaj diter, zaokrąglij lub odetnij nadmiar bitów ułamkowych po prawej stronie.

Na przykład, aby przekonwertować wartość Q4.27 na Q0.15 (bez ditheringu i zaokrąglania), przesuń wartość Q4.27 w prawo o 12 bitów i zablokuj wszystkie wyniki przekraczające 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 przesuń w prawo ze znakiem o 1. Zauważ, że proste przesunięcie w prawo ze znakiem nie jest równoważne dzielenie ze znakiem przez 2.

Konwersje stratne i bezstratne

Konwersja jest bezstratna , jeśli jest odwracalna : konwersja z A na B na C skutkuje A = C W przeciwnym razie konwersja jest stratna .

Konwersje bezstratne umożliwiają konwersję formatu w obie strony .

Konwersje z reprezentacji stałoprzecinkowej zawierającej 25 lub mniej bitów znaczących na reprezentację zmiennoprzecinkową są bezstratne. Konwersje z postaci zmiennoprzecinkowej na dowolną wspólną reprezentację stałoprzecinkową są stratne.

,

Android korzysta wewnętrznie z szerokiej gamy 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 format skompresowany bezstratnie, natomiast MP3 i AAC to formaty skompresowane stratnie.
Głębia 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łębokość bitowa, ale czasami w celu wyrównania przydzielane są dodatkowe bity dopełniające. Na przykład 24-bitowa próbka może być zawarta w 32-bitowym słowie.
Wyrównanie
Jeśli rozmiar kontenera jest dokładnie równy głębokości bitowej, reprezentację nazywa się spakowaną . W przeciwnym razie reprezentacja zostanie rozpakowana . Znaczące bity próbki są zazwyczaj wyrównane z skrajnym lewym (najbardziej znaczącym) lub skrajnym prawym (najmniej znaczącym) bitem kontenera. Konwencjonalne jest używanie terminów spakowany i rozpakowany tylko wtedy, gdy głębia bitowa nie jest potęgą dwójki .
Podpis
Określa, czy próbki są podpisane czy niepodpisane.
Reprezentacja
Albo stały punkt, albo zmiennoprzecinkowy; patrz poniżej.

Reprezentacja punktu stałego

Punkt stały jest najczęstszą reprezentacją nieskompresowanych danych audio PCM, szczególnie w interfejsach sprzętowych.

Liczba stałoprzecinkowa ma stałą (stałą) liczbę cyfr przed i po punkcie podstawy . Wszystkie nasze reprezentacje używają podstawy 2 , więc zastępujemy bit cyfrą i punkt binarny lub po prostu punkt zamiast punktu podstawy . Bity po lewej stronie kropki to część całkowita, a bity po prawej stronie kropki 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 reprezentacji stałoprzecinkowych ze znakiem, więc gdy wszystkie wartości są wyrażone w jednostkach jednego LSB , obowiązuje następujący zapis:

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

Notacja Q i U

Istnieją różne oznaczenia 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 wynosi m + n + 1.

Um . 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 wynosi m + n .

Część całkowita może zostać wykorzystana w wyniku końcowym lub mieć charakter tymczasowy. W tym drugim przypadku bity tworzące część całkowitą nazywane są bitami ochronnymi . Bity ochronne pozwalają na przekroczenie obliczeń pośrednich, o ile wartość końcowa mieści się w zakresie lub można ją zacisnąć tak, aby mieściła się w zakresie. Należy zauważyć, że bity zabezpieczające o stałym przecinku znajdują się po lewej stronie, podczas gdy cyfry zabezpieczające jednostki zmiennoprzecinkowej służą do 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ę zmieniać. Do głównych zalet zmiennoprzecinkowych należą:

  • Większy zapas mocy i zakres dynamiki ; arytmetyka zmiennoprzecinkowa toleruje przekraczanie zakresów nominalnych podczas obliczeń pośrednich i ogranicza wartości tylko na końcu
  • Obsługa wartości specjalnych, takich jak nieskończoności i NaN
  • W wielu przypadkach łatwiejszy w użyciu

Historycznie rzecz biorąc, 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 obliczenia.

Formaty audio dla Androida

W poniższej tabeli wymieniono główne formaty audio systemu Android:

Notacja
Nieruchomość Q0.15 Q0.7 1 Pytanie 0.23 Q0.31 platforma
Pojemnik
bity
16 8 24 lub 32 2 32 32
Znaczące bity
łącznie ze znakiem
16 8 24 24 lub 32 2 25 3
Nad głową
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ą zakres nominalny od -1,0 do +1,0 minus jeden LSB. Istnieje o jedną wartość ujemną więcej niż wartość dodatnia ze względu na reprezentację uzupełnienia do dwóch.

Przypisy:

  1. Wszystkie powyższe formaty wyrażają podpisane wartości próbek. Format 8-bitowy jest powszechnie nazywany „bez znaku”, ale w rzeczywistości jest to wartość ze znakiem z odchyleniem 0.10000000 .
  2. Q0.23 można spakować do 24 bitów (trzy 8-bitowe bajty, small-endian) lub rozpakować do 32 bitów. Jeśli są rozpakowane, bity znaczące są albo wyrównywane w prawo w kierunku LSB z rozszerzeniem znaku w kierunku MSB (Q8.23), albo wyrównywane w lewo w kierunku MSB z zerowym wypełnieniem w kierunku LSB (Q0.31). Q0.31 teoretycznie dopuszcza do 32 znaczących bitów, ale interfejsy sprzętowe akceptujące Q0.31 rzadko wykorzystują wszystkie bity.
  3. Liczba zmiennoprzecinkowa o pojedynczej precyzji ma 23 bity jawne plus jeden bit ukryty i bit znaku, co daje łącznie 25 bitów znaczących. Liczby nietypowe mają mniej bitów znaczących.
  4. Liczba zmiennoprzecinkowa o pojedynczej precyzji może wyrażać wartości do ±1,7e+38, co wyjaśnia duży zapas mocy.
  5. Przedstawiony zakres dynamiczny dotyczy wartości denormalnych do maksymalnej wartości nominalnej ±1,0. Należy zauważyć, że niektóre implementacje zmiennoprzecinkowe specyficzne dla architektury, takie jak NEON, nie obsługują denormalów.

Konwersje

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

Konwersje zmiennoprzecinkowe

Aby przekonwertować wartość z Q m . n format na zmiennoprzecinkowy:

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

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

float = integer * (2 ^ -27)

Konwersje ze zmiennoprzecinkowego na stałoprzecinkowe przebiegają według następujących zasad:

  • Wartość zmiennoprzecinkowa pojedynczej precyzji ma zakres nominalny ±1,0, ale pełny zakres wartości pośrednich wynosi ±1,7e+38. Konwersja między zmiennoprzecinkowym a stałym przecinkiem na potrzeby reprezentacji zewnętrznej (takiej jak wyjście do urządzeń audio) będzie uwzględniać tylko zakres nominalny, z zaciskaniem dla wartości przekraczających ten zakres. W szczególności, gdy +1,0 jest konwertowane do formatu stałoprzecinkowego, jest ono ograniczane do +1,0 minus jeden LSB.
  • Wartości denormalne (podnormalne) i obie wartości +/- 0,0 są dozwolone w reprezentacji, ale można je po cichu przekonwertować na 0,0 podczas przetwarzania.
  • Nieskończoności albo będą przechodzić przez operacje, albo będą dyskretnie ograniczone do +/- 1,0. Generalnie ten ostatni służy do konwersji do formatu stałoprzecinkowego.
  • Zachowanie NaN jest niezdefiniowane: NaN może rozprzestrzeniać się jako identyczna NaN lub może zostać przekonwertowana na domyślną NaN, może być dyskretnie na stałe ograniczona do +/- 1,0 lub dyskretnie przekonwertowana na 0,0 lub spowodować błąd.

Konwersje o stałym punkcie

Konwersje pomiędzy różnymi Q m . n formatów podlega następującym regułom:

  • Gdy m zostanie zwiększone, znak przedłuży część całkowitą po lewej stronie.
  • Kiedy m jest zmniejszane, zaciśnij część całkowitą.
  • Kiedy n wzrasta, zero wydłuża część ułamkową po prawej stronie.
  • Gdy n zostanie zmniejszone, wykonaj diter, zaokrąglij lub odetnij nadmiar bitów ułamkowych po prawej stronie.

Na przykład, aby przekonwertować wartość Q4.27 na Q0.15 (bez ditheringu i zaokrąglania), przesuń wartość Q4.27 w prawo o 12 bitów i zablokuj wszystkie wyniki przekraczające 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 przesuń w prawo ze znakiem o 1. Zauważ, że proste przesunięcie w prawo ze znakiem nie jest równoważne dzielenie ze znakiem przez 2.

Konwersje stratne i bezstratne

Konwersja jest bezstratna , jeśli jest odwracalna : konwersja z A na B na C skutkuje A = C W przeciwnym razie konwersja jest stratna .

Konwersje bezstratne umożliwiają konwersję formatu w obie strony .

Konwersje z reprezentacji stałoprzecinkowej zawierającej 25 lub mniej bitów znaczących na reprezentację zmiennoprzecinkową są bezstratne. Konwersje z postaci zmiennoprzecinkowej na dowolną wspólną reprezentację stałoprzecinkową są stratne.