Переформатирование аудиоданных Low Level Audio Engine - преобразование частоты дискретизации и битовой глубины

Aug 17 2020

Во-первых, похоже, что существует немного учебных пособий по низкоуровневому программированию звука, поэтому, если кто-нибудь знает о некоторых хороших ресурсах, я был бы очень признателен. Теперь перейдем к нашей теме!

Я использую WASAPI для звукового движка, который я пытаюсь разработать, и у меня возникают трудности с переформатированием прочитанных данных аудиофайла в формат, который аудиоустройство готово принять. В частности, мне интересно, как на лету преобразовать частоту дискретизации и битовую глубину прочитанного аудиофайла в требуемый формат устройства. Я видел пример, в котором использовалась линейная интерполяция, но в другом месте читал, что такой фильтр привносит слишком много артефактов, таких как сглаживание, поэтому снова мне интересно, какие практические алгоритмы будут для переформатирования аудиоданных в приложении реального времени.

Ответы

1 hotpaw2 Aug 17 2020 at 15:44

Интерполяция Sinc не приводит к появлению артефактов наложения спектров для данных, которые изначально были правильно ограничены полосой перед выборкой. (Но необходимо немного изменить, поскольку ядро ​​Синка или Дирихле имеет бесконечную продолжительность.)

Одна каноническая ссылка на то, почему работает реконструкция и как интерполировать, находится здесь: https://ccrma.stanford.edu/~jos/resample/

У меня есть простая реализация на Basic здесь: http://www.nicholson.com/rhn/dsp.html#3

Другой распространенный метод - это целочисленная повышающая дискретизация с фильтром нижних частот, за которой следует понижающая дискретизация с целочисленным коэффициентом с фильтрацией нижних частот на соответствующие два отношения. Другой распространенный метод - создание банка многофазных КИХ-фильтров (из нескольких фаз оконных интерполяционных ядер Sinc (или иным образом оптимизированных КИХ-фильтров). Другой распространенный метод - использование полиномиальных интерполяторов каждой из горбов ядра Sinc, в результате чего получается банк фильтров Фэрроу. .

Вам нужно нести достаточно битов арифметических промежуточных значений, чтобы поддерживать уровень шума квантования ниже, чем бы ни были ваши спецификации.