7.4 Фильтры нижних частот
Простейшим фильтром нижних частот является RC – фильтр, схема которого и его частотные характеристики представлены на рис. 68. Комплексная амплитуда Y(ω) выходного напряжения y(t) связана с комплексной амплитудой Z(ω) входного напряжения z(t) соотношением, обычным для схемы делителя напряжения:

.
АФЧХ фильтра составляет:

.
Произведение активного сопротивления фильтра на емкость конденсатора имеет размерность времени и называется постоянной времени T=RC, обратная величина
образует круговую частоту среза. Соответствующая линейная частота равна
. АЧХ и ФЧХ фильтра составляют соответственно:

,

.
Графики АЧХ и ФЧХ фильтра представлены на рис. 7.4 при частоте среза
. При условии
АЧХ фильтра принимает значение
.
Диапазон частот от 0 до
называется полосой пропускания или диапазоном прозрачности фильтра, диапазон частот от
до бесконечности образует полосу задержания. В полосе пропускания АЧХ фильтра изменяется в диапазоне от единицы до 0.707, в полосе задержания – от 0.707 до нуля.
Простейший RC – фильтр еще очень далек от идеального фильтра. Однако и такой фильтр способен в значительной степени повысить отношение «сигнал – шум».
Пусть, например, на вход фильтра подается сигнал
в смеси с высокочастотным шумом
, то есть

.
Мощность гармонического колебания равна половине квадрата амплитуды, поэтому отношение «сигнал – шум» равно 100. На выходе фильтра образуется сигнал:

Полезный сигнал немного уменьшился по амплитуде, но отношение «сигнал – шум» увеличилось до 400, то есть в четыре раз.
Н
а рис. 7.5 изображен график
сигнала
в аддитивной смеси с шумом
. Видно, что гармоника сильно искажена. Рядом нарисован выходной сигнал фильтра низких частот с граничной частотой
— результат фильтрации. Получается почти чистая гармоника, но она запаздывает по времени относительно исходного сигнала. Это запаздывание равно постоянной времени фильтра, то есть 0.001 с.
Для более четкой фильтрации используются фильтры более высоких порядков. Наибольшее распространение получили следующие типы фильтров низких частот.
1
.Фильтры Баттерворда – фильтры с максимально плоской амплитудно – частотной характеристикой в полосе пропускания. АЧХ фильтра Баттерворда порядка
определяется выражением

