Начиная с Android 5.0 (Lollipop) ресемплеры аудио полностью основаны на КИХ-фильтрах, полученных из функции sinc с окном Кайзера. Оконная функция Кайзера обладает следующими свойствами:
- Его легко рассчитать по параметрам конструкции (пульсация полосы задерживания, ширина полосы перехода, частота среза, длина фильтра).
- Оно почти оптимально для снижения энергии полосы задерживания по сравнению с общей энергией.
Подробнее об окне Кайзера, его оптимальности и связи с окнами вытянутого сфероида читайте в книге П. П. Вайдьянатана (P. P. Vaidyanathan) Multirate Systems and Filter Banks (с. 50).
Параметры дизайна рассчитываются автоматически на основе внутренних критериев качества и желаемых коэффициентов выборки. На основе параметров проектирования генерируется фильтр sinc с окном. Для музыки ресемплер с 44,1 на 48 кГц и наоборот генерируется с более высоким качеством, чем для произвольного преобразования частоты.
Ресемплеры аудио обеспечивают повышенное качество и скорость его достижения. Однако ресемплеры могут вызывать небольшие пульсации в полосе пропускания и гармонический шум наложения, а также приводить к потере высоких частот в переходной полосе. Поэтому не используйте их без необходимости.
Рекомендации по выборке и повторной выборке
В этом разделе приведены рекомендации, которые помогут вам избежать проблем с частотой дискретизации.
Выберите частоту дискретизации, подходящую для устройства
Как правило, лучше всего выбирать частоту дискретизации, соответствующую устройству, обычно 44,1 кГц или 48 кГц. Если частота дискретизации выше 48 кГц, качество звука обычно снижается, поскольку для воспроизведения файла требуется ресемплер.
Используйте простые коэффициенты ресемплинга (фиксированные и интерполированные полифазы).
Ресемплер работает в одном из следующих режимов:
- Исправлен многофазный режим. Коэффициенты фильтра для каждой многофазной системы предварительно вычисляются.
- Интерполированный многофазный режим. Коэффициенты фильтра для каждой многофазной системы должны быть интерполированы из двух ближайших предварительно вычисленных многофазных систем.
Ресемплер работает быстрее всего в фиксированном многофазном режиме, когда отношение входной частоты к выходной L/M (без учета наибольшего общего делителя) имеет M меньше 256. Например, для преобразования 44 100 в 48 000 L = 147, M = 160.
В режиме фиксированной многофазной фильтрации частота дискретизации заблокирована и не меняется. В режиме интерполированной многофазной фильтрации частота дискретизации является приблизительной. При воспроизведении на устройстве с частотой 48 кГц отклонение частоты дискретизации обычно составляет один отсчет за несколько часов. Обычно это не вызывает проблем, поскольку погрешность аппроксимации намного меньше, чем погрешность частоты, вносимая внутренними кварцевыми генераторами, тепловым дрейфом или джиттером (обычно десятки ppm).
При воспроизведении на устройстве с частотой 48 кГц выбирайте частоту дискретизации с простым соотношением, например 24 кГц (1:2) и 32 кГц (2:3), даже если AudioTrack позволяет использовать другие частоты и соотношения.
Для изменения частоты дискретизации используйте повышающую дискретизацию, а не понижающую.
Частоту дискретизации можно менять на лету. Детализация такого изменения основана на внутренней буферизации (обычно несколько сотен выборок), а не на пошаговой основе. Это можно использовать для эффектов.
Не меняйте частоту дискретизации динамически при ее понижении. Если частота дискретизации меняется после создания аудиодорожки, то при понижении частоты дискретизации разница примерно в 5–10 % от исходной частоты может привести к повторному вычислению фильтра (для правильного подавления наложения спектров). Это может привести к потреблению вычислительных ресурсов и вызвать слышимый щелчок, если фильтр заменяется в реальном времени.
Ограничьте уменьшение разрешения до 6:1.
Обычно это происходит из-за требований аппаратного обеспечения. Если преобразователь частоты дискретизации используется для понижения частоты, старайтесь ограничить коэффициент понижения частоты до 6:1, чтобы обеспечить хорошее подавление наложения спектров (например, понижение частоты не более чем с 48 000 до 8000). Длина фильтра корректируется в соответствии с коэффициентом понижающей дискретизации, но при более высоких коэффициентах понижающей дискретизации вы жертвуете большей полосой пропускания перехода, чтобы избежать чрезмерного увеличения длины фильтра. При повышении частоты дискретизации подобных проблем с наложением спектров не возникает. Обратите внимание, что некоторые части аудиоконвейера могут препятствовать понижению частоты дискретизации более чем 2:1.
Если вас беспокоит задержка, не выполняйте ресемплирование.
Ресемплинг не позволяет поместить трек в FastMixer, что приводит к значительному увеличению задержки из-за дополнительного буфера большего размера в обычном микшере. Кроме того, существует неявная задержка, связанная с длиной фильтра ресемплера, хотя обычно она составляет порядка одной миллисекунды или меньше, что не так велико, как дополнительная буферизация для обычного пути микшера (обычно 20 миллисекунд).
Использование аудио с плавающей запятой
Использование чисел с плавающей запятой для представления аудиоданных может значительно улучшить качество звука в высокопроизводительных аудиоприложениях. У этого формата есть следующие преимущества:
- Более широкий динамический диапазон.
- Точность во всем динамическом диапазоне.
- Больше запаса по уровню, чтобы избежать клиппинга во время промежуточных вычислений и переходных процессов.
Хотя запись с плавающей запятой может улучшить качество звука, у нее есть определенные недостатки:
- Числа с плавающей запятой занимают больше памяти.
- Операции с плавающей запятой имеют неожиданные свойства, например сложение не является ассоциативным.
- При вычислениях с плавающей запятой иногда может теряться арифметическая точность из-за округления или численно нестабильных алгоритмов.
- Чтобы эффективно использовать запись с плавающей запятой, необходимо понимать, как она работает. Это позволит получать точные и воспроизводимые результаты.
Раньше запись с плавающей запятой была недоступна или работала медленно. Это по-прежнему верно для процессоров низкого уровня и встроенных процессоров. Однако процессоры современных мобильных устройств теперь имеют аппаратную плавающую запятую с производительностью, аналогичной (или в некоторых случаях даже более быстрой), чем целое число. Современные процессоры также поддерживают SIMD (одна инструкция, множество данных), что может ещё больше повысить производительность.
Рекомендации по работе с аудио с плавающей запятой
Чтобы избежать проблем с вычислениями с плавающей запятой, следуйте приведенным ниже рекомендациям.
- Используйте запись с плавающей запятой двойной точности для редких вычислений, например для расчета коэффициентов фильтра.
- Обратите внимание на порядок операций.
- Объявляйте явные переменные для промежуточных значений.
- Используйте скобки.
- Если вы получили результат NaN или бесконечность, используйте двоичный поиск, чтобы обнаружить, где он был введен.
Для аудио с записью с плавающей запятой кодировка формата аудио AudioFormat.ENCODING_PCM_FLOAT используется аналогично ENCODING_PCM_16_BIT или ENCODING_PCM_8_BIT для указания форматов данных AudioTrack. Соответствующий перегруженный метод AudioTrack.write() принимает массив с плавающей запятой для передачи данных.
Kotlin
fun write( audioData: FloatArray, offsetInFloats: Int, sizeInFloats: Int, writeMode: Int ): Int
Java
public int write(float[] audioData, int offsetInFloats, int sizeInFloats, int writeMode)
Чтобы узнать больше,
В этом разделе приведены дополнительные материалы о выборке и записи с плавающей запятой.
Выборка
Частота дискретизации
- Дискретизация (обработка сигналов) в Википедии.
Ресемплинг
- Преобразование частоты дискретизации (Википедия).
- Преобразование частоты дискретизации на сайте source.android.com.
Споры о высокой глубине цвета и высокой частоте дискретизации
- D/A and A/D | Digital Show and Tell (видео Кристофера Монтгомери из Xiph.Org).
- The Science of Sample Rates (When Higher Is Better - And When It Isn't).
- Мифы о звуке и войны DAW
- 192kHz/24bit vs. 96kHz/24bit "debate"- Interesting revelation
Число с плавающей запятой
Дополнительную информацию о представлении аудиоданных с плавающей запятой можно найти в следующих статьях Википедии:
- Битовая глубина аудио
- Арифметика с плавающей запятой
- IEEE 754 floating-point
- Потеря значимости (катастрофическая отмена)
- Численная стабильность
В следующей статье представлена информация об аспектах чисел с плавающей запятой, которые оказывают непосредственное влияние на разработчиков компьютерных систем:
- What every computer scientist should know about floating-point arithmetic (Что каждый специалист по компьютерным наукам должен знать об арифметике с плавающей запятой), Дэвид Голдберг, Xerox PARC (отредактированное переиздание).