Задача фильтрации - изменить соотношение мощностей частот в звуке. Задача, с одной стороны, не хитрая, но с другой стороны - сложно сделать так, чтобы результат был именно такой, какой нам хотелось получить. Разные цифровые фильтры фильтруют сигналы совершенно по разному, и надо хорошо понимать, какой фильтр где применять. Единственный неправильно примененный (не по назначению) фильтр, как правило, наносит звуку непоправимый ущерб. Малозаметный на глаз или при беглом прослушивании, но в дальнейшем - просто ощущаемый как смазанный или звенящий звук, и устранить его затем невозможно.
Наш тестовый сигнал - тишина, резко переходящая в простой тон ноты ля основной октавы, 440 Гц.
Одно замечание. Резкое (неплавное) изменение характера колебаний - то место, где из тишины появляется тон - содержит все возможные частоты сразу, то есть на сонограмме это выглядело бы яркой вертикальной линией. Слышится это место как легкий звонкий щелчок.
Этот участок, содержащий все частоты, мы и будем пытаться фильтровать, для наглядности. Задача будет такая: оставить все частоты до примерно 600 Гц, и убрать все более высокие. В идеале мы не должны затронуть ни сам тон, ни тишину перед ним, вместе с тем сгладить переход, сделать рывок не таким резким - то есть убрать из него все высокие частоты, которые дают резкие скачки амплитуды. Пример очень искусственен, но хорошо показывает особенности разных фильтров.
Так получилось, что я буду в основном ругать фильтры. Будет гораздо лучше, если вы поймете, что любой частотный фильтр, сильно изменяющий частотную картину - это прежде всего страшно, а уж потом - полезно. В цифровой фильтрации очень важно знать меру - слишком сильна свобода выбора как угодно жесткого фильтра, что не всегда полезно. Я даже несколько сгущаю краски - на самом деле, всё не так плохо, как могло показаться, и если я говорю 'ужасные последствия' - это еще не значит, что уши завянут сразу же, нет. Просто в обработке звука любая потеря - это всё же потеря, которая когда-нибудь скажется, и поэтому - будем стараться терять как можно меньше.
И заодно - простая истина: цифровые фильтры всегда лучше аналоговых. В крайнем случае - они их моделируют, в лучшем случае - предлагают такие возможности, которые просто нельзя получить в аналоговой схеме.
FFT фильтр
Самый простой в использовании, гибкий, понятный, наглядный, мощный... и опасный из всего семейства, смертельный для звука инструмент в неумелых руках.
Идея фильтра проста. Разложить сигнал на частотные составляющие, умножить отдельные частоты на требуемое изменение частотного распределения, синтезировать сигнал обратно. Чаще всего в реализациях этого типа фильтра применяется сглаживающее окно и работа с перекрывающимися FFT блоками.
Идея фильтра заманчива своей простотой. Но проблемы есть, и они огромны. Основная проблема - блок FFT обработки представляет собой одно целое. Определенная частота - результат FFT - при обратном синтезе пронизывает весь блок, и её нельзя просто так, без последствий, выкинуть или усилить... От слов - к делу:
Исходный сигнал
Фильтрация с FFT = 8192
Фильтрация с FFT = 1024
Как видно, результат - как минимум странный. Обратите внимание на следующие искажения:
- Пре-эхо. В месте щелчка частоты больше 600 Гц в FFT разложении отвечали не за полезный сигнал, а за то, чтобы синтезировать резкий переход. Этих частот не стало. Резкого перехода - тоже.
- Изменение амплитуды тона 440 Гц (с FFT = 1024). Причина - хоть и использовалась оконная сглаживающая функция, частота 440 Гц не попала в FFT сетку с шагом ~43 Гц, которая получилась от размера разложения 1024. Вывод - частоты выше 600 Гц тоже пошли на представление частоты 440 Гц. Их не стало - амплитуда уменьшилась. На самом деле не только амплитуда уменьшилась, а еще и форма колебаний изменилась - но этого на рисунке не рассмотреть. Без наличия всех частот полноценный синтез исходной частоты, которая прошла мимо FFT сетки, невозможен.
- В здоровом блоке (с FFT = 8192) очень сильно изменилась амплитуда колебаний рядом с переходом. Обратите внимание на ошибочный рост амплитуды уже после установления тона. В большие FFT блоки особенно нельзя сильно вмешиваться - размах блока таков, что что там характеризует одна определенная частота - только богу известно. Вспомните так называемый спектральный шум...
В общем, в пределах одного FFT блока возможны серьезные искажения временных и амплитудных параметров. Из этого вывод: нужно делать блок как можно меньше.
Минусы этого подхода: При уменьшении сетки частот ощутимо затрагиваются уже все частоты - и фильтрованные, и нет. Это происходит из-за того, что частот, не попадающих в FFT сетку, становится больше. Это плохо. При уменьшении FFT уменьшается разрешение по частотам - это тоже плохо. Если мы, например, хотим работать с басом и нам есть разница между 100 и 110 Гц - мы вынуждены использовать блоки с размером как минимум 4096, что уже достаточно для появления неприятных эффектов.
Не рекомендуется делать блоки меньше 1024 - разрешение по частоте настолько падает, что смысл применения именно этого фильтра вообще теряется. Зато из-за малого разрешения по частоте появляется некая шершавость обработки, особенно на стыках блоков - будут появляться артефакты.
Для разнообразия - еще одна картинка. Убираем на этот раз все частоты меньше 600 Гц - то есть наш основной тон должен уйти.
FFT = 1024
Мы выделили сам щелчок. Видно, что даже с таким маленьким размером FFT имеет место эхо с двух сторон. Оно сильно возрастает при переходе на большие размеры FFT.
Уже вполне можно спросить - а зачем он вообще такой нужен? Дело в том, что и этот фильтр бывает нужен, безопасен, более того - незаменим. Но вы должны абсолютно точно понимать, что вы делаете. Например, вполне безопасны такие операции:
- Работа в области низких частот (ориентировочно - до 1 кГц). Даже сильные изменения АЧХ не принесут очень плохих последствий.
- Фильтры для вырезания определенных частот (например, 50 Гц) в ноль. Узкие участки воздействия почти не дают побочных эффектов, так как задевают лишь несколько частот разложения.
- Легкий эквалайзер. И вообще любая легкая обработка. Не забывайте только, что вы так или иначе разглаживаете сигнал во времени в пределах FFT блока. Сильнее ли, слабее - но это происходит, и тем сильнее, чем сильнее ваше вмешательство. Обширные по частоте уровни вмешательства с более 3-5 дБ воздействием - опасны.
Чего ни в коем случае не нужно делать:
- Всегда ставить максимальный размер FFT. Нужный размер определяется интуитивно, в зависимости от того, что вы делаете. :-)
- Использовать Triangluar или Hamming оконную функцию. Рекомендация - Blackman или Blackman-Harris.
- Использовать FFT фильтр как эквалайзер. Для изменения тональной окраски всегда найдутся менее вредные операции.
- Использовать этот фильтр на одних данных несколько раз, слегка изменяя время начала обработки. Комбинируйте все операции в одну!
- Использовать его как жесткий обрезающий фильтр высоких частот. Почти всегда есть варианты лучше (один хороший вариант - вообще этого не делать :).
Для чего он нужен:
- Для экстремальной фильтрации - когда результат обработки как факт более важен, чем возможные неприятности.
- Для фильтрации определенных узких частот.
- Если важно сохранить фазовую информацию. FFT отличается большим уважением к фазе сигналов. Помните, однако, что нам самим для восприятия фаза не очень важна.
- Для многого другого - если вы понимаете, что делаете.
В любом случае: проверяйте и тщательно анализируйте результат. На что обращать внимание - в основном, смотрите на временные параметры - например, на фронты резких колебаний.
IIR фильтры
От Infinite Impulse Response - что-то вроде 'бесконечная отдача импульса'. В теории, влияние этих фильтров не прекращается никогда, лишь затихая во времени. На практике оно, конечно, прекращается, но всё равно - эти фильтры оставляют наибольший шлейф последствий. Не обязательно плохих, просто - изменения сигнала идут всегда, вне зависимости от того, есть что фильтровать или нечего в данный конкретный момент фильтрации. Это проще будет посмотреть на примерах.
На IIR фильтрах в программах обычно построены такие функции, как:
- 'Научные' фильтры. Chebushev, Butterworth, Bessel, т.д. - это и есть собственно IIR фильтры. В таких диалогах обычно имеется контроль над всеми параметрами.
- Параграфические фильтры - где задаются отдельные пики воздействия в виде {частота, ширина воздействия, усиление/ослабление в дБ}, а также иногда фильтрация по краям диапазона (high-shelf и low-shelf). Обычно здесь применяются фильтры второго порядка Butterworth или Bessel (см. ниже).
- Параметрические фильтры типа low-pass, high-pass, band-pass - где указываются области частот и ослабления нежелательных сигналов. Порядок фильтра обычно устанавливается автоматически - и это может привести к очень неприятным последствиям.
А вообще - лучше посмотреть в справке к конкретной программе, какие именно фильтры используются в той или иной обработке. Возможно, что программа, которую вы используете, применяет другие фильтры для реализации диалогов фильтрации того типа, как я описал.
Прежде всего, хотелось бы вас послать к любой серьезной книжкой по цифровой обработке звука - вопросы IIR фильтров там освещаются очень подробно. Я же предлагаю вам выжатое описание эффектов фильтрации и советы в стиле кухонного рецепта по практическому использованию (или не использованию) этих фильтров...
Начнем с того, что эти фильтры также опасны. Не так сильно, однако, как FFT, но всё же. Один IIR фильтр - это фильтр, который воздействует на какой-то диапазон частот: или только частоты ниже определенной границы, или только выше, либо между двумя заданными частотами. У IIR фильтра есть такой параметр, как порядок. Чем он больше, тем сильнее граница по частоте между тем, на что влияет фильтр, и тем, на что он не влияет. Иногда можно задавать параметр напрямую (CoolEdit - научные фильтры), иногда он автоматическим образом зависит от желаемой резкости перехода (SoundForge, parametric EQ). Вместе с тем, чем выше порядок фильтра, тем сильнее проявляются искажения фазы, которые резко нарастают вблизи границ фильтрации. Разные типы фильтров (Chebushev, Bessel, ...) обладают разными свойствами на границах перехода, но в этом обзоре - только общие тенденции.
К примерам. Напоминаю - убираем все частоты выше 600 Гц.
Исходный сигнал
После фильтра порядка 2 (Butterworth)
После фильтра порядка 6 (Butterworth)
После фильтра порядка 12 (Butterworth)
Видно, что фильтр 2-го порядка справился так себе: во первых, относительно слабо убрал высокие частоты - переход остался довольно резким, а во вторых затронул и 440 Гц. Его частотная характеристика слишком плавная для точной фильтрации. Фильтры более высокого порядка справились лучше, но сигнал заметно уплыл вправо, появилась задержка. Это - не что иное, как фазовые искажения. Сигнал 440 Гц, хоть и не изменяя своей амплитуды, приобрел фазовый сдвиг, да такой здоровый, что его уже можно называть задержкой. Проблема в том, что этот фазовый сдвиг разный для разных частот - если бы в сигнале была частота 100 Гц, она бы почти не сдвинулась во времени. Фазовые искажения - большой и почти единственный серьезный минус IIR фильтров.
Чего ни в коем случае не нужно делать:
- Без нужды использовать IIR фильтры высокого порядка. Фазовые искажения такого масштаба - очень неприятная штука.
Во многих программах, например в SoundForge, надо быть особо осторожным - там не задается порядок фильтра, а задается лишь желаемая резкость перехода. Если вы скажете ему в параметрическом эквалайзере что-то вроде того, что хотите уменьшить частоты от 49 до 51 Гц на 60 дБ, при этом не трогая частоты уже 48 и 52 Гц - он вам вломит фильтр такого огромного порядка, что вы потом свой звук вообще не узнаете.
[примечание: в версиях, начиная с 4.0, в SoundForge в этом месте (да и практически везде) начали применяться другие фильтры - так называемые windowed-sinc фильтры - частный случай FIR фильтров, которые уже не вносят фазовых искажений (см. далее). Сейчас встретить IIR фильтры в чистом виде можно, в основном, только в программах, ориентированных на обработку звука в реальном времени - они очень быстры)]
Для чего они нужны:
- Слабые фильтры (с порядком 2 - 3) - хорошее средство для уменьшения высоких или низких частот с определенной частоты. Что и применяется в параграфических эквалайзерах (high-shelf и low-shelf).
- В принципе, с помощью этих фильтров не очень высокого порядка можно слегка (на пару дБ) вырезать определенные частоты. Стоит разобраться, какие искажения вам более предпочтительны - фазовые задержки (IIR) или временные (FFT фильтрация).
- Для фильтрации частот вне слышимой области (или в не очень важной области). Фазовые искажения на далеком расстоянии от границы фильтрации минимальны, поэтому если вы работаете с файлом в 192 кГц и хотите убрать все частоты выше 57 кГц (ну хочется вам.. :) - можете смело использовать там IIR фильтр 30-го порядка.
- В виде слабых фильтров второго порядка (параграфические эквалайзеры) - изменять тональную окраску звука там, где требуется точность по частоте (эти фильтры можно настроить очень точно даже в области низких частот).
- Ими удобно, например, гасить резонансы чего-то с чем-то. Или убирать DTFM частоты (специальные Notch фильтры) - обычно для этого используется фильтры с порядками 2 - 6.
В любом случае - фильтры порядка более 4 не следует использовать с большим энтузиазмом. Не нужно без нужды вносить фазовые искажения. Фильтры малых порядков - довольно безобидная штука, но они имеют плавные границы воздействий и сравнительно слабый эффект в несколько дБ (этого, однако, почти всегда достаточно при правильной постановке задачи). IIR фильтры всегда так или иначе вносят фазовые искажения, но при правильном применении эти искажения незаметны - искажения фазы (задержки) до сотен градусов ухо не замечает.
FIR фильтры
От Finite Impulse Response - 'конечная отдача импульса'. Эти фильтры реализованы через процесс, называемый сверткой (convolution): есть таблица размера n, которая комбинирует (складывает) последние n точек функции в одну выходную точку, умножая каждую из них на определенное число - весовой коэффициент. Таблица свертки строится один раз в начале по требуемому частотному воздействию.
[На самом деле влоб делать свертку очень медленно. Применяется другой процесс, для больших сверток в сотни раз более быстрый, но полностью аналогичный этому - FFT, умножение в частотном пространстве, обратный синтез].
Эти фильтры обычно применяются в диалогах типа эквалайзера. Иногда каждому движку (регулятору усиления определенной частоты) соответствует свой фильтр, воздействующий на определенные частоты, иногда - синтезируется таблица свертки на основе всех движков сразу, то есть применяется один сложный фильтр.
FIR фильтры - то, ради чего стоило вообще придумывать цифровую фильтрацию. Это наиболее безопасный и надежный из всех процессов, имеющий лишь одно слабое место - трудно управляемые параметры фильтрации. Сделать фильтр именно до мелочей такой, какой нам нужно, особенно в области низких частот, может оказаться излишне трудоемким, что приведет к очень медленной обработке. Для этого придется использовать слишком большие размеры свертки, а это замедлит до трудно терпимой скорости даже в сотни раз ускоренный процесс. Однако сверхсильная точность не всегда нужна, а очень хорошую точность обработки за приемлемое время он всё же обеспечивает.
Кроме слабой управляемости к недостаткам можно отнести невысокую скорость работы фильтров с большой сверткой (более точных фильтров). В принципе, сделав огромную свертку, мы получим именно такой фильтр, как мы хотим, но фильтровать он будет почти вечно. В этом, а не в чем либо другом, кроется причина того, что эти фильтры используются лишь в эквалайзерах - там не нужна особая точность, важны лишь общие тенденции, которые неплохо соблюдаются и с маленькими свертками.
Исходный сигнал
После FIR фильтра
Можно убедится в том, что фильтр совершенно не затронул те сигналы, которые не должен был затрагивать. Правильно сконструированный FIR фильтр не влияет на фазу. В общем можно сказать так: эти фильтры делают именно то, что должны делать, и ничего более.
О точности FIR фильтров:
Во многих программах есть параметр 'точность' (accuracy), иногда она даже напрямую измеряется в точках (points) - числе элементов свертки, или convolution length (size). Этот параметр влияет только на точность фильтра. Это не качество, это то, с какой точностью фильтр выполняет ваш заказ. Если вы воздействуете на глубокий бас (около 40-50 Гц) - вам потребуются большие свертки (около 4000 точек) или самое качественное значение. Если вы работаете лишь с частотами выше 5 кГц - вам хватит свертки в 500 точек, которая будет работать значительно быстрее. Если вы хотите влиять на басы и поставите свертку 200 точек - единственное, что пойдет не так - фильтр просто не будет воздействовать на басы должным образом, вот и всё. Потери качества обработки не будет, будет лишь потеря смысла.
Для чего они нужны:
- Ответ очень простой. Если вы можете сделать то, что вам нужно, с помощью FIR фильтра - делайте это. Более корректного отношения к необрабатываемым сигналам другими фильтрами не добиться.
Целесообразно действовать так: сначала с помощью любых фильтров понять, что вам нужно, а потом попытаться воплотить это с помощью FIR фильтров. Это наиболее качественная и корректная настраиваемая фильтрация из всех возможных. Именно на таких фильтрах работают качественные цифровые эквалайзеры, тогда как аналоговые - на IIR, единственных фильтрах, которые можно реализовать в аналоговой схеме.
Единственное что - не пытайтесь применить FIR фильтры для точной фильтрации. Они могут это делать, так же идеально как и обычную обработку, но слишком медленно. Для работы с конкретными заданными частотами приходится использовать FFT или IIR фильтрацию.