,
где n – порядок фильтра. При
усиление фильтра равно
не зависимо от порядка фильтра. Поэтому АЧХ фильтров Баттерворда любого порядка проходят через одну и ту же точку, отделяющую полосу пропускания фильтра от полосы задержания (рис. 70).
На рис. 7.6 представлены графики АЧХ фильтров Баттерворда порядков
при одной и той же частоте среза
. Приn=1 имеем уже рассмотренный простейший RC – фильтр с довольно пологой характеристикой. По мере увеличения порядка фильтра крутизна спада его амплитудно – частотной характеристики возрастает, полосы пропускания и задержания вырисовываются все более четко.
Анализ графиков на рис. 7.6 позволяет также сделать вывод о том, что не имеет большого смысла повышать порядок фильтра выше четвертого, поскольку при больших порядках фильтра крутизна спада его АЧХ возрастает все более и более медленно.
Проектирование фильтра Баттерворда заключается в следующем:
- выбирается порядок фильтра в зависимости от требуемой крутизны спада его амплитудно – частотной характеристики,
- подбирается электронная схема построения фильтра,
- подбираются параметры схемы, при которых АЧХ фильтра совпадает с АЧХ фильтра Баттерворда соответствующего порядка.
Так на рис. 7.7 представлен активный фильтр низких частот 2-го порядка по схеме Саллена – Ку. Фильтр состоит из операционного усилителя AR3, охваченного соответствующим образом сформированными цепями положительной и отрицательной обратных связей. Емкости и сопротивления резисторов принимаются одинаковыми и равными С4=С5=C и R8=R9=R, сопротивления плеч делителя напряжения на выходе схемы принимаются равными R6 и R7=(α-1)·R6. АФЧХ фильтра Саллена – Ку имеет следующее выражение:
. Вычислим амплитудно – частотную характеристику фильтра: 
Для того, чтобы рассматриваемый фильтр стал фильтром Баттерворда 2-го порядка, необходимо, чтобы коэффициент при
в знаменателе этого выражения обратился в нуль:
В этом случае амплитудно – частотная характеристика фильтра повторяет АЧХ фильтра Баттерворда 2-го порядка с частотой среза
:
. Уже из этого примера видно, что построение хорошего фильтра требует его точной регулировки (выбора соотношения плеч делителя напряжения R6, R7) и точной подгонки значений емкостей и сопротивлений. Еще более сложной задачей является построение и регулировка фильтров более высокого порядка. Поэтому редко используются фильтры Баттерворда порядка выше пятого. 2. Фильтры Чебышева 1-го рода. О
сновой построения фильтров Чебышева являются полиномы Чебышева
порядкаn. Они замечательны тем, что на интервале значений переменной
колеблются между –1 и +1 вне зависимости от порядка полиномов. Именно это обстоятельство, как мы увидим немного позднее, и позволяет построить фильтры с заранее заданными свойствами. Первые шесть полиномов Чебышева
имеют следующий вид:
О
ни изображены графически на рис. 7.8. Порядок полинома совпадает с его наивысшей степенью. С увеличением порядка полинома он приобретает все более колебательный характер, изменяясь от –1 до +1 и все более круто возрастая по мере приближения аргумента к единице. Фильтром Чебышева 1-го рода порядка n называется фильтр, амплитудно – частотная характеристика которого описывается выражением
где ε – коэффициент, определяющий неравномерность амплитудно – частотной характеристики фильтра в полосе пропускания. В полосе пропускания АЧХ колеблется в диапазоне от 1 до
, а за пределами полосы пропускания монотонно убывает до нуля. На рис. 7.9 представлены амплитудно – частотные характеристики фильтров Чебышева первых шести порядков при ε=0.4 для частоты среза
. Видно, насколько велика крутизна спада АЧХ при частотах, больших частоты среза. Повышение порядка фильтра делает спад все более и более крутым, однако не имеет большого смысла увеличивать порядок фильтра свыше пятого.
Проектирование фильтра Чебышева заключается в следующем:
- выбирается частота среза и порядок фильтра в зависимости от требуемой крутизны спада его амплитудно – частотной характеристики,
- подбирается электронная схема построения фильтра,
- подбираются параметры схемы, при которых АЧХ фильтра совпадает с АЧХ фильтра Чебышева соответствующего порядка.
Так АЧХ фильтра Чебышева 2-го порядка должна иметь вид:
. Если для построения фильтра использовать схему Саллена — Ку, представленную на рис. 71, с амплитудно – частотной характеристикой
, то, приравнивая коэффициенты при соответствующих степенях частоты, получим:
,
Этих соотношений достаточно для определения всех параметров фильтра. 3. Фильтры Чебышева 2-го рода или инверсные фильтры Чебышева. Выражение для амплитудно – частотной характеристики фильтра имеет несколько иной вид: 
. Благодаря такой структуре амплитудно – частотная характеристика фильтра плавно спадает в полосе пропускания до значения
и затухает до нуля, колеблясь в соответствии с характером изменения полинома Чебышева. На рис. 7.9 представлены амплитудно – частотные характеристики инверсных фильтров Чебышева первого, третьего и пятого порядков, построенные при ε=10 для частоты среза
. В отличии от предыдущего случая полоса пропускания здесь гораздо меньше частоты среза и существенно зависит от порядка фильтра, но в области затухания АЧХ отличается от нуля не более, чем на
.
50)Преобразование фильтров. Изменение частоты среза фнч
Мы рассмотрели несколько известных фильтров – фильтр Баттерворта, фильтр Чебышева первого рода, фильтр Чебышева второго рода, эллиптический фильтр.
Оказывается, что с помощью нескольких рассмотренных фильтров можно получить огромное количество других фильтров, с иными свойствами. За основу берется передаточная функция H(s) исходного фильтра. Затем производится некоторое математическое преобразование над комплексным аргументом s. .
Здесь L(s) – некоторое преобразование. В результате появляется другая передаточная функция . Эта новая передаточная функция описывает новый фильтр со свойствами отличными от исходного фильтра.
Поэтому одним из способов получения новых фильтров, является нахождение нужного преобразования L.
Изменение частоты среза низкочастотного фильтра ФНЧ

Ч астотную характеристику ФНЧ можно сжимать и растягивать вдоль оси частот простым масштабированием частотной оси. Для этой цели подойдет простое линейное преобразование . Здесь w0 — задаваемая частота среза. На рисунке показаны АЧХ двух эллиптических фильтров со следующими частотами среза w0 = 1рад/с и w0 = 3рад/с.
Из рисунка видно, что вторая АЧХ получена из первой АЧХ путем растяжения в три раза.
Так как меняются коэффициенты bn , an фильтра, то меняются так же нули и полюса фильтра. На следующих двух рисунках показаны в комплексной s — плоскости нули и полюсы первого и второго фильтров.

51)Преобразование фнч в фильтр высокой частоты фвч
Из фильтра низкой частоты можно получить фильтр высокой частоты с помощью следующего преобразования. здесь w0 — задаваемая частота среза.
На первом рисунке показана АЧХ исходного эллиптического ФНЧ. На втором рисунке показана АЧХ фильтра высоких частот ФВЧ полученного из первого фильтра с помощью преобразования. Частота среза взята равной w0 = 40рад/с.


И з рисунков видно, что действительно простое преобразование позволило получить из фильтра низких частот фильтр высоких частот. Посмотрим, как изменяются нули и полюсы передаточной функции при этом преобразовании. Нули Im(s)

Первое, на что следует обратить внимание, это то, что число нулей и полюсов осталось прежним, 4 нуля и 5 полюсов. Второе, численные значения нулей и полюсов изменились.
Третье, взаимное расположение нулей и полюсов в комплексной плоскости так же изменилось. Четвертое, полюса обоих фильтров лежат в левой части комплексной плоскости. Для аналоговых фильтров условие устойчивости сводится к тому, чтобы полюсы передаточной функции имели отрицательную мнимую часть .
Таким образом, преобразование из устойчивого фильтра низких частот, позволяет получить устойчивый фильтр ФВЧ.
52)Преобразование фнч в полосовой фильтр
Чтобы получить передаточную функцию полосового фильтра из передаточной функции ФНЧ, нужно использовать следующее преобразование.
Полосовой фильтр характеризуется нижней границей w1 полосы пропускания, и верхней границей полосы w2 пропускания. Параметры преобразования связаны с нижней и верхней границами полосы пропускания полосового фильтра следующими соотношениями: . Частоты нижней и верхней границ полосы пропускания полосового фильтра взяты равными следующим величинам w1 = 10рад/с и w2 = 30рад/с.


И з рисунков видно, что преобразование позволило получить из ФНЧ полосовой фильтр. Посмотрим, как изменяются нули и полюсы передаточной функции при этом преобразовании. Нули Im(s).
13.4. Реализация фильтров нижних и верхних частот второго порядка
На основании выражения (13.11) запишем в общем виде передаточную функцию фильтра нижних частот второго порядка:

Как следует из табл. 13.6, оптимальные передаточные функции второго и более высокого порядка характеризуются наличием комплексно-сопряженных полюсов. В разд. 13,1 было отмечено, что такие передаточные функции не могут быть реализованы с помощью пассивных RС- цепей. Один из способов реализации подобных фильтров состоит в применении индуктивностей, как показано в следующем разделе.
Запишем передаточную функцию цепи, изображенной на рис. 13.14:

Для расчета значений R и С с учетом (13.17) получим следующие формулы:

Для фильтра нижних частот второго порядка типа фильтра Баттерворта коэффициенты равны a1=1,414 и b1=1,000 (см. табл. 13.6). Задав частоту среза фильтра fg = 10 Гц и емкость конденсатора С = 10мкФ, на основании приведенных выше расчетных формул получим R = = 2,25 кОм и L = 25,3 Гн. Известно, что такой фильтр чрезвычайно неудобен для реализации из-за большой величины индуктивности. Избежать применения индуктивностей можно, используя их аналоги в виде активных RС-цепей. Для этого можно применить схему гиратора (рис. 12.32). Однако такое схемное решение оказывается весьма дорогостоящим.
Заданную передаточную функцию можно реализовать гораздо проще с помощью операционного усилителя с соответствующими RС-цепями, что позволяет исключить применение аналога индуктивности.

Рис. 13.14. Пассивный фильтр нижних частот второго порядка.
13.4.2. ФИЛЬТР СО СЛОЖНОЙ ОТРИЦАТЕЛЬНОЙ ОБРАТНОЙ СВЯЗЬЮ
Передаточная функция активного фильтра нижних частот, изображенного на рис. 13.15, имеет вид

Приравняв коэффициенты этой передаточной функции коэффициентам выражения (13.17), получим

Для расчета фильтра можно, например, задать значения сопротивлений R1 и R3 и пo приведенным формулам вычислить значения R2, С1 и С2. Как видно, расчетные формулы справедливы для произвольных положительных значений a1 и b1. Коэффициент передачи постоянного сигнала Аo фильтра оказывается отрицательным, поэтому прошедший через фильтр низкочастотный сигнал будет инвертирован.
Чтобы реальная схема фильтра имела желаемую амплитудно-частотную характеристику, входящие в нее элементы могут быть подобраны с не очень высокой точностью. Что касается сопротивлений, то при их подборе никаких проблем не возникает, поскольку их номиналы (для стандартного ряда Е96) задаются с однопроцентным допуском. Несколько хуже обстоит дело с конденсаторами. Допуск их номинальных значений, как правило, составляет 10% и более (для доступного стандартного ряда Е6). В связи с этим гораздо лучше при расчете схемы задавать значения емкостей конденсаторов и вычислять необходимые значения сопротивлений. Поэтому решим уравнения относительно сопротивлений:

Для того чтобы значение сопротивления R2 было действительным, должно выполняться условие


Рис.13.15. Активный фильтр нижних частот второго порядка со сложной отрицательной обратной связью.
При выполнении этого условия в процессе расчета фильтра не следует выбирать отношение С2/С1 много большим величины, стоящей справа. Характеристики фильтра мало зависят от точности подбора номиналов его элементов, поэтому рассмотренная схема может, быть рекомендована для реализации фильтров с высокой добротностью.
13.4.3. ФИЛЬТР С ПОЛОЖИТЕЛЬНОЙ ОБРАТНОЙ СВЯЗЬЮ
Активный фильтр может быть также построен на основе операционного усилителя с положительной обратной связью.

Рис. 13.16. Активный фильтр нижних частот второго порядка с положительной обратной связью.
При этом, разумеется, коэффициент усиления операционного усилителя должен иметь строго определенное значение. Отрицательная обратная связь, сформированная с помощью делителя напряжения R3, (—1)R3 (рис. 13.16), обеспечивает коэффициент усиления, равный . Положительная обратная связь обусловлена наличием конденсатора С2. Передаточная функция фильтра описывается следующим выражением;

Расчет схемы фильтра существенно упрощается, если с самого начала задать некоторые дополнительные условия. Можно выбрать величину усиления = 1. Тогда (—1)R3 = 0, и оба сопротивления R3 в делителе напряжения можно исключить. Такой операционный усилитель с отрицательной обратной связью, обеспечивающей единичное усиление, выпускается в виде микросхемы, представляющей собой повторитель напряжения (LM 310). Часто для этой цели достаточно использовать простой преобразователь полного сопротивления, например в виде схемы Дарлингтона. При этом можно построить фильтр для мегагерцевого диапазона. В рассматриваемом случае (при = 1) передаточная функция фильтра принимает вид

Считая, что емкости конденсаторов cC1 и С2 заданы, получим


Чтобы значения R1 и R2 были действительными, должно выполняться условие

Как и в случае фильтра со сложной отрицательной обратной связью, не следует выбирать отношение С2/С1 много большим значения правой части последнего неравенства.
Расчеты можно также упростить, положив R1= R2 = R и С1 = С2 = С. В этом случае для реализации фильтров различного типа необходимо изменять значение коэффициента . Передаточная функция фильтра будет иметь вид

Отсюда с учетом формулы (13.17) получим

Из последнего соотношения видно, что коэффициент зависит от добротности полюсов и не зависит от частоты среза. Величина в этом случае определяет тип фильтра. Таким образом, выбрав в табл. 13.6 значения коэффициентов a1 и b1 для конкретного фильтра, необходимо задать соответствующее значение . Эти значения коэффициента усиления приведены в табл.13.7. При = 3 схема работает в режиме генерации сигнала с частотой f = 1/2RC. Отметим, что установка коэффициента усиления тем труднее, чем он ближе к значению = 3.


Рис. 13.17. Активный фильтр верхних частот второго порядка с положительной обратной связью.
Поэтому особенно тщательно следует настраивать коэффициент усиления при реализация фильтра Чебышева. Это является существенным недостатком рассматриваемой схемы фильтра нижних частот. Положительным моментом является то, что для построения фильтров различного типа достаточно изменить лишь значение а при одних и тех же R и С. Кроме того, в этой схеме очень просто изменять частоту среза, используя сдвоенный потенциометр для одновременного изменения сопротивлений R1 и R2 на рис. 13.16.
Поменяв местами сопротивления и емкости, получим фильтр верхних частот (рис. 13.17). Его передаточная функция имеет вид

Для упрощения расчетов положим = 1 и C1 = С2 = С. При этом получим следующие расчетные формулы:

13.4.4. ФИЛЬТР НИЖНИХ ЧАСТОТ С ОМИЧЕСКОЙ OTРИЦАТЕЛЬНОЙ ОБРАТНОЙ СВЯЗЬЮ
В разд. 13.3 были изучены вопросы реализации фильтра нижних частот первого порядка для высоких частот среза, в результате чего оказалось возможным использовать для этой цели амплитудно-частотную характеристику дифференциального коэффициента усиления скорректированного операционного усилителя и вводить лишь омическую отрицательную обратную связь. То же можно сделать и для фильтра нижних частот второго порядка с комплексными полюсами. На рис. 13.18 приведена схема такого фильтра на двух операционных усилителях, охваченных общей омической отрицательной обратной связью.
Частоту fT обоих усилителей следует выбирать как можно большей. Запишем передаточную функцию этого фильтра с учетом формулы (13.15):


Рис. 13.18. Активный фильтр нижних частот второго порядка с омической отрицательной обратной связью.
Приравнивая коэффициенты передаточных функций (13.18) и (13.17), получим

Отсюда следует, что формулы для расчета элементов схемы будут иметь вид

При расчете схемы задают отношение fg/fT0,1, для того чтобы получить достаточно широкую полосу при большом сигнале. Для получения требуемой частоты среза необходимо рассчитать значения двух корректирующих конденсаторов Сk (см. разд. 13.3). Далее по формуле (13.19) вычисляется коэффициент . Его значение должно лежать в диапазоне 0,01-0,1. Если это условие не выполняется, следует изменить fg/fT или ao. Задав далее величину сопротивления R, по формулам (13.20а) и (13.20б) вычисляют значения сопротивлений R2 и R3.
Рассмотрим пример расчета фильтра Баттерворта нижних частот с частотой среза 100кГц и коэффициентом передачи постоянного сигнала ao = — 2. Положим fg/fT = 0,1; следовательно, частота fT равна 1МГц. Выберем из табл. 13.6 параметры передаточной функции фильтра: а1=1,4142 и b1 = 1. Тогда из формулы (13.19) получим = 0,035. Задав значение сопротивления R1, равное 1 кОм, из формул (13.20а) и (13.206) получим R2 = 4,04 кОм и R3 = 2,0 кOм.
Программирование&Музыка: Частотный фильтр Баттервота. Часть 3
Всем привет! Вы читаете третью часть статьи про создание VST-синтезатора на С#. В предыдущих частях был рассмотрен SDK и библиотеки для создания VST плагинов, рассмотрено программирование осциллятора и ADSR-огибающей для управления амплитудой сигнала.
В этой части я расскажу, как рассчитать и закодить фильтр частот, без которого не обходится ни один синтезатор. А без эквалайзера немыслима обработка звука.
Будет рассмотрен исходный код и применение эквалайзера из библиотеки NAudio (библиотека для работы со звуком под .NET).
Внимание — будет много матана — будем рассчитывать формулы для коэффициентов фильтра.

Скриншот VST плагина-эквалайзера Fab Filter Pro Q
Цикл статей
- Понимаем и пишем VSTi синтезатор на C# WPF
- ADSR-огибающая сигнала
- Частотный фильтр Баттервота
- Delay, Distortion и модуляция параметров
Оглавление
- Эквалайзер
- Фильтрация через преобразование Фурье
- Цифровые фильтры
- Почему фильтр Баттервота?
- Вывод формулы фильтра НЧ
- Вывод формулы фильтра ВЧ и полосового фильтра
- Программирование фильтра Баттервота по полученным формулам
- Полосовой эквалайзер в библиотеке NAudio
- Программы для рассчета фильтров
- Список литературы
Эквалайзер
Часто при обработке звука мы хотим изменить его характер/окраску/тембр. Сделать звук более басовым, убрать верхние частоты, или наоборот, сделать звук «прозрачным», оставив лишь середину и верха. Уверен, многие люди, не работавшие с обработкой звука, знают что такое эквалайзер — они есть акустических колонках, музыкальных центрах, магнитофонах, плеерах, и т.д. Эквалайзер — это набор фильтров, каждый из которых изменяет амплитуду сигнала в его выбранной полосе частот. На бытовых колонках это, обычно, 2-3 крутилки — низкие частоты, средние и верха, с фиксированными полосами частот.
В Winamp’овском эквалайзере уже есть 10 заранее определенных полос.

Скриншот эквалайзера в плеере Winamp
В мире обработки звука существует множество плагинов-эквалайзеров, на любой вкус и цвет. Плагин Fab Filter Pro Q (скриншот в начале статьи) — это графический эквалайзер, позволяющий создавать большое число полос и редактировать их параметры.
Каждая полоса в эквалайзере — это, по сути, фильтр частот. Фильтры частот изменяют тембральные/частотные характеристики сигнала. В электронике существуют много типов и классификаций фильтров, с соответствующими характеристиками и параметрами — смотрим википедию.
Мы рассмотрим и запрограммируем самые простые фильтры: НЧ, ВЧ и полосовой фильтры.
Фильтрация через преобразование Фурье
По идее, вам никто не мешает делать с сигналом дискретное преобразование Фурье, обработать частоты и затем сделать обратное преобразование.
Если не думать над реализацией ДПФ, то такой подход я бы назвал достаточно интуитивным и простым в программировании (опять же, если взять ДПФ из какой-нибудь либы и не кодить самому).
Минусы подхода — во-первых, ДПФ принимает на вход массив из семплов, размер которого является степенью двойки. Это значит, что выходной сигнал уже будет с задержкой. Во вторых, каждый 512-й семпл мы будем производить данный алгоритм: ДПФ, обработка частот сигнала, обратное ДФП. Это не малые вычисления. В-третьих, есть еще минусы и тонкости, которые знают адепты цифровой обработки сигналов.
Мы не будем рассматривать применение ДПФ, а заглянем в теорию цифровых фильтров; напишем фильтр, который обрабатывает значения семплов и имеет линейную вычислительную сложность в зависимости от длины входящего массива семплов.
Цифровые фильтры
Большую часть информации и вывод формул я взял из книги Digital Signal Processing: A Practical Approach — очень рекомендую, она есть в русской версии — Цифровая обработка сигналов. Практический подход, заинтересованные найдут PDF в сети.
Хочу сделать важное замечание. Тема построения и рассчитывания фильтра действительно очень сложна, содержит массу тонкостей и нюансов, требует знания и понимания теории. В этой статье я покажу, как рассчитать формулы фильтра Баттервота, чтобы у читателя возникло понимание, откуда выводятся эти формулы. Но почему именно такие исходные формулы, почему именно такие замены — можно понять лишь погрузившись в глубокую теорию цифровой обработки сигналов.
Когда я начинал гуглить код фильтров, я сразу находил множество непонятного математического кода, и хотелось хоть чуть-чуть понять, откуда берутся такие рассчетные формулы. Осциллятор, огибающая, дилей — понимание и программирование работы этих составляющих лично мне кажется интуитивным, но только не фильтров. Этой статьей я хочу пробудить интерес к цифровой обработке сигналов) Буду рад, если возникнет желание разобраться в этой теме более основательно.

Аппроксимация АЧХ идеального фильтра (картинка из советского учебника, не нашел исходник)
Фильтр изменяет сигнал, «убирая» в нем выбранные частоты. Существующие фильтры не идеальны. Полоса пропускания — полоса частот, которую фильтр «не затрагивает» (на графике есть некоторая изменения — особенность неидеального представленного фильтра). Полоса подавления — полоса нежелательных частот. В полосе перехода происходит спад частот. Естественно, фильтр ближе к «идеальному» тем, насколько меньше он искажает полосу пропускания, насколько сильно он подавляет частоты в полосе подавления и насколько узка полоса перехода. Есть разные «приближения» фильтров — фильтр Чебышёва, Баттервота, и так далее — их вы найдете в книжках и на просторах сети.
Почему фильтр Баттервота?
Все очень просто, АЧХ фильтра Баттерворта максимально гладкая на частотах полосы пропускания — имхо, важнее всего не испортить сигнал в полосе пропускания.

Логарифмическая АЧХ для фильтров Баттерворта нижних частот разных порядков (скриншот взят с Википедии)
Вывод формулы фильтра НЧ
Передаточная функция для фильтра Баттервота на s-плоскости записывается следующими формулами:
при четных n и
при нечетных n
Здесь n — порядок фильтра: амплитуда на частоте среза w равна -3n dB, амплитудно-частотная характеристика затухает на −6n dB на октаву.
Чтобы получить сверточные коэффициенты, нужно получить передаточную функцию на z-плоскости в виде
Найдем передаточную функцию для фильтра второго порядка (затухание на -6 dB на октаву), подставляем в формулу для H(s) n = 2:
Тогда свертка для фильтра будет выглядеть так:
Пусть нам заданы частота среза w (на которой амплитуда сигнала будет -3 dB) и Fc — частота дискретизации (число семплов в секунду), в герцах.
В формуле нужно использовать денормированные частоты, т.е. произвести замену (в полосовом фильтре будут две частоты w1 и w2, определяющие полосу пропускания):
Если мы хотим рассчитывать НЧ-фильтр, то нужно сделать преобразование — произвести замену параметра s в передаточной функции:
Для рассчета других типов фильтров (ВЧ, полосового, режекторного) нужно делать другие замены. Они рассмотрены в книге Цифровая обработка сигналов. Практический подход в части 8.8.2 и далее в статье.
Далее, для перехода в z-плоскость делаем замену:
Для аналитических рассчетов я использовал пакет Mathematica.

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

Найдем коэффициенты при степенях у полученных полиномов, используя функцию CoefficientList:

Если все делать честно, то, по условию, a0 должен быть равен 1 — поделим на a0 все коэффициенты (для кодинга будем использовать предыдущие формулы без деления):

Вывод формулы фильтра ВЧ и полосового фильтра
Вывод формул для ВЧ-фильтра аналогичен НЧ-фильтру с другим преобразованием:

Для вывода формул полосового фильтра применяется преобразование:
Если производить замену, то степень полиномов в числителе и знаменателе H(z) удвоится (в замене есть s^2), значит порядок фильтра увеличится вдвое. Поэтому изначально используем функцию H(s) для n = 1:

Программирование фильтра Баттервота по полученным формулам
Фильтр будет иметь 2 параметра: тип фильтра (НЧ, ВЧ, полосовой) и частота среза w. Для полосового фильтра будем рассматривать частоту среза как частоту посередине полосы пропускания. Полосу пропускания же определим как отрезок частот [w — w/4, w + w/4] (можно придумать здесь более сложный и логичный здесь логарифмический закон, на ваше усмотрение).
Пусть мы определили коэффициенты b0, b1, b2, a1 и a2 (a0 по условию равен 1) по рассчитанным формулам. Алгоритм работы фильтра сводится к свертке, которая делается последовательно для каждого семпла:
y(n) — это новое значение семпла, которое нужно рассчитать. x(n) — текущее значение семпла, соответственно y(n-1) и y(n-2) — предыдущие 2 рассчитанных семпла, а x(n-1) и x(n-2) — предыдущие входные значения семплов.
Нужно организовать запоминание предыдущих семплом. Не будем мудрить с циклическими буферами, сделаем просто и понятно: два массива из трех элементов. Каждый раз будем «проталкивать» новые значения в этот массив, последовательно копируя более старые значения семплов.
Получаем простой класс:
class BiquadConvolutionTable < public double B0, B1, B2, A1, A2; private readonly double[] _x = new double[3]; private readonly double[] _y = new double[3]; public double Process(double s) < // "сдвигаем" предыдущие семплы _x[2] = _x[1]; _x[1] = _x[0]; _x[0] = s; _y[2] = _y[1]; _y[1] = _y[0]; // свертка _y[0] = B0 * _x[0] + B1 * _x[1] + B2 * _x[2] - A1 * _y[1] - A2 * _y[2]; return _y[0]; >>
Напишем каркасный класс для фильтра (смотри архитектуру синтезатора в первой статье). Класс BiquadConvolutionTable работает с одним сигналом, т.е. с одним каналом — моно. Поэтому нам нужны две BiquadConvolutionTable — для левого и правого каналов.
Чтобы корректно применить фильтр, нужно последовательно, для всех семплов входящей последовательности применить функцию BiquadConvolutionTable.Process и заполнить результирующий массив семплов.
Рассчетом коэффициентов для BiquadConvolutionTable будет заниматься функция CalculateCoefficients.
public enum EFilterPass < None, LowPass, HiPass, BandPass >public class ButterworthFilter : SyntageAudioProcessorComponentWithParameters, IProcessor < private readonly BiquadConvolutionTable _tablel; private readonly BiquadConvolutionTable _tabler; public EnumParameterFilterType < get; private set; >public FrequencyParameter CutoffFrequency < get; private set; >public ButterworthFilter(AudioProcessor audioProcessor) : base(audioProcessor) < _tablel = new BiquadConvolutionTable(); _tabler = new BiquadConvolutionTable(); >public override IEnumerable CreateParameters(string parameterPrefix) < FilterType = new EnumParameter(parameterPrefix + "Pass", "Filter Type", "Filter", false); CutoffFrequency = new FrequencyParameter(parameterPrefix + "Cutoff", "Filter Cutoff Frequency", "Cutoff"); return new List ; > public void Process(IAudioStream stream) < if (FilterType.Value == EFilterPass.None) return; var count = Processor.CurrentStreamLenght; var lc = stream.Channels[0]; var rc = stream.Channels[1]; for (int i = 0; i < count; ++i) < var cutoff = CutoffFrequency.Value; CalculateCoefficients(cutoff); var ls = _tablel.Process(lc.Samples[i]); lc.Samples[i] = ls; var rs = _tabler.Process(rc.Samples[i]); rc.Samples[i] = rs; >> private void CalculateCoefficients(double cutoff) < . >>
Функция CalculateCoefficients вызывается каждый раз в цикле — зачем? В следующей статье я расскажу про модуляцию (изменение во времени) параметров, и поэтому, частота среза может меняться, а значит, нужно перерассчитывать коэффициенты. Конечно, по-трушному, нужно подписаться на изменение частоты среза и уже в обработчике рассчитывать коэффициенты. Но в этих статьях я оптимизами заниматься не буду, цель — закодить фильтр.
Осталось закодить функцию CalculateCoefficients по рассчитаным формулам для коэффициентов.
Вспомним, что нужно использовать денормированные частоты, т.е. произвести замену:
Списываем все формулы для коэффициентов b0, b1, b2, a0, a1, a2. После рассчетов нужно поделить все коэффициенты на a0, чтобы a0 стало равно 1.
private double TransformFrequency(double w) < return Math.Tan(Math.PI * w / Processor.SampleRate); >private void CalculateCoefficients(double cutoff) < double b0, b1, b2, a0, a1, a2; switch (FilterType.Value) < case EFilterPass.LowPass: < var w = TransformFrequency(cutoff); a0 = 1 + Math.Sqrt(2) * w + w * w; a1 = -2 + 2 * w * w; a2 = 1 - Math.Sqrt(2) * w + w * w; b0 = w * w; b1 = 2 * w * w; b2 = w * w; >break; case EFilterPass.HiPass: < var w = TransformFrequency(cutoff); a0 = 1 + Math.Sqrt(2) * w + w * w; a1 = -2 + 2 * w * w; a2 = 1 - Math.Sqrt(2) * w + w * w; b0 = 1; b1 = -2; b2 = 1; >break; case EFilterPass.BandPass: < var w = cutoff; var d = w / 4; // определим полосу фильтра как [w * 3 / 4, w * 5 / 4] var w1 = Math.Max(w - d, CutoffFrequency.Min); var w2 = Math.Min(w + d, CutoffFrequency.Max); w1 = TransformFrequency(w1); w2 = TransformFrequency(w2); var w0Sqr = w2 * w1; // w0^2 var wd = w2 - w1; // W a0 = -1 - wd - w0Sqr; a1 = 2 - 2 * w0Sqr; a2 = -1 + wd - w0Sqr; b0 = -wd; b1 = 0; b2 = wd; >break; default: throw new ArgumentOutOfRangeException(); > _tablel.B0 = _tabler.B0 = b0 / a0; _tablel.B1 = _tabler.B1 = b1 / a0; _tablel.B2 = _tabler.B2 = b2 / a0; _tablel.A1 = _tabler.A1 = a1 / a0; _tablel.A2 = _tabler.A2 = a2 / a0; >
Полный код класса ButterworthFilter
public enum EFilterPass < None, LowPass, HiPass, BandPass >public class ButterworthFilter : SyntageAudioProcessorComponentWithParameters, IProcessor < private class BiquadConvolutionTable < public double B0, B1, B2, A1, A2; private readonly double[] _x = new double[3]; private readonly double[] _y = new double[3]; public double Process(double s) < // "сдвигаем" предыдущие семплы _x[2] = _x[1]; _x[1] = _x[0]; _x[0] = s; _y[2] = _y[1]; _y[1] = _y[0]; // свертка _y[0] = B0 * _x[0] + B1 * _x[1] + B2 * _x[2] - A1 * _y[1] - A2 * _y[2]; return _y[0]; >> private readonly BiquadConvolutionTable _tablel; private readonly BiquadConvolutionTable _tabler; public EnumParameter FilterType < get; private set; >public FrequencyParameter CutoffFrequency < get; private set; >public ButterworthFilter(AudioProcessor audioProcessor) : base(audioProcessor) < _tablel = new BiquadConvolutionTable(); _tabler = new BiquadConvolutionTable(); >public override IEnumerable CreateParameters(string parameterPrefix) < FilterType = new EnumParameter(parameterPrefix + "Pass", "Filter Type", "Filter", false); CutoffFrequency = new FrequencyParameter(parameterPrefix + "Cutoff", "Filter Cutoff Frequency", "Cutoff"); return new List ; > public void Process(IAudioStream stream) < if (FilterType.Value == EFilterPass.None) return; var count = Processor.CurrentStreamLenght; var lc = stream.Channels[0]; var rc = stream.Channels[1]; for (int i = 0; i < count; ++i) < var cutoff = CutoffFrequency.Value; CalculateCoefficients(cutoff); var ls = _tablel.Process(lc.Samples[i]); lc.Samples[i] = ls; var rs = _tabler.Process(rc.Samples[i]); rc.Samples[i] = rs; >> private double TransformFrequency(double w) < return Math.Tan(Math.PI * w / Processor.SampleRate); >private void CalculateCoefficients(double cutoff) < double b0, b1, b2, a0, a1, a2; switch (FilterType.Value) < case EFilterPass.LowPass: < var w = TransformFrequency(cutoff); a0 = 1 + Math.Sqrt(2) * w + w * w; a1 = -2 + 2 * w * w; a2 = 1 - Math.Sqrt(2) * w + w * w; b0 = w * w; b1 = 2 * w * w; b2 = w * w; >break; case EFilterPass.HiPass: < var w = TransformFrequency(cutoff); a0 = 1 + Math.Sqrt(2) * w + w * w; a1 = -2 + 2 * w * w; a2 = 1 - Math.Sqrt(2) * w + w * w; b0 = 1; b1 = -2; b2 = 1; >break; case EFilterPass.BandPass: < var w = cutoff; var d = w / 4; // определим полосу фильтра как [w * 3 / 4, w * 5 / 4] var w1 = Math.Max(w - d, CutoffFrequency.Min); var w2 = Math.Min(w + d, CutoffFrequency.Max); w1 = TransformFrequency(w1); w2 = TransformFrequency(w2); var w0Sqr = w2 * w1; // w0^2 var wd = w2 - w1; // W a0 = -1 - wd - w0Sqr; a1 = 2 - 2 * w0Sqr; a2 = -1 + wd - w0Sqr; b0 = -wd; b1 = 0; b2 = wd; >break; default: throw new ArgumentOutOfRangeException(); > _tablel.B0 = _tabler.B0 = b0 / a0; _tablel.B1 = _tabler.B1 = b1 / a0; _tablel.B2 = _tabler.B2 = b2 / a0; _tablel.A1 = _tabler.A1 = a1 / a0; _tablel.A2 = _tabler.A2 = a2 / a0; > >
Полосовой эквалайзер в библиотеке NAudio
Для работы с звуком, звуковыми файлами различных форматов на .NET есть хорошая библиотека NAudio.
Она содержит пространство имен NAudio.Dsp с функционалом для фильтрации, свертки, гейта, огибающей, БПФ и других интересных штук.
Рассмотрим класс Equalizer (из примеров, пространство имен NAudioWpfDemo.EqualizationDemo), позволяющий производить эквализацию сигнала. Класс реализует ISampleProvider, который в функции Read(float[] buffer, int offset, int count) обрабатывает (изменяет) массив семплов buffer.
Конструктор принимает массив структуры EqualizerBand, которые описывают «полосы» эквалайзера:
class EqualizerBand < public float Frequency < get; set; >public float Gain < get; set; >public float Bandwidth < get; set; >>
Здесь Frequency — центральная частота полосы с параметром Q (Bandwidth, добротность фильтра), c усилением Gain dB.
Если заглянуть в реализацию, то каждой полосе EqualizerBand соответствует класс BiQuadFilter который используется как полосовой (Peaking) фильтр. Все фильтры изменяют сигнал используются последовательно.
Класс EqualizerBand является реализацией фильтра Баттервота, с большим выборов типов фильтров и параметрами. Если посмотреть реализацию, можно увидеть схожие формулы и коэффициенты.
Пример использования класса Equalizer вы найдете в проекте NAudioWpfDemo в классе EqualizationDemoViewModel.
Программы для рассчета фильтров
Прародителем цифровых фильтров были фильтры аналоговые. Теория для аналоговых схем и аналоговой обработке сигналов в дальнейшем переросла в теорию цифровой обработки сигналов.
Для рассмотренного фильтра Баттервота и рассчитанных формул для коэффициентов можно собрать аналоговую схему.
Есть много программ для рассчета и построения схем, параметров элементов для них, сверточных коэффициентов различных фильтров.
Можете погуглить по «filter calculation software».

Iowa Hills Software RF Filter Designer
В следующей статье я расскажу про эффект delay, distortion и модуляцию параметров.
Всем добра! Удачи в программировании!
Список литературы
Не забывайте смотреть списки статей и книг в предыдущих статьях.
- Digital Signal Processing: A Practical Approach. Русская версия — Цифровая обработка сигналов. Практический подход.
- Хабр-статья «Простыми словами о преобразовании Фурье»
- Фильтр Баттерворта на вики
- Github-репозитарий с кодом для рассчета фильтров Баттервота
- DISCRETE SIGNALS AND SYSTEMS, Chapter 7. FIR and IIR Filters
- How does a low-pass filter programmatically work? (dsp.stackexchange.com/)
- Designing Digital Butterworth and Chebyshev Filters
- Audio EQ Cookbook
- Iowa Hills Software — Digital and Analog Filters