Переформатирование аудиоданных Low Level Audio Engine - преобразование частоты дискретизации и битовой глубины
Во-первых, похоже, что существует немного учебных пособий по низкоуровневому программированию звука, поэтому, если кто-нибудь знает о некоторых хороших ресурсах, я был бы очень признателен. Теперь перейдем к нашей теме!
Я использую WASAPI для звукового движка, который я пытаюсь разработать, и у меня возникают трудности с переформатированием прочитанных данных аудиофайла в формат, который аудиоустройство готово принять. В частности, мне интересно, как на лету преобразовать частоту дискретизации и битовую глубину прочитанного аудиофайла в требуемый формат устройства. Я видел пример, в котором использовалась линейная интерполяция, но в другом месте читал, что такой фильтр привносит слишком много артефактов, таких как сглаживание, поэтому снова мне интересно, какие практические алгоритмы будут для переформатирования аудиоданных в приложении реального времени.
Ответы
Интерполяция Sinc не приводит к появлению артефактов наложения спектров для данных, которые изначально были правильно ограничены полосой перед выборкой. (Но необходимо немного изменить, поскольку ядро Синка или Дирихле имеет бесконечную продолжительность.)
Одна каноническая ссылка на то, почему работает реконструкция и как интерполировать, находится здесь: https://ccrma.stanford.edu/~jos/resample/
У меня есть простая реализация на Basic здесь: http://www.nicholson.com/rhn/dsp.html#3
Другой распространенный метод - это целочисленная повышающая дискретизация с фильтром нижних частот, за которой следует понижающая дискретизация с целочисленным коэффициентом с фильтрацией нижних частот на соответствующие два отношения. Другой распространенный метод - создание банка многофазных КИХ-фильтров (из нескольких фаз оконных интерполяционных ядер Sinc (или иным образом оптимизированных КИХ-фильтров). Другой распространенный метод - использование полиномиальных интерполяторов каждой из горбов ядра Sinc, в результате чего получается банк фильтров Фэрроу. .
Вам нужно нести достаточно битов арифметических промежуточных значений, чтобы поддерживать уровень шума квантования ниже, чем бы ни были ваши спецификации.