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

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

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

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

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

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

Спасибо!

Ответы [ 7 ]

3 голосов
/ 03 ноября 2008

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

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

Тогда Google для вашей собственной информации, связанной с FIR для Windows / DirectSound

2 голосов
/ 03 ноября 2008

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

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

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

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

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

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

1 голос
/ 04 ноября 2008

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

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

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

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

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

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

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

1 голос
/ 03 ноября 2008

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

0 голосов
/ 28 января 2009

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

0 голосов
/ 05 января 2009

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

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

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

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

0 голосов
/ 14 ноября 2008

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

...