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

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 перечислены в таблице ниже:

Обозначения
Свойство Вопрос 0.15 В0.7 1 Вопрос 0.23 Вопрос 0.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 или менее значащими битами в представление с плавающей запятой выполняются без потерь. Преобразования из числа с плавающей запятой в любое обычное представление с фиксированной запятой выполняются с потерями.