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

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

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

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

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

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

Спасибо!


person Daniel Magliola    schedule 03.11.2008    source источник


Ответы (7)


Я не знаю, предлагает ли DirectSound эту функциональность, я предполагаю, что нет, поскольку DSP довольно сложен и часто сильно различается от ситуации к ситуации. То, что вы хотите сделать, обычно называется «фильтрацией» в DSP (цифровая обработка сигналов). Во многих случаях это связано с использованием КИХ-фильтра (конечная импульсная характеристика). Есть много библиотек, которые делают именно то, что вы хотите. Одним из самых сложных аспектов проектирования фильтров является то, что всегда есть компромисс между скоростью, точностью и ошибкой. В вашем примере вы сможете удалить сигнал между частотами, но это также повлияет на окружающие частоты. Величина, на которую это повлияет, зависит от времени обработки и конструкции фильтра.

Возможно, начнем здесь (тяжелая математика): FIR Filter

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

person basszero    schedule 03.11.2008

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

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

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

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

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

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

person MusiGenesis    schedule 03.11.2008

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

person Stu Mackellar    schedule 03.11.2008

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

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

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

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

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

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

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

person xan    schedule 04.11.2008

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

person AShelly    schedule 14.11.2008

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

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

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

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

person JeffV    schedule 04.01.2009

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

person switchmode    schedule 28.01.2009