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 минус один младший бит. Из-за представления дополнения до двух отрицательное значение больше, чем положительное.
Сноски:
- Все вышеперечисленные форматы выражают примерные значения со знаком. 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 или менее значащими битами в представление с плавающей запятой выполняются без потерь. Преобразования из числа с плавающей запятой в любое обычное представление с фиксированной точкой выполняются с потерями.