Разрешение эквалайзера звука

Короче

Пытаюсь сделать эквалайзер на C ++. Я должен обрабатывать звук блоками (обычно) по 256 сэмплов. Я использую БПФ, чтобы получить спектр блока выборки. Я обрабатываю частоты, а затем использую IFFT для получения обработанного аудиоблока во временной области. Я использую код, указанный в соответствующем вопросе: БПФ в одном файле C .

Для фильтра нижних частот установка нижних коэффициентов на ноль должна удалить низкие частоты. Однако в обработанном аудио я получаю измененный спектр, а не фильтр нижних частот (звук содержит жужжащий звук).

Я прочитал следующие статьи по теме:

Я что-то не так делаю? Размер блока слишком мал для получения приемлемого разрешения по частоте?

Я знаком с математикой преобразования Фурье. Однако мне неизвестны подробности преобразований БПФ и ОБПФ. Возможно, предоставленный код реализован некорректно. Однако, когда выполняется БПФ, а затем ОБПФ по результату БПФ, исходный аудиоблок восстанавливается правильно.

Подробности

Я пишу VST и выполняю всю обработку в методе processReplacing(). Вот почему я ограничен размером блока.

Моя идея состоит в том, чтобы сохранить последние n блоков в памяти и вычислить БПФ на последних n блоках, чтобы получить более высокое разрешение по частоте, затем выполнить обработку на этих частотах и ​​после ОБПФ заменить только последний блок.

Есть ли какие-то предложения, правильный ли это способ реализации эквалайзера?


person Igor Ševo    schedule 08.04.2016    source источник
comment
Вы рассматривали возможность фильтрации во временной области? Именно так это делает большинство аудио-программ, и на то есть веские причины. Преимущества временной области включают (для упрощения): меньшую задержку, более эффективную обработку, более плавную частотную характеристику (в зависимости от типа фильтра, который вы выбираете), отклик во временной области без предэха и, как правило, имитация характеристик аналоговых звуковых фильтров. Вот отличный ресурс: musicdsp.org/en /latest/Filters/197-rbj-audio-eq-cookbook.html и объяснение, которое я написал: blog.bjornroche.com/2012/08/basic-audio-eqs.html   -  person Bjorn Roche    schedule 22.06.2021


Ответы (2)


Как минимум 3 проблемы:

Во-первых, способ отфильтровать частоты НЕ для обнуления элементов разрешения БПФ. См. Этот ответ для получения дополнительной информации: https://dsp.stackexchange.com/questions/6220/why-is-it-a-bad-idea-to-filter-by-zeroing-out-fft-bins/6224#6224

Во-вторых, после того, как вы вычислите длину импульсной характеристики желаемого отклика фильтра, вы должны обнулить свой БПФ, по крайней мере, на эту дополнительную длину, а затем использовать добавление с перекрытием или сохранение с перекрытием (алгоритмы быстрой свертки), чтобы объединить ваши Результаты IFFT, а не просто их объединение.

В-третьих, 256 отсчетов при частоте дискретизации 44,1 кГц недостаточно, чтобы соответствовать даже 1 полному периоду любой высоты звука ниже 170 Гц. Итак, да, низкочастотное разрешение будет ограничено выбранным вами размером блока. Разумно это или нет, зависит от ваших требований к частотной характеристике.

Быстрая свертка БПФ / ОБПФ является одним из распространенных способов выполнения выравнивания DSP, если у вас есть кривая выравнивания с длинным импульсным откликом, достаточными вычислительными ресурсами / мощностью / циклами и вы не возражаете против некоторой задержки, связанной с размером блока.

person hotpaw2    schedule 08.04.2016

Позвольте предположить (поскольку вы упустили соответствующую информацию): у вас достаточно высокая частота дискретизации, скажем, 44000 отсчетов в секунду. Это означает, что ваши блоки составляют всего 6 миллисекунд, или, другими словами, частота вашего блока составляет 171 Гц. Это прекрасно слышно.

Итак, проблема не столько в том, что у вас слишком низкое частотное разрешение, у вас слишком много блоков в секунду.

Более глубокий вопрос заключается в том, почему эти блоки вызывают ажиотаж. На это также есть простой ответ: вы выполняете БПФ для сигнала с ограничением по времени. Преобразование Фурье в математике применяется к бесконечному сигналу, который на практике БПФ аппроксимируется бесконечным повторением вашего блока из 256 отсчетов. Но последний образец блока не совпадает с первым; будет скачок. Таким образом, этот скачок происходит со скоростью 171 таймер в секунду, и это гудящий звук.

person MSalters    schedule 08.04.2016
comment
Я подумал, что проблема может быть связана с этим. Можете ли вы предложить другой метод коррекции (не обязательно с использованием БПФ) или способ преодоления этого ограничения? - person Igor Ševo; 08.04.2016
comment
Либо БИХ-, либо КИХ-фильтры. FIR может быть немного проще реализовать, но будет иметь более длительные групповые задержки, если обработка в реальном времени является проблемой. - person marko; 08.04.2016