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 минус один младший бит. Из-за представления дополнения к двум отрицательным значениям больше, чем положительным.
Сноски:
- Все приведенные выше форматы выражают образцы значений со знаком. 8-битный формат обычно называют «беззнаковым», но на самом деле это знаковое значение со смещением
0.10000000
. - Q0.23 может быть упакован в 24 бита (три 8-битных байта с прямым порядком байтов) или распакован в 32 бита. В распакованном виде значащие биты либо выравниваются по правому краю по направлению к младшему разряду с дополнением расширения знака по направлению к старшему разряду (Q8.23), либо выравниваются по левому краю по направлению к старшему разряду с заполнением нулями по направлению к младшему разряду (Q0.31). Q0.31 теоретически допускает до 32 значащих битов, но аппаратные интерфейсы, принимающие Q0.31, редко используют все биты.
- Плавающая запятая одинарной точности имеет 23 явных бита плюс один скрытый бит и знаковый бит, в результате чего всего получается 25 значащих битов. Денормальные числа имеют меньше значащих битов.
- Плавающая запятая одинарной точности может выражать значения до ±1,7e+38, что объясняет большой запас.
- Показанный динамический диапазон рассчитан для отклонений до номинального максимального значения ±1,0. Обратите внимание, что некоторые реализации с плавающей запятой для конкретной архитектуры, такие как NEON, не поддерживают денормализованные значения.
Конверсии
В этом разделе обсуждаются преобразования данных между различными представлениями.
Преобразования с плавающей запятой
Чтобы преобразовать значение из Q m . n формат с плавающей запятой:
- Преобразуйте значение в число с плавающей запятой, как если бы оно было целым числом (игнорируя точку).
- Умножьте на 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 или менее значащими битами в представление с плавающей запятой выполняются без потерь. Преобразования из числа с плавающей запятой в любое обычное представление с фиксированной запятой выполняются с потерями.