От чего меняется частота среза фильтра
Перейти к содержимому

От чего меняется частота среза фильтра

  • автор:

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. Активный фильтр нижних частот второго порядка со сложной отрицательной обратной связью.

При выполнении этого условия в процессе расчета фильтра не следует выбирать от­ношение С21 много большим величины, стоящей справа. Характеристики фильтра мало зависят от точности подбора номи­налов его элементов, поэтому рассмотрен­ная схема может, быть рекомендована для реализации фильтров с высокой доброт­ностью.

13.4.3. ФИЛЬТР С ПОЛОЖИТЕЛЬНОЙ ОБРАТНОЙ СВЯЗЬЮ

Активный фильтр может быть также построен на основе операционного усилителя с положительной обратной связью.

Рис. 13.16. Активный фильтр ниж­них частот второго порядка с по­ложительной обратной связью.

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

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

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

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

Как и в случае фильтра со сложной отри­цательной обратной связью, не следует вы­бирать отношение С21 много большим значения правой части последнего неравенства.

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

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

Из последнего соотношения видно, что коэффициент  зависит от добротности по­люсов и не зависит от частоты среза. Ве­личина  в этом случае определяет тип фильтра. Таким образом, выбрав в табл. 13.6 значения коэффициентов a1 и b1 для конкретного фильтра, необходимо задать соответствующее значение . Эти значения коэффициента усиления приведены в табл.13.7. При  = 3 схема работает в режиме генерации сигнала с частотой f = 1/2RC. Отметим, что установка коэффициента усиления тем труднее, чем он ближе к значению  = 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/fT0,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

Цикл статей

  1. Понимаем и пишем VSTi синтезатор на C# WPF
  2. ADSR-огибающая сигнала
  3. Частотный фильтр Баттервота
  4. Delay, Distortion и модуляция параметров

Оглавление

  1. Эквалайзер
  2. Фильтрация через преобразование Фурье
  3. Цифровые фильтры
  4. Почему фильтр Баттервота?
  5. Вывод формулы фильтра НЧ
  6. Вывод формулы фильтра ВЧ и полосового фильтра
  7. Программирование фильтра Баттервота по полученным формулам
  8. Полосовой эквалайзер в библиотеке NAudio
  9. Программы для рассчета фильтров
  10. Список литературы

Эквалайзер

Часто при обработке звука мы хотим изменить его характер/окраску/тембр. Сделать звук более басовым, убрать верхние частоты, или наоборот, сделать звук «прозрачным», оставив лишь середину и верха. Уверен, многие люди, не работавшие с обработкой звука, знают что такое эквалайзер — они есть акустических колонках, музыкальных центрах, магнитофонах, плеерах, и т.д. Эквалайзер — это набор фильтров, каждый из которых изменяет амплитуду сигнала в его выбранной полосе частот. На бытовых колонках это, обычно, 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 и модуляцию параметров.

Всем добра! Удачи в программировании!

Список литературы

Не забывайте смотреть списки статей и книг в предыдущих статьях.

  1. Digital Signal Processing: A Practical Approach. Русская версия — Цифровая обработка сигналов. Практический подход.
  2. Хабр-статья «Простыми словами о преобразовании Фурье»
  3. Фильтр Баттерворта на вики
  4. Github-репозитарий с кодом для рассчета фильтров Баттервота
  5. DISCRETE SIGNALS AND SYSTEMS, Chapter 7. FIR and IIR Filters
  6. How does a low-pass filter programmatically work? (dsp.stackexchange.com/)
  7. Designing Digital Butterworth and Chebyshev Filters
  8. Audio EQ Cookbook
  9. Iowa Hills Software — Digital and Analog Filters

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *