Могу ли я легко выполнить полосовую фильтрацию с помощью DirectSound?Если нет, то как я могу это сделать?

StackOverflow https://stackoverflow.com/questions/258667

Вопрос

Мне интересно, возможно ли что-то подобное (и относительно легко ли это сделать), и если да, то как я мог бы это сделать?

Я хотел бы выполнить полосовую фильтрацию в волновом файле, который я воспроизводю.Что-то похожее на "Эквалайзер", который вы видите в большинстве приложений, похожих на Winamp.
Моя идея, однако, состоит не в том, чтобы выровнять звук, а в том, чтобы использовать очень высокие отрицательные значения дБ, чтобы почти уничтожить полосу, которую я фильтрую.

Первый вопрос заключается в следующем:Дает ли DirectSound мне что-то, что позволяет мне это делать?
Если нет:Как бы вы это реализовали?
Я знаю (хотя и не совсем понимаю это полностью), что вы можете преобразовать дискретизированный сигнал в распределение частот, используя Быстрое преобразование Фурье.Теперь, я, очевидно, не могу вернуться от этого распределения к исходной форме сигнала после изменения значений амплитуды определенных частот :-)

Как я мог сделать что-то подобное?

Кроме того, насколько точно я могу изготовить эти фильтры?(Если бы я хотел отфильтровать все от 2250 Гц до 2275 Гц, какую ошибку допустил бы фильтр?От чего будет зависеть максимальная точность, которую я могу получить?)

Спасибо!

Это было полезно?

Решение

Я не знаю, предлагает ли DirectSound такую функциональность, я бы предположил, что это не так, поскольку DSP довольно сложен и часто сильно варьируется от ситуации к ситуации.То, что вы хотите сделать, обычно называется "фильтрацией" в DSP (цифровая обработка сигналов).Часто это связано с использованием фильтра FIR (с конечной импульсной характеристикой).Существует множество библиотек, которые делают именно то, что вы хотите.Одним из самых сложных аспектов проектирования фильтров является то, что всегда существуют компромиссы между скоростью, точностью и погрешностью.В вашем примере вы сможете удалить сигнал между частотами, но это также повлияет на окружающие частоты.Величина, на которую это повлияет, зависит от времени обработки и конструкции фильтра.

Возможно, начать здесь (тяжелая математика) : ПИХТОВЫЙ Фильтр

Затем найдите в Google свою собственную информацию, связанную с Windows / DirectSound, специфичную для FIR

Другие советы

Насколько мне известно, DirectSound не выполняет полосовую фильтрацию, как вы здесь описываете.

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

Для обработки файла WAV (в отличие от синтеза/фильтрации в реальном времени) выполнить линию задержки в аудиобуфере так же просто, как:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

На практике, конечно, это немного сложнее (например, вам приходится иметь дело с потенциальными значениями переполнения, а некоторые типы линий задержки приходится запускать в обратном порядке, что всегда является проблемой при кодировании в стиле C).

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

DirectSound вообще не предлагает никаких средств обработки сигналов.Есть множество техник, которые вы можете использовать, чтобы делать то, что хотите.Можно использовать БПФ, чтобы делать то, что вы хотите, но это, вероятно, не лучший и не самый простой метод.Вам следует прочитать о DSP аудио, особенно о цифровой фильтрации (IIR, FIR).В Интернете есть бесплатная хорошая книга по DSP под названием Руководство для ученых и инженеров по цифровой обработке сигналов что определенно стоит посмотреть.Есть также много других хороших книг по DSP, доступных на Amazon и т. д.

Я не знаю ни одной библиотеки, которая бы напрямую занималась подобными вещами.

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

Основная идея применения уравнения с использованием БПФ заключается в следующем:

  1. Получите аудио.Аудио — это просто очень длинный массив значений (сэмплов), который представляет собой смещение диффузора динамика с течением времени.
  2. Возьмите преобразование Фурье аудио (библиотека сделает это, но вам придется преобразовать аудиосэмплы в правильный формат.Это преобразует выборки, основанные на времени, в представление, основанное на частоте - по сути, это преобразует сигнал, чтобы показать распределение частот в сигнале.
  3. Разделить распределение частот вверх - разбить распределение на регионы, каждый регион будет представлять собой диапазон частот.
  4. Затем вы можете выполнить настройку полос частот - для вашего примера вы можете обнулить одну область, чтобы удалить все ее следы.
  5. Возьмите обратное преобразование Фурье обновленного распределения частот.Это вернет представление во временную область, восстанавливая (приближение) исходного сигнала, но с внесенными вами изменениями.

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

Рекомендую почитать по теме.Обнаружение ритма довольно тесно связано со многим из этого (много использует базовые методы) — попробуйте первые несколько разделов. здесь как начало.

Надеюсь, это немного поможет.

DirectSound может не поддерживать это напрямую, но DirectShow должен.Не могли бы вы вместо этого использовать этот API?

Я поддерживаю идею FIR-фильтра.Чтобы получить узкую насечку, вам понадобится длинное ядро фильтра.

По сути, вы используете свертку входного потока по набору значений (ядро).Каждая выходная выборка представляет собой сумму предыдущих N выборок, умноженную на соответствующую запись в ядре фильтра.

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

Это калькуляторы ядра FIR-фильтра в Интернете, просто загуглите "калькулятор FIR-фильтра".

Вы должны уметь выполнять БПФ, возиться в частотной области (масштабирование частотных элементов), а затем выполнять ОБПФ для восстановления сигнала во временной области.В остальном разработка фильтров с использованием ScopeFIR или MATLAB довольно проста.ScopeFIR может легко спроектировать полосовой фильтр и предоставить вам коэффициенты, чтобы вы могли выполнить свертку сигнала.Вот руководство с сайта ScopeFIR: http://www.iowegian.com/fir/tutor/firintro.htm

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top