Короче
Пытаюсь сделать эквалайзер на C ++. Я должен обрабатывать звук блоками (обычно) по 256 сэмплов. Я использую БПФ, чтобы получить спектр блока выборки. Я обрабатываю частоты, а затем использую IFFT для получения обработанного аудиоблока во временной области. Я использую код, указанный в соответствующем вопросе: БПФ в одном файле C а>.
Для фильтра нижних частот установка нижних коэффициентов на ноль должна удалить низкие частоты. Однако в обработанном аудио я получаю измененный спектр, а не фильтр нижних частот (звук содержит жужжащий звук).
Я прочитал следующие статьи по теме:
- Что такое фильтры высоких и низких частот?
- Первичные коэффициенты БПФ и фильтр нижних частот
- Как реализовать эквалайзер
Я что-то не так делаю? Размер блока слишком мал для получения приемлемого разрешения по частоте?
Я знаком с математикой преобразования Фурье. Однако мне неизвестны подробности преобразований БПФ и ОБПФ. Возможно, предоставленный код реализован некорректно. Однако, когда выполняется БПФ, а затем ОБПФ по результату БПФ, исходный аудиоблок восстанавливается правильно.
Подробности
Я пишу VST и выполняю всю обработку в методе processReplacing()
. Вот почему я ограничен размером блока.
Моя идея состоит в том, чтобы сохранить последние n блоков в памяти и вычислить БПФ на последних n блоках, чтобы получить более высокое разрешение по частоте, затем выполнить обработку на этих частотах и после ОБПФ заменить только последний блок.
Есть ли какие-то предложения, правильный ли это способ реализации эквалайзера?