Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.185.180] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Получаю звук с микрофона в PCM S16LE. В звуке присутствует достаточно громкий однородный фон "шипение". Нужен алгоритм или библиотека для C++ для подавления шума в реальном времени. Подскажите? |
Сообщ.
#2
,
|
|
|
HardRock
Запишите 10 секунд звука. Удалите постоянную составляющую.Можно и без удаления. Примените преобразование Фурье. Найдите спектр шума. Из сходя из графика определяете частоту среза. Или 2 частоты если шум с двух сторон. Далее рассчитываете коэффициенты фильтра. Для этого надо знать характеристики вашего ПК и требования к "в реальном времени". Из сходя из этих данных выбираете степень фильтра и метод фильтрации. RC, КИХ, БИХ, БПФ.(анг. RC, FIR, IIR, FFT). Далее берёте матлаб. Выбираете тип фильтре к примеру Бартервот. Подбираете степень неравномерности в полосе и вне её. Рассчитываете коэффициенты. Затеем применяете преобразование фильтра под вашу частоту дискретизации. Делаем свою реализацию фильтра по выбранному методу. Или просим матлаб сгенерировать Си код. Прогоняете через ряд тестов. Убеждаемся что вычислительная ошибка не влияет на результат. Библиотек с реализациями различных фильтров полно: DSPLib, SDR, AlgLib, ... |
Сообщ.
#3
,
|
|
|
Шум, как правило, белый или розовый, то есть занимает весь диапазон, срезом какого-то определённого спектра его не удалить, да и такой срез сильно портит сигнал того же микрофона.
Можно сделать многополосный компрессор-гейт: Сигнал кроссовером делится на N полос, определяется уровень шума в каждом диапазоне и выставляется соответствующий уровень для гейта, после гейтов сигнал обратно суммируется. |
Сообщ.
#4
,
|
|
|
БШ легко давится медианным фильтром или скользящим усреднением. Последний даже лучше )
|
Сообщ.
#5
,
|
|
|
Есть еще варианты подавления "белого" шума - адаптивное шумопонижение, или NoiseGate (в паузах, но это по грубее), в зависимости от того, что Вам требуется на выходе.
|
Сообщ.
#6
,
|
|
|
В теории оптимальный фильтр в этой ситуации - это оценивающий фильтр Винера (того самого, что придумал ЯП Паскаль, Модула, Оберон). Можно почитать в Википедии про Винеровское оценивание.
Однако самому им пользоваться не приходилось, точнее сказать не могу. |