Могу ли я легко выполнять полосовую фильтрацию с помощью DirectSound? Если нет, как я могу это сделать?
Мне интересно, возможно ли что-то подобное (и относительно легко сделать), и если да, то как я могу это сделать?
Я хотел бы сделать ленточную фильтрацию на воспроизводимом волновом файле. Нечто похожее на "Эквалайзер", которое вы видите в большинстве Winamp-подобных приложений.
Однако моя идея не в том, чтобы выровнять звук, а в том, чтобы использовать очень высокие отрицательные значения в дБ, чтобы практически убить полосу, которую я фильтрую.
Первый вопрос: дает ли DirectSound то, что позволяет мне это делать?
Если нет: как бы вы реализовали это?
Я знаю (хотя я не совсем понимаю это), что вы можете преобразовать дискретизированный сигнал в распределение частот с помощью быстрого преобразования Фурье. Теперь я, очевидно, не могу вернуться от этого распределения к исходному сигналу после изменения значений амплитуды определенных частот:-)
Как я мог сделать что-то подобное?
Кроме того, насколько точно я могу сделать эти фильтры? (Если бы я захотел отфильтровать все от 2250 Гц до 2275 Гц, какая ошибка была бы у фильтра? От чего зависела бы максимальная точность, которую я могу получить?)
Спасибо!
7 ответов
Я не знаю, предлагает ли DirectSound эту функцию, я бы предположил, что это не так, поскольку DSP довольно сложен и часто сильно варьируется от ситуации к ситуации. То, что вы хотите сделать, обычно называется "фильтрацией" в DSP (цифровая обработка сигналов). Во многих случаях это связано с использованием фильтра FIR (конечной импульсной характеристики). Есть много библиотек, чтобы делать именно то, что вы хотите. Одним из самых хитрых аспектов дизайна фильтров является то, что всегда есть компромиссы между скоростью, точностью и ошибкой. В вашем примере вы сможете удалить сигнал между частотами, но это также повлияет на окружающие частоты. Сумма, на которую это повлияет, связана со временем обработки и дизайном фильтра.
Возможно, начнем здесь (математика тяжелая): FIR Filter
Затем Google для вашей собственной информации, связанной с FIR для Windows / DirectSound
Насколько я знаю, 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 и т. Д.
Я не знаю ни одной библиотеки, которая бы занималась подобными вещами напрямую.
Вы можете достичь того, что вы хотите, с помощью преобразований Фурье, такие реализации, как FFTW, сделают за вас вычислительную работу, но, по моему опыту, с ними довольно неприятно работать и использовать колоссальные объемы памяти, особенно если вы хотите обрабатывать более длинные биты аудио в один удар.
Основная идея применения eq с использованием FFT заключается в следующем:
- Получи свой аудио. Звук - это просто очень длинный массив значений (сэмплов), который представляет собой смещение конуса динамика / времени.
- Возьмите преобразование Фурье для аудио (библиотека сделает это, но вам придется шунтировать сэмплы аудио в правильный формат. Это преобразует сэмплы, основанные на времени, в представление на основе частоты - по сути, это преобразует сигнал, чтобы показать искажение частот в сигнале.
- Разделите распределение частот вверх - разделите распределение на регионы, в каждом регионе будет диапазон частот.
- Затем вы можете выполнить регулировку частотных диапазонов - для вашего примера вы можете обнулить один регион, чтобы удалить все его следы.
- Возьмем обратное преобразование Фурье обновленного частотного распределения. Это вернет представление во временную область, восстановив (аппроксимацию) исходного сигнала, но с учетом внесенных вами изменений.
Делая что-то подобное, вы сможете аккуратно манипулировать частотами, присутствующими в вашем аудио, предоставляя вам тот вид контроля, который вам нужен. Имейте в виду, однако, что это не так просто реализовать.
Я рекомендую читать вокруг предмета. Обнаружение ударов довольно тесно связано со многими из них (часто использует базовые приемы) - попробуйте первые несколько разделов здесь для начала.
Надеюсь, это немного поможет.
DirectSound может не поддерживать это напрямую, но DirectShow должен. Не могли бы вы использовать этот API вместо этого?
Я поддерживаю идею фильтра FIR. Чтобы получить узкий надрез, вам понадобится длинное ядро фильтра.
В основном вы используете свертку входного потока с набором значений (ядро). Каждая выходная выборка представляет собой сумму предыдущих N выборок, умноженную на соответствующую запись в ядре фильтра.
Таким образом, вам нужно сохранить массив ядра и FIFO или циклический буфер с одинаковым количеством выборок.
Это калькуляторы ядра FIR-фильтра в Интернете, просто Google "Калькулятор FIR-фильтра".
Вы должны быть в состоянии сделать FFT, возиться в частотной области (масштабирование частотных бинов), а затем выполнить IFFT для восстановления сигнала временной области. В противном случае, разработка фильтров с использованием ScopeFIR или MATLAB довольно проста. ScopeFIR может легко спроектировать полосовой фильтр и дать вам коэффициенты, чтобы вы могли свернуть сигнал. Вот учебник с сайта ScopeFIR: http://www.iowegian.com/fir/tutor/firintro.htm