2008-11-03 3 views
2

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

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

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

Как я мог сделать что-то вроде этого?

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

Спасибо!

ответ

3

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

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

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

1

DirectSound не имеет никаких средств обработки сигналов вообще. Существуют различные методы, которые вы могли бы использовать для выполнения того, что хотите. Можно использовать FFT, чтобы делать то, что вы хотите, но это, вероятно, не самый лучший или простой способ. Вы должны прочитать аудио DSP, особенно цифровую фильтрацию (IIR, FIR). Там есть хорошая книга DSP, доступная онлайн бесплатно по телефону The Scientist and Engineer's Guide to Digital Signal Processing, которая, безусловно, стоит посмотреть. Есть также много других хороших книг DSP, доступных от Amazon и т. Д.

2

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

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

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

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

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

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

1

Я не знаю каких-либо библиотек, которые непосредственно заботятся об этом.

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

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

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

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

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

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

0

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

0

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

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

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

Они являются калькуляторами ядра фильтра FIR в Интернете, просто Google "FIR filter calculator".

0

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

Смежные вопросы