Форматы данных

Android использует множество форматов аудиоданных для внутреннего использования и предоставляет часть из них в общедоступных API, форматах файлов и уровне аппаратной абстракции (HAL).

Характеристики

Форматы аудиоданных классифицируются по их свойствам:

Сжатие
Несжатый , сжатый без потерь или сжатый с потерями . PCM является наиболее распространенным несжатым аудиоформатом. FLAC — это формат со сжатием без потерь, а MP3 и AAC — форматы со сжатием с потерями.
Битовая глубина
Количество значащих битов на аудиовыборку.
Размер контейнера
Количество битов, используемых для хранения или передачи выборки. Обычно это то же самое, что и битовая глубина, но иногда для выравнивания выделяются дополнительные биты заполнения. Например, 24-битная выборка может содержаться в 32-битном слове.
Выравнивание
Если размер контейнера точно равен разрядности, представление называется упакованным . В противном случае представление распаковывается . Значимые биты выборки обычно выравниваются либо с крайним левым (наиболее значащим), либо с самым правым (наименее значащим) битом контейнера. Термины « упакованный » и « распакованный » принято использовать только тогда, когда битовая глубина не является степенью двойки .
Подпись
Являются ли образцы подписанными или неподписанными.
Представление
Либо с фиксированной точкой, либо с плавающей запятой; Смотри ниже.

Представление с фиксированной точкой

Фиксированная точка является наиболее распространенным представлением несжатых аудиоданных PCM, особенно в аппаратных интерфейсах.

Число с фиксированной запятой имеет фиксированное (постоянное) количество цифр до и после точки счисления . Все наши представления используют основание 2 , поэтому мы заменяем бит на цифру и двоичную точку или просто точку на точку счисления . Биты слева от точки — это целая часть, а биты справа от точки — дробная часть .

Мы говорим о целочисленном PCM , потому что значения с фиксированной точкой обычно хранятся и обрабатываются как целые значения. Интерпретация как фиксированная точка является неявной.

Мы используем дополнение до двух для всех представлений с фиксированной точкой со знаком, поэтому справедливо следующее, когда все значения указаны в единицах одного младшего разряда :

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

Обозначение Q и U

Существуют различные обозначения для представления фиксированной точки в целом числе. Мы используем обозначение Q: Q m . n означает m целых битов и n дробных битов. «Q» считается одним битом, хотя значение выражается в дополнении до двух. Общее количество бит равно m + n + 1.

У м . n для чисел без знака: m целых битов и n дробных битов, а «U» считается нулевыми битами. Общее количество бит равно m + n .

Целая часть может использоваться в конечном результате или быть временной. В последнем случае биты, составляющие целую часть, называются охранными битами . Защитные биты допускают переполнение промежуточных вычислений, пока конечное значение находится в пределах диапазона или может быть зафиксировано, чтобы находиться в пределах диапазона. Обратите внимание, что защитные биты с фиксированной запятой находятся слева, а защитные разряды единиц с плавающей запятой используются для уменьшения ошибки округления и находятся справа.

Представление с плавающей запятой

Плавающая точка — это альтернатива фиксированной точке, в которой положение точки может варьироваться. К основным преимуществам операций с плавающей запятой относятся:

  • Большой запас мощности и динамический диапазон ; арифметика с плавающей запятой допускает превышение номинальных диапазонов во время промежуточных вычислений и фиксирует значения только в конце
  • Поддержка специальных значений, таких как бесконечности и NaN
  • Легче использовать во многих случаях

Исторически арифметика с плавающей запятой была медленнее, чем арифметика с целыми числами или с фиксированной запятой, но теперь обычно операции с плавающей запятой выполняются быстрее, при условии, что решения потока управления не основаны на значении вычислений.

Форматы Android для аудио

Основные форматы Android для аудио перечислены в таблице ниже:

Обозначение
Имущество Q0.15 Q0.7 1 Q0.23 Q0.31 плавать
Контейнер
биты
16 8 24 или 32 2 32 32
Значимые биты
включая знак
16 8 24 24 или 32 2 25 3
Высота
в дБ
0 0 0 0 126 4
Динамический диапазон
в дБ
90 42 138 от 138 до 186 900 5

Все вышеперечисленные форматы с фиксированной точкой имеют номинальный диапазон от -1,0 до +1,0 минус один младший бит. Из-за представления дополнения до двух отрицательное значение больше, чем положительное.

Сноски:

  1. Все вышеперечисленные форматы выражают примерные значения со знаком. 8-битный формат обычно называют «беззнаковым», но на самом деле это значение со знаком со смещением 0.10000000 .
  2. Q0.23 может быть упакован в 24 бита (три 8-битных байта, обратный порядок байтов) или распакован в 32 бита. В распакованном виде значащие биты выравниваются либо по правому краю по направлению к младшему биту с дополнением знака по направлению к старшему биту (Q8.23), либо по левому краю по направлению к старшему биту с заполнением нулями по направлению к младшему биту (Q0.31). Теоретически Q0.31 допускает до 32 значащих битов, но аппаратные интерфейсы, которые принимают Q0.31, редко используют все биты.
  3. Плавающая запятая одинарной точности имеет 23 явных бита плюс один скрытый бит и знаковый бит, в результате чего всего 25 значащих битов. Денормализованные числа имеют меньше значащих битов.
  4. Плавающая запятая одинарной точности может выражать значения до ±1,7e+38, что объясняет большой запас.
  5. Показанный динамический диапазон относится к денормалям до номинального максимального значения ±1,0. Обратите внимание, что некоторые реализации с плавающей запятой для конкретной архитектуры, такие как NEON , не поддерживают денормализацию.

Конверсии

В этом разделе обсуждаются преобразования данных между различными представлениями.

Преобразования с плавающей запятой

Чтобы преобразовать значение из Q m . n формат с плавающей запятой:

  1. Преобразуйте значение в число с плавающей запятой, как если бы оно было целым числом (игнорируя точку).
  2. Умножить на 2- n .

Например, чтобы преобразовать внутреннее значение Q4.27 в число с плавающей запятой, используйте:

float = integer * (2 ^ -27)

Преобразования с плавающей запятой в фиксированную выполняются по следующим правилам:

  • Плавающая запятая одинарной точности имеет номинальный диапазон ±1,0, но полный диапазон для промежуточных значений составляет ±1,7e+38. Преобразование между плавающей запятой и фиксированной запятой для внешнего представления (например, вывода на аудиоустройства) будет учитывать только номинальный диапазон с ограничением значений, превышающих этот диапазон. В частности, когда +1,0 преобразуется в формат с фиксированной запятой, он фиксируется до +1,0 минус один младший бит.
  • Денормали (субнормальы) и оба +/- 0,0 допускаются в представлении, но могут быть автоматически преобразованы в 0,0 во время обработки.
  • Бесконечности либо будут проходить через операции, либо будут молча жестко ограничены до +/- 1,0. Обычно последний предназначен для преобразования в формат с фиксированной точкой.
  • Поведение NaN не определено: NaN может распространяться как идентичный NaN или может быть преобразован в NaN по умолчанию, может быть скрыто жестко ограничен до +/- 1,0 или молча преобразован в 0,0, или может привести к ошибке.

Преобразования с фиксированной точкой

Преобразования между различными Q m . n форматы следуют этим правилам:

  • Когда m увеличивается, знак расширяет целую часть слева.
  • Когда m уменьшается, зажмите целую часть.
  • Когда n увеличивается, ноль расширяет дробную часть справа.
  • Когда n уменьшается, сглаживайте, округляйте или усекайте лишние дробные биты справа.

Например, чтобы преобразовать значение Q4.27 в Q0.15 (без дизеринга или округления), сдвиньте вправо значение Q4.27 на 12 бит и зафиксируйте все результаты, выходящие за пределы 16-битного диапазона со знаком. Это выравнивает точку представления Q.

Чтобы преобразовать Q7.24 в Q7.23, выполните знаковое деление на 2 или, что то же самое, добавьте бит знака к целочисленной величине Q7.24, а затем сдвиг вправо со знаком на 1. Обратите внимание, что простой сдвиг вправо со знаком не эквивалентен деление со знаком на 2.

Преобразования с потерями и без потерь

Преобразование без потерь , если оно обратимо : преобразование из A в B в C приводит к A = C В противном случае преобразование с потерями .

Преобразование без потерь допускает двустороннее преобразование формата .

Преобразования из представления с фиксированной запятой с 25 или менее значащими битами в представление с плавающей запятой выполняются без потерь. Преобразования из числа с плавающей запятой в любое обычное представление с фиксированной точкой выполняются с потерями.