Однополюсный фильтр (one-pole filter)однополюсный фильтр (one-pole filter) — Простейший рекурсивный фильтр: новый выход вычисляется из входного отсчёта и одного предыдущего выхода, y[n] = y[n−1] + a·(x[n] − y[n−1]). При коэффициенте a от 0 до 1 работает как фильтр нижних частот. описан в своей статье во времени: новый выход вычисляется из входного отсчёта (sample)отсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом. и прошлого выхода. По такой формуле трудно сразу ответить, насколько фильтр ослабит синусоиду (sine)синус (sine) — Вертикальная координата точки на единичной окружности под заданным углом от положительного направления горизонтальной оси. Для острого угла прямоугольного треугольника равен отношению противолежащего катета к гипотенузе. 5 кГц и на сколько её задержит. Ответ дают средства, общие для всех линейных фильтров: импульсная характеристика и свёртка, частотная характеристика, передаточная функция с нулями и полюсами, групповая задержка. С их помощью разобраны фильтры с конечной и бесконечной импульсной характеристикой и биквад — фильтр второго порядка, из которого собирают эквалайзеры. В конце — класс Biquad на C++23 и фильтры JUCE. Понадобятся комплексные числа и формула Эйлера.
Линейность и инвариантность во времени
Фильтр превращает последовательность входных отсчётов в выходные . Всё, что сказано в статье дальше, верно для фильтров, которые линейны и инвариантны во времени.
Линейность (linearity): если вход даёт выход , а вход — выход , то вход даёт при любых числах и (Sundararajan, §2.3.2). Вдвое более громкий вход даёт вдвое более громкий выход, а сумма двух сигналов проходит фильтр так, будто каждый прошёл отдельно и выходы сложили. Инвариантность во времени (time invariance): если вход даёт , то задержанный вход даёт тот же выход, задержанный на отсчётов (там же, §2.3.3). Коэффициенты фильтра не меняются, и ему всё равно, когда пришёл сигнал. Системы с обоими свойствами называют линейными инвариантными во времени (linear time-invariant, LTI).
Линейность проверяется на числах. Однополюсный фильтр с из нулевого состояния превращает вход 0,2; 0,2; 0,2 в 0,1; 0,15; 0,175, а вход 0,4; 0,4; 0,4 — в 0,2; 0,3; 0,35, ровно вдвое больше. Возведение в квадрат так себя не ведёт: 0,2 даёт 0,04, а 0,4 — 0,16, вчетверо больше. Квадрат — нелинейная операция.
Поэтому компрессор (dynamic range compressor)компрессор (dynamic range compressor) — Устройство или программа, которая ослабляет сигнал, когда его уровень выше порога, и тем сужает динамический диапазон. и дисторшн к LTI-системам не относятся: у компрессора усиление зависит от уровня входа, у дисторшна выход — нелинейная функция входа, вроде среза (clipping)клиппинг (clipping) — Ограничение значений сигнала крайними допустимыми уровнями при выходе за диапазон. Срезает вершины волны и создаёт искажения.. Тремоло (tremolo)тремоло (tremolo) — Эффект периодического изменения амплитуды аудиосигнала. Скорость пульсации задаёт частота управляющего генератора, а диапазон усиления зависит от глубины и способа её преобразования. умножает сигнал на LFO (low-frequency oscillator, LFO)низкочастотный генератор (low-frequency oscillator, LFO) — Генератор медленно повторяющегося управляющего сигнала, которым изменяют параметры звука, например усиление, частоту или панораму. Общей строгой верхней границы частоты у LFO нет.: оно линейно, но не инвариантно во времени — отсчёт ослабляется по-разному в зависимости от фазы LFO в момент его прихода. Так же ведёт себя фильтр, у которого во время работы двигают частоту среза (cutoff frequency)частота среза (cutoff frequency) — Частота, выше которой фильтр нижних частот заметно ослабляет сигнал. У однополюсного фильтра при частоте среза много ниже fs/2 синусоида этой частоты ослабляется примерно на 3 дБ.: пока ручка неподвижна, это LTI-система, а пока её крутят — нет. К этому случаю статья вернётся в разделе о смене коэффициентов.
Импульсная характеристика и свёртка
Единичный импульс — последовательность, в которой , а все остальные отсчёты равны нулю: цифровой щелчок. Импульсная характеристика (impulse response, IR)импульсная характеристика (impulse response, IR) — Отклик линейной инвариантной во времени системы на единичный импульс из нулевого состояния. Полностью описывает такую систему: выход на любой вход — свёртка входа с импульсной характеристикой. — выход фильтра на такой вход из нулевого состояния. У однополюсного фильтра её легко посчитать по шагам: , , , и вообще . При частоте среза 1000 Гц и 48 кГц коэффициент , и первые отсчёты равны 0,1227; 0,1076; 0,0944; 0,0828 — каждый в раза меньше предыдущего.
Свёртка
Любой вход можно записать как сумму задержанных импульсов с весами — значениями отсчётов. Вход 2, 1, 3, 4 — это . Инвариантность во времени говорит, что импульс даёт отклик , а линейность — что отклик на сумму равен сумме откликов с теми же весами. Отсюда выход для любого входа (Sundararajan, §2.2, с. 47):
- импульсная характеристика, отклик на единичный импульс;
- номер слагаемого; сумма идёт по всем , при которых оба множителя отличны от нуля.
Такая операция называется свёрткой (convolution)свёртка (convolution) — Операция y[n] = Σ h[k]·x[n−k]: каждый выходной отсчёт — сумма текущего и прошлых входных отсчётов с весами из импульсной характеристики. Так линейный инвариантный во времени фильтр вычисляет выход. и записывается . Обе формы суммы дают одно и то же: от перестановки последовательностей свёртка не меняется. Вторая форма прямо задаёт вычисление: выход — это текущий и прошлые входы, взвешенные отсчётами импульсной характеристики.
Пример из учебника Sundararajan: = 3, 1, 2, 4 и = 2, 1, 3, 4. Отсчёт собирает четыре произведения: . Весь выход — 6, 5, 14, 25, 14, 20, 16: свёртка последовательностей длиной и содержит отсчётов (Sundararajan, §2.2, с. 47–48). Проверка: сумма выхода, 100, равна произведению сумм входа и характеристики, .
- отсчёты, которые перемножаются для y[n]
- уже посчитанные отсчёты выхода
- ещё не посчитанные
y[3] = x[0]·h[3] + x[1]·h[2] + x[2]·h[1] + x[3]·h[0] = 2·4 + 1·2 + 3·1 + 4·3 = 25.
Готовы отсчёты y[0] … y[3]: 6, 5, 14, 25. Всего у результата 7 = 4 + 4 − 1 отсчётов.
В визуализации 1 характеристика развёрнута во времени: значение стоит под входом . С ростом она сдвигается вправо, и под ней оказываются всё новые входные отсчёты. В начальном состоянии , перекрываются все четыре отсчёта, и сумма равна 25. Выберите вход «щелчок»: выход повторит , потому что импульсная характеристика и есть отклик на щелчок. С характеристикой «эхо» каждый входной отсчёт возвращается через три отсчёта вдвое тише — так работает линия задержки (delay line)линия задержки (delay line) — Блок обработки, который хранит последние отсчёты сигнала и выдаёт вход на заданное число отсчётов позже: y[n] = x[n − D]. На нём построены эхо, хорус, фленжер, реверберация и компенсация задержки. с прямой связью. Вход «скачок» с характеристикой «разность» даёт 1 в начале, −1 в конце и нули посередине: разность реагирует только на изменения.
Импульсная характеристика полностью описывает LTI-фильтр: зная , можно вычислить отклик на любой вход. На этом построен свёрточный ревербератор (convolution reverb)свёрточный ревербератор (convolution reverb) — Обработчик, применяющий сохранённую импульсную характеристику к входному сигналу для воспроизведения отклика помещения или устройства.: он хранит записанную импульсную характеристику помещения и сворачивает с ней сигнал. Характеристика зала длится секунды, это десятки тысяч отсчётов, и прямой расчёт по формуле (1) требует столько же умножений на каждый выходной отсчёт. Поэтому длинные свёртки считают через БПФ.
КИХ-фильтры
Если импульсная характеристика конечна, то есть после отсчётов идут только нули, формула (1) содержит слагаемых, и фильтр вычисляется прямо по ней: . Такой фильтр называют КИХ-фильтром (finite impulse response filter, FIR)КИХ-фильтр (finite impulse response filter, FIR) — Фильтр с конечной импульсной характеристикой: выход — взвешенная сумма текущего и нескольких прошлых входов, без обратной связи. Всегда устойчив; при симметричных коэффициентах задерживает все частоты одинаково., фильтром с конечной импульсной характеристикой. Его коэффициенты и есть отсчёты : если подать щелчок, на выход по очереди выйдут , и так далее (Sundararajan, §7.1, с. 230–231).
Простейший КИХ-фильтр — скользящее среднее отсчётов: все коэффициенты равны . Среднее двух соседних отсчётов, , сглаживает сигнал: медленные изменения проходят почти без потерь, а чередование знаков +1, −1, +1 даёт на выходе ноль. Насколько ослабляются промежуточные частоты, покажет частотная характеристика.
КИХ-фильтр всегда устойчив: выход — сумма ограниченных слагаемых, и расти без предела ему нечем (Sundararajan, §7.1, с. 232). Зато ему нужно умножений на каждый отсчёт. Документация JUCE советует считать FIR::Filter по формуле, пока коэффициентов меньше 128, а более длинные характеристики — через БПФ в классе Convolution (juce_FIRFilter.h).
Если коэффициенты симметричны, , как у скользящего среднего, фильтр задерживает все частоты на одно и то же время, отсчётов. Это свойство называют линейной фазой; оно разобрано в разделе о задержке.
БИХ-фильтры
Однополюсный фильтр устроен иначе: его выход зависит от прошлого выхода. Общая запись фильтра с обратной связью (feedback)обратная связь (feedback) — Возврат части выходного сигнала на вход обработки. В delay повторно направляет копию через линию задержки и создаёт цепочку повторений. — разностное уравнение (Sundararajan, §2.3.1 и §2.7):
- коэффициенты прямой части, при входе и его задержках;
- коэффициенты обратной связи, при прошлых выходах;
- порядок фильтра: сколько прошлых выходов он помнит.
Если хоть один отличен от нуля, импульсная характеристика бесконечна: каждый выход возвращается во все следующие. Такой фильтр называют БИХ-фильтром (infinite impulse response filter, IIR)БИХ-фильтр (infinite impulse response filter, IIR) — Фильтр с бесконечной импульсной характеристикой: в разностное уравнение входят прошлые выходы. Даёт крутой спад малым числом коэффициентов, устойчив, только если все полюсы внутри единичной окружности., фильтром с бесконечной импульсной характеристикой (Sundararajan, §2.7, с. 60). Знак минус перед второй суммой — соглашение, с которым проще выглядит передаточная функция; так записывают коэффициенты Sundararajan, RBJ Audio EQ Cookbook и JUCE. Однополюсный фильтр — БИХ-фильтр первого порядка с и . Здесь без индекса — коэффициент из статьи об однополюсном фильтре, а — коэффициент обратной связи; это разные величины.
Обратная связь экономит вычисления. Импульсная характеристика однополюсного фильтра с частотой среза 1000 Гц опускается на 60 дБ ниже первого отсчёта только через 53 отсчёта. КИХ-фильтру с той же характеристикой, обрезанной на этом уровне, понадобилось бы 53 умножения на отсчёт, а однополюсному хватает двух. При 200 Гц КИХ-фильтру понадобилось бы 264 умножения. Sundararajan подводит итог: фильтрам с обратной связью для тех же требований нужно меньше коэффициентов, но у них появляется вопрос устойчивости (Sundararajan, §2.7, с. 59).
Устойчивость
Фильтр устойчив, если ограниченный вход всегда даёт ограниченный выход (определение из статьи об однополюсном фильтре). Через импульсную характеристику условие записывается так: сумма модулей конечна (Sundararajan, §2.5, с. 57). У КИХ-фильтра она конечна всегда. У однополюсного фильтра это геометрическая прогрессия , и она конечна, только если . При каждый отсчёт характеристики на 10 % больше предыдущего, и через 1000 отсчётов он больше . Общее правило для БИХ-фильтров любого порядка дают полюсы.
Частотная характеристика
Подадим на LTI-фильтр комплексную синусоиду , где — частота в радианах на отсчёт, а — частота дискретизации (sample rate)частота дискретизации (sample rate) — Число отсчётов в каждом канале за одну секунду, то же число кадров аудиоданных в секунду. Измеряется в герцах: 44 100 Гц означает 44 100 отсчётов на канал в секунду. (вращающийся вектор). По формуле (1) выход равен . Вторая сумма не зависит от : это комплексное число (complex number)комплексное число (complex number) — Число вида a + jb, где a и b вещественные, а мнимая единица j удовлетворяет j² = −1. Изображается точкой или вектором на плоскости; модуль и аргумент хранят длину и угол, например амплитуду и фазу синусоиды., одно для каждой частоты (Sundararajan, §2.4, с. 56–57).
- частотная характеристика: комплексный множитель для синусоиды частоты ;
- частота, рад/отсчёт, от 0 до на частотах от 0 до .
Синусоида выходит из фильтра той же частоты, умноженная на . Для вещественной синусоиды это значит: превращается в — амплитуда умножается на модуль, к фазе прибавляется аргумент (Sundararajan, §2.4, с. 57). Модуль как функцию частоты называют амплитудно-частотной характеристикой (magnitude response)амплитудно-частотная характеристика (magnitude response) — Зависимость модуля частотной характеристики |H(e^jω)| от частоты: во сколько раз фильтр меняет амплитуду синусоиды каждой частоты. Обычно рисуется в дБ., АЧХ (magnitude response), аргумент — фазочастотной, ФЧХ (phase response). АЧХ обычно рисуют в децибелах (decibel)децибел (decibel) — Логарифмическая единица отношения двух величин: для амплитуд L = 20 lg(A/A₀), для мощностей — 10 lg(P/P₀). Смысл числа задаёт опорная величина.: .
Отсюда следует, что LTI-фильтр не создаёт новых частот. Каждая синусоида входа выходит той же частоты, меняются только её амплитуда (amplitude)амплитуда (amplitude) — Наибольший модуль отклонения колеблющейся величины от равновесного значения. Для синусоиды обозначается A; единицы совпадают с единицами сигнала. и фаза (phase)фаза (phase) — Положение внутри периода колебания, выраженное углом: полный период соответствует 360°, или 2π радиан. Начальная фаза — её значение в момент t = 0.. Новые частоты появляются только в нелинейной обработке: срез добавляет гармоники и комбинационные частоты.
У среднего двух отсчётов = 0,5; 0,5, и по формуле (3) . Если вынести , в скобках останется полусумма , то есть по формуле Эйлера: . АЧХ — : 1 на нулевой частоте, (−3,01 дБ) на — 12 кГц при 48 кГц — и 0 на . ФЧХ — прямая : все частоты сдвинуты на половину отсчёта.
Проверка однополюсного фильтра
У однополюсного фильтра , и формула (3) — сумма геометрической прогрессии со знаменателем . Её модуль меньше 1, и сумма равна . Квадрат модуля:
В статье об однополюсном фильтре сказано: если частота среза много ниже , синусоида этой частоты ослабляется примерно на 3 дБ. Теперь это можно проверить. Обозначим , где . Знаменатель формулы (4) равен . При малой выполняется и , а . На частоте среза знаменатель близок к , и : ослабление 3 дБ. Приближение требует , то есть . Таблица 1 даёт точные значения по формуле (4).
| fc, Гц | a | Ослабление на fc, дБ | Ослабление на fs/2, дБ |
|---|---|---|---|
| 200 | 0,02584 | 3,010 | 37,66 |
| 1000 | 0,12269 | 3,004 | 23,69 |
| 5000 | 0,48030 | 2,858 | 10,00 |
На , где , формула (4) даёт : при частоте среза 1000 Гц ослабление всего 23,7 дБ, как и сказано в разделе об ограничениях. Рисунок 3 сравнивает оба фильтра.
Передаточная функция и z-преобразование
Частотная характеристика (3) — сумма степеней . Если обозначить , задержка на отсчётов превращается в множитель . На этом построено z-преобразование (z-transform)z-преобразование (z-transform) — Запись последовательности x[n] выражением X(z) = Σ x[n]·z⁻ⁿ, в которой задержка на один отсчёт становится умножением на z⁻¹. Превращает разностное уравнение фильтра в передаточную функцию.: последовательности сопоставляют выражение , где — комплексное число (Sundararajan, §6.1, с. 196–197). Для фильтров важно одно его свойство: задержке на один отсчёт соответствует умножение на . Поэтому элемент задержки на схемах фильтров подписывают . В учебниках к z-преобразованию добавляют условие, при каких сумма сходится; для чтения передаточных функций оно не понадобится.
Применим это к разностному уравнению (2): каждое слагаемое превращается в , каждое — в . Перенесём выходы влево и поделим на . Отношение называют передаточной функцией (transfer function)передаточная функция (transfer function) — Отношение H(z) = Y(z)/X(z) многочленов от z⁻¹ с коэффициентами разностного уравнения фильтра. Корни числителя — нули, корни знаменателя — полюсы; на единичной окружности z = e^jω она равна частотной характеристике. (Sundararajan, §6.3.2, с. 217):
Числитель и знаменатель — многочлены, коэффициенты которых совпадают с коэффициентами разностного уравнения. На единичной окружности, при , передаточная функция совпадает с частотной характеристикой (3) (Sundararajan, §6.1, с. 196).
Нули и полюсы
Корни числителя называют нулями (zeros): в них . Корни знаменателя называют полюсами (poles): знаменатель там обращается в ноль, и бесконечна. Их рисуют на комплексной плоскости : нуль — кружком, полюс — крестиком. Точки единичной окружности соответствуют частотам: угол 0 — постоянной составляющей, — частоте , — частоте , частоте Найквиста (Nyquist frequency)частота Найквиста (Nyquist frequency) — Половина частоты дискретизации, fₛ/2. В принятой низкочастотной модели точное восстановление по отсчётам требует, чтобы все частоты исходного сигнала были строго ниже этой границы.. Нижняя половина окружности — отрицательные частоты. У фильтра с вещественными коэффициентами комплексные нули и полюсы стоят парами, симметрично относительно вещественной оси (комплексные корни квадратного уравнения).
Положение нулей и полюсов объясняет форму АЧХ. Модуль пропорционален произведению расстояний от точки на окружности до нулей, делённому на произведение расстояний до полюсов (Bellanger, §6.2, с. 128). Когда частота проходит мимо нуля, лежащего у окружности, расстояние до него мало, и в АЧХ провал; нуль на самой окружности полностью подавляет свою частоту. Когда частота проходит мимо полюса у окружности, в АЧХ пик, и чем ближе полюс к окружности, тем он выше (Bellanger, §6.2, с. 129–130).
У среднего двух отсчётов : нуль в точке , то есть на , где АЧХ обнулилась, и полюс в начале координат. До начала координат от любой точки окружности расстояние 1, и на АЧХ он не влияет. У однополюсного фильтра : полюс на вещественной оси в точке , при частоте среза 1000 Гц — в точке 0,877. Он стоит у угла 0, рядом с низкими частотами, поэтому фильтр их пропускает лучше, чем высокие.
Отсюда общее условие устойчивости: фильтр устойчив, если все его полюсы лежат внутри единичной окружности, (Sundararajan, §6.3.2, с. 218). У однополюсного фильтра это — то же условие, что получилось из прогрессии. У КИХ-фильтра знаменатель равен 1, все его полюсы в начале координат, и он устойчив всегда.
Фазовая и групповая задержка
ФЧХ даёт фазовый сдвиг в радианах, а знать удобнее задержку во времени. Для этого есть две величины (J. O. Smith, Phase and Group Delay):
- ФЧХ, , рад;
- ,
- фазовая и групповая задержка, отсчётов; в секундах — после деления на .
Фазовая задержка показывает, на сколько отсчётов сдвинута синусоида частоты . Групповая задержка (group delay)групповая задержка (group delay) — Производная фазочастотной характеристики по частоте с обратным знаком, −dφ/dω. Показывает, на сколько задерживается огибающая сигнала в узкой полосе около данной частоты. — производная фазы по частоте с обратным знаком. Она показывает задержку огибающей (envelope)огибающая (envelope) — Плавная кривая, которая следует за размахом волны и показывает, как уровень сигнала меняется во времени.: короткой пачки колебаний около частоты , «группы» близких синусоид (J. O. Smith, Group Delay). Удар барабана и начало ноты — именно такие огибающие.
Если ФЧХ — прямая , обе задержки равны отсчётам на всех частотах. Тогда составляющие сигнала в полосе пропускания задержаны одинаково, и форма сигнала сохраняется: он просто приходит позже (Sundararajan, §7.2, с. 237). У среднего двух отсчётов , задержка — половина отсчёта, при 48 кГц это 10,4 мкс.
Линейная фаза
У КИХ-фильтра с симметричными коэффициентами длины ФЧХ — прямая с наклоном , а групповая задержка постоянна и равна отсчётов (Sundararajan, §7.2, с. 235–237). На частотах, где АЧХ проходит через ноль, фаза скачком меняется на , но прямой наклон и задержка от этого не меняются. У скользящего среднего восьми отсчётов задержка 3,5 отсчёта. Такие фильтры называют линейно-фазовыми.
У БИХ-фильтров ФЧХ — не прямая, и групповая задержка зависит от частоты. У однополюсного фильтра с частотой среза 1000 Гц она равна 7,15 отсчёта на нулевой частоте, 3,33 на 1 кГц, 1,04 на 2 кГц, а на 10 кГц становится даже немного отрицательной, −0,41. Групповая задержка описывает огибающую узкой полосы частот, а не момент, когда на выходе появляется сигнал, поэтому бывает и отрицательной; такие значения Bellanger отмечает и у секции второго порядка (Bellanger, §6.2, с. 131). Низкие частоты такой фильтр задерживает сильнее высоких.
Недостатки линейной фазы видны на рисунке 4. Симметричная импульсная характеристика начинается до своего пика, поэтому выход начинает колебаться раньше, чем приходит основная часть отклика: это предзвон (pre-ringing). На ударных он размывает атаку: руководство FabFilter Pro-Q предупреждает, что в линейно-фазовом режиме бочка может потерять резкость. Второй недостаток — задержка (latency)задержка (latency) — Время прохождения сигнала через тракт от входа до выхода. Включает буферизацию, драйвер, преобразователи и алгоритмы; длительность одного блока не равна полной задержке. отсчётов: у фильтра из 4097 коэффициентов это 2048 отсчётов, 42,7 мс при 48 кГц. Хост выравнивает дорожки компенсацией задержки (delay compensation)компенсация задержки (delay compensation) — Выравнивание путей сигнала по времени: программа узнаёт задержку плагинов и задерживает остальные дорожки на недостающую величину., но играть через такой эквалайзер в реальном времени неудобно. Обычный эквалайзер на БИХ-фильтрах откликается сразу и без предзвона, зато сдвигает фазу около изменённой полосы.
Биквад
Фильтр второго порядка помнит два прошлых входа и два прошлых выхода:
Передаточная функция — отношение двух квадратных многочленов, поэтому фильтр называют биквадратным, коротко биквадом (biquad) (J. O. Smith, BiQuad Section). У него два нуля и два полюса. Фильтры высокого порядка на практике раскладывают в цепочку секций первого и второго порядка: в одной большой формуле ошибки округления коэффициентов сильно сдвигают нули и полюсы (Sundararajan, §8.4, с. 315–318). Прямые формы выше второго порядка поэтому почти не используют (Zavalishin, §3.11, с. 81). Каждая полоса параметрического эквалайзера (parametric equalizer)параметрический эквалайзер (parametric equalizer) — Эквалайзер, у полос которого плавно регулируются центральная частота, усиление и ширина полосы. — один биквад.
Полюсы и добротность
Пусть полюсы — пара сопряжённых чисел . По формуле корней квадратного уравнения знаменатель задают коэффициенты (Bellanger, §6.2, с. 128–129):
- радиус полюсов, расстояние от начала координат, без единиц;
- угол полюсов, рад; частота , Гц;
- добротность резонанса, приближённо для , близкого к 1.
Угол задаёт частоту резонанса, а радиус — его остроту. Подъём АЧХ на резонансе обратно пропорционален расстоянию от полюса до окружности, (Bellanger, §6.2, с. 129–130). Ширина резонанса по уровню −3 дБ при , близком к 1, равна (J. O. Smith, Resonator Bandwidth). Добротность (quality factor, Q)добротность (quality factor, Q) — Отношение центральной частоты полосы к её ширине между частотами среза. Чем больше добротность, тем уже полоса. — отношение частоты к ширине полосы, . Подставив , получим приближение в формуле (8): чем ближе полюсы к окружности, тем выше добротность.
Коэффициенты по частоте среза и добротности даёт кулинарная книга Роберта Бристоу-Джонсона, RBJ Audio EQ Cookbook (W3C). Для фильтра нижних частот (low-pass filter, LPF)фильтр нижних частот (low-pass filter, LPF) — Фильтр, который пропускает низкие частоты и ослабляет высокие. Перед дискретизацией помогает ограничить спектр входного сигнала.:
- частота среза, Гц;
- делитель: все пять остальных коэффициентов делят на него, чтобы получить вид (7).
Для фильтра верхних частот (high-pass filter, HPF)фильтр верхних частот (high-pass filter, HPF) — Фильтр, который пропускает частоты выше частоты среза и ослабляет частоты ниже неё. В сведении убирает гул и низкочастотные помехи. меняется только числитель: , . Числитель ФНЧ равен : два нуля в точке , поэтому на АЧХ обнуляется. У ФВЧ оба нуля в точке , на нулевой частоте. Формулы получены билинейным преобразованием аналогового фильтра с поправкой на искажение оси частот, поэтому частота стоит точно там, где задана (W3C, разд. 2). Формулы колокола и полок той же книги нужны эквалайзеру, их разберёт отдельная статья.
| Q | Радиус r | Частота полюса, Гц | АЧХ на 1 кГц, дБ | Пик АЧХ, дБ | Пик на, Гц | B, Гц |
|---|---|---|---|---|---|---|
| 0,707 | 0,9116 | 709 | −3,01 | 0,00 | 0 | 1414 |
| 2 | 0,9679 | 969 | 6,02 | 6,30 | 936 | 499 |
| 5 | 0,9870 | 995 | 13,98 | 14,02 | 990 | 199 |
| 10 | 0,9935 | 999 | 20,00 | 20,01 | 998 | 99,7 |
На частоте среза АЧХ ФНЧ RBJ равна : дБ, дБ. При и 10 ширина по радиусу полюса воспроизводит добротность: и . При полюсы далеко от окружности, пика нет: АЧХ ровная почти до частоты среза, а за ней спадает примерно на 12 дБ на октаву (octave)октава (octave) — Музыкальный интервал между нотами одного названия в соседних регистрах. Соответствует отношению частот 2:1. — от 2 до 4 кГц на 12,1 дБ. Однополюсный фильтр спадает на 6 дБ на октаву.
- ×полюс
- нуль
- единичная окружность |z| = 1
Фильтр неустойчив. Полюсы на единичной окружности или вне её: выход растёт без предела. Звук отключён, верните полюсы внутрь окружности.
Полюсы: r = 0,912, θ = 5,3° (709 Гц). Нули: r = 1,000, θ = 180,0° (24,0 кГц).
b0 = 0,003916, b1 = 0,007832, b2 = 0,003916, a1 = −1,815341, a2 = 0,831006; множитель числителя подобран так, что пик АЧХ равен 0 дБ.
Фильтр устойчив: полюсы внутри окружности. Пик АЧХ на 0 Гц; полюсы далеко от окружности, и оценка Q по радиусу неточна.
В начальном состоянии визуализации 5 — ФНЧ RBJ с : два нуля в точке и полюсы с радиусом 0,912 на 709 Гц. Потяните полюс к окружности: на АЧХ появится пик, в импульсной характеристике — затухающие колебания его частоты, а в розовом шуме (pink noise)розовый шум (pink noise) — Шум, PSD которого приблизительно обратно пропорциональна частоте в рабочей полосе: спад около 3 дБ на октаву и примерно одинаковая мощность октав. — слышимый призвук. Пример «ФНЧ 1 кГц, Q = 5» ставит полюсы на радиус 0,987. Пример «Режекция 1 кГц» сажает нули на окружность у 1 кГц, а полюсы — рядом, на радиус 0,98: нули дают глубокий провал, полюсы сужают его, и остальные частоты почти не меняются. Так устроен режекторный фильтр (notch filter)режекторный фильтр (notch filter) — Фильтр с очень узким провалом, который убирает одну частоту и почти не трогает соседние, например фон сети или резонанс.. Вытащите полюс за окружность: импульсная характеристика начнёт расти, а звук отключится.
Прямая форма I и транспонированная прямая форма II
Одно и то же разностное уравнение (7) можно вычислять по-разному. Прямая форма I (direct form I, DF-I) считает его как написано и хранит четыре состояния: , , , . Задержек вдвое больше необходимого, зато в целочисленной арифметике с дополнительным кодом внутренних переполнений не бывает, пока выход в допустимых пределах (J. O. Smith, Direct-Form I). Кулинарная книга RBJ называет её лучшим и простейшим способом для процессоров с аккумулятором двойной длины (W3C, разд. 2).
Транспонированная прямая форма II (transposed direct form II, TDF-II) обходится двумя состояниями (Sundararajan, §8.4, с. 317):
- ,
- состояния: уже посчитанные части будущих выходов.
Транспонирование схемы не меняет передаточной функции (J. O. Smith, Transposed Direct-Forms). Подставив и в первую строку, можно убедиться, что совпадает с формулой (7). Для точности у TDF-II есть преимущество: нули в ней фактически стоят раньше полюсов, и большое усиление, которое дают одни полюсы, нули частично компенсируют ещё до них (J. O. Smith, Numerical Robustness of TDF-II). По этой схеме работает juce::dsp::IIR::Filter (juce_IIRFilter.h).
Смена коэффициентов на ходу
Всё сказанное верно, пока коэффициенты постоянны. Но ручку частоты среза крутят во время звучания, а LFO качает фильтр синтезатора. Состояния TDF-II — смесь прошлых входов и выходов, взвешенная старыми коэффициентами; после смены коэффициентов они уже не соответствуют новому фильтру. Фильтры с одинаковой передаточной функцией, но разной структурой при модуляции ведут себя по-разному (Zavalishin, §3.11, с. 81). Документация IIR::Filter для быстрой модуляции частоты среза советует фильтр переменных состояний, рассчитанный на это (juce_IIRFilter.h).
Разницу видно в опыте. Белый шум (white noise)белый шум (white noise) — Шум с постоянной спектральной плотностью мощности в рассматриваемой полосе. Полосы одинаковой ширины в герцах содержат одинаковую ожидаемую мощность. с размахом ±0,5 длительностью 1 с пропущен через три ФНЧ с одними и теми же коэффициентами в каждый момент: TDF-II, DF-I и фильтр переменных состояний из следующего раздела. Частота среза качается по синусоиде между 125 Гц и 8 кГц, на три октавы вверх и вниз от 1 кГц.
| Частота модуляции, Гц | Q | TDF-II | DF-I | Переменных состояний |
|---|---|---|---|---|
| 5 | 5 | 1,52 | 1,52 | 1,52 |
| 500 | 5 | 7,78 | 8,39 | 1,75 |
| 2000 | 5 | 20,1 | 19,5 | 1,38 |
| 2000 | 20 | 2,8·10¹⁹⁰ | 3,7·10¹⁹¹ | 2,66 |
При медленной модуляции три структуры дают одинаковый выход: в каждый момент фильтр почти неподвижен, и плавная автоматизация не вредит ни одной из них. При модуляции 500 Гц выход прямых форм в 4–5 раз выше, чем у фильтра переменных состояний, а при 2000 Гц и он уходит в бесконечность, хотя каждый «замороженный» фильтр устойчив. Для быстрой модуляции нужна другая структура.
Фильтр переменных состояний
Фильтр переменных состояний (state variable filter, SVF) — модель аналоговой схемы из двух интеграторов в общей петле обратной связи. Один расчёт даёт сразу три выхода: фильтры верхних и нижних частот и полосовой (Zavalishin, §4.1, с. 95–96). Цифровую версию строят методом TPT (topology-preserving transform): каждый интегратор схемы заменяют цифровым, а связи между ними оставляют как есть. Состояния фильтра — выходы интеграторов, а не взвешенные суммы прошлых отсчётов, и при модуляции он ведёт себя как аналоговый прототип (Zavalishin, §3.11, с. 81). Один шаг такого фильтра в JUCE выглядит так (juce_StateVariableTPTFilter.cpp):
Без модуляции ФНЧ переменных состояний с теми же частотой среза и имеет ту же передаточную функцию, что ФНЧ RBJ: на белом шуме их выходы в коде из раздела о JUCE расходятся не больше чем на . Разница появляется только при смене параметров. У полюсов сохраняется смысл формулы (8), поэтому параметр resonance в JUCE — это и есть : на частоте среза АЧХ равна , а JUCE вычисляет как 1 / resonance (Zavalishin, §4.1, с. 97; juce_StateVariableTPTFilter.h).
Код на C++
Класс Biquad
Класс считает формулу (10) и хранит пять коэффициентов отдельно от двух состояний. Функция makeRbjFilter вычисляет коэффициенты ФНЧ и ФВЧ по формуле (9), а метод response — частотную характеристику по формуле (7) при . Нужна только стандартная библиотека C++23.
// Биквад в транспонированной прямой форме II и коэффициенты ФНЧ и ФВЧ по RBJ Audio EQ Cookbook.
#include <cmath>
#include <complex>
#include <numbers>
struct BiquadCoefficients
{
double b0 = 1.0; // числитель
double b1 = 0.0;
double b2 = 0.0;
double a1 = 0.0; // знаменатель, a0 = 1
double a2 = 0.0;
};
// ФНЧ (lowPass = true) или ФВЧ второго порядка; все коэффициенты делятся на a0.
inline BiquadCoefficients makeRbjFilter (double sampleRate, double cutoffHz, double q, bool lowPass)
{
const auto w0 = 2.0 * std::numbers::pi * cutoffHz / sampleRate;
const auto cosW0 = std::cos (w0);
const auto alpha = std::sin (w0) / (2.0 * q);
const auto a0 = 1.0 + alpha;
const auto edge = (lowPass ? 1.0 - cosW0 : 1.0 + cosW0) / 2.0; // b0 = b2
return { .b0 = edge / a0,
.b1 = (lowPass ? 2.0 : -2.0) * edge / a0,
.b2 = edge / a0,
.a1 = -2.0 * cosW0 / a0,
.a2 = (1.0 - alpha) / a0 };
}
class Biquad
{
public:
void setCoefficients (const BiquadCoefficients& newCoefficients) noexcept { c = newCoefficients; }
void reset() noexcept { s1 = s2 = 0.0; }
// y[n] = b0·x[n] + s1; s1 и s2 хранят ещё не сложенные части будущих выходов.
float processSample (float input) noexcept
{
const auto x = static_cast<double> (input);
const auto y = c.b0 * x + s1;
s1 = c.b1 * x - c.a1 * y + s2;
s2 = c.b2 * x - c.a2 * y;
return static_cast<float> (y);
}
// H(e^jω) = (b0 + b1·e^−jω + b2·e^−2jω) / (1 + a1·e^−jω + a2·e^−2jω)
std::complex<double> response (double frequencyHz, double sampleRate) const
{
const auto z1 = std::polar (1.0, -2.0 * std::numbers::pi * frequencyHz / sampleRate);
const auto z2 = z1 * z1;
return (c.b0 + c.b1 * z1 + c.b2 * z2) / (1.0 + c.a1 * z1 + c.a2 * z2);
}
private:
BiquadCoefficients c; // параметры фильтра
double s1 = 0.0; // состояние, меняется каждый отсчёт
double s2 = 0.0;
};makeRbjFilter возвращает структуру через назначенные инициализаторы (C++20, designated initializers): имя каждого поля видно рядом со значением. Состояния хранятся в double: у резонансного фильтра полюсы близки к окружности, и ошибки округления float в обратной связи заметнее. Чтобы сменить частоту, достаточно вызвать setCoefficients; состояния при этом не сбрасываются, со всеми последствиями из раздела о смене коэффициентов.
Код собран clang++ -std=c++23 -Wall -Wextra -pedantic -Wconversion без предупреждений. Для ФНЧ 1 кГц с при 48 кГц response даёт 0,00 дБ на 100 Гц, −3,01 дБ на 1 кГц, −12,37 дБ на 2 кГц и −24,48 дБ на 4 кГц, а первые отсчёты импульсной характеристики — 0,003916; 0,014941; 0,027785. ФВЧ с теми же параметрами на 100 Гц даёт −40,03 дБ, а при ФНЧ поднимает частоту среза на 13,98 дБ, как в таблице 2.
Фильтры JUCE
В модуле juce_dsp есть КИХ- и БИХ-фильтры и фильтр переменных состояний. Класс ниже готовит биквад для двух каналов, КИХ-фильтр скользящего среднего и фильтр переменных состояний; процессор вызывает prepare из prepareToPlay и process из processBlock.
// Три фильтра JUCE в одном классе: биквад для двух каналов, КИХ и фильтр переменных состояний.
#include <juce_dsp/juce_dsp.h>
class FilterSection
{
public:
void prepare (double sampleRate, int maxBlockSize)
{
const juce::dsp::ProcessSpec stereo { sampleRate, static_cast<juce::uint32> (maxBlockSize), 2 };
setLowPass (sampleRate, 1000.0f, 0.707f);
lowPass.prepare (stereo);
// Скользящее среднее четырёх отсчётов; FIR::Filter обрабатывает только один канал.
const std::array<float, 4> taps { 0.25f, 0.25f, 0.25f, 0.25f };
average.coefficients = new juce::dsp::FIR::Coefficients<float> (taps.data(), taps.size());
average.prepare ({ sampleRate, static_cast<juce::uint32> (maxBlockSize), 1 });
sweep.setType (juce::dsp::StateVariableTPTFilterType::lowpass);
sweep.setCutoffFrequency (1000.0f);
sweep.setResonance (0.707f); // в JUCE resonance — это Q
sweep.prepare (stereo);
}
// Новые коэффициенты без выделения памяти: массив копируется в готовый объект Coefficients.
void setLowPass (double sampleRate, float cutoffHz, float q)
{
*lowPass.state = juce::dsp::IIR::ArrayCoefficients<float>::makeLowPass (sampleRate, cutoffHz, q);
}
void process (juce::AudioBuffer<float>& buffer)
{
juce::dsp::AudioBlock<float> block { buffer };
lowPass.process (juce::dsp::ProcessContextReplacing<float> { block });
}
juce::dsp::ProcessorDuplicator<juce::dsp::IIR::Filter<float>, juce::dsp::IIR::Coefficients<float>> lowPass;
juce::dsp::FIR::Filter<float> average;
juce::dsp::StateVariableTPTFilter<float> sweep;
};IIR::Filter обрабатывает один канал, а ProcessorDuplicator создаёт по фильтру на канал и даёт им общий объект коэффициентов state. Coefficients::makeLowPass возвращает новый объект в динамической памяти, а ArrayCoefficients::makeLowPass — массив из шести чисел. Присваивание массива копирует его в уже существующий объект: конструктор Coefficients заранее резервирует место под восемь чисел, поэтому setLowPass можно вызывать и в аудиопотоке (audio thread)аудиопоток (audio thread) — Поток с повышенным приоритетом, который вызывает обработку звука для каждого блока. Каждый вызов должен закончиться до срока блока, поэтому в нём не выделяют память, не берут блокировки и не обращаются к диску. (juce_IIRFilter.h и .cpp). Безопасность смены коэффициентов между потоками JUCE оставляет вызывающему коду, поэтому setLowPass удобно вызывать в начале process, когда изменился параметр. Формулы makeLowPass в JUCE записаны через , но дают те же коэффициенты, что формула (9).
FIR::Filter обрабатывает один канал: для стерео (stereo)стерео (stereo) — Аудиоформат с двумя каналами, обычно левым и правым. Кадр несжатых стереоданных содержит два отсчёта одного момента времени. его тоже оборачивают в ProcessorDuplicator. Фильтр переменных состояний принимает частоту среза и resonance; документация JUCE замечает, что и ему при резкой смене частоты может понадобиться сглаживание параметра (juce_StateVariableTPTFilter.h).
Код собран с JUCE 9.0.3 в консольном приложении с флагами предупреждений JUCE и -Wconversion без предупреждений. На 1 с белого шума выход класса Biquad расходится с IIR::Filter не больше чем на — JUCE хранит состояния в float, а Biquad в double, — а с ФНЧ StateVariableTPTFilter — не больше чем на . АЧХ коэффициентов lowPass на 1 кГц, по getMagnitudeForFrequency, равна −3,01 дБ.
Самопроверка
Вход 1, 2 и импульсная характеристика 1, 0, −1. Чему равна свёртка и сколько в ней отсчётов?
, , , . Выход 1, 2, −1, −2 — отсчёта. Проверка: произведение сумм равно сумме выхода.
Какой отклик у фильтра y[n] = x[n] − x[n−2] на частоте fs/4 и почему?
Это КИХ-фильтр с . На частота , и : . Нули фильтра — корни , точки , то есть частоты 0 и ; посередине между ними, на , АЧХ наибольшая. Это простейший полосовой фильтр.
Полюсы биквада — пара 0,9·e^(±jπ/4). Найдите a1 и a2 и скажите, устойчив ли фильтр. На какой частоте резонанс при 48 кГц?
, . Радиус 0,9 меньше 1 — фильтр устойчив. Угол соответствует кГц.
Линейно-фазовый КИХ-фильтр из 255 коэффициентов работает при 44,1 кГц. Какую задержку он вносит?
отсчётов, мс — одинаково для всех частот.
Почему частоту среза фильтра синтезатора, который качает LFO со звуковой частотой, лучше делать на фильтре переменных состояний, а не на бикваде в TDF-II?
Состояния TDF-II рассчитаны под старые коэффициенты, и при быстрой их смене выход скачет, вплоть до неограниченного роста, как в таблице 3. Состояния фильтра переменных состояний — выходы интеграторов аналоговой схемы, и при модуляции он ведёт себя как прототип. Без модуляции передаточные функции обоих одинаковы.
Источники
- Sundararajan D. Digital Signal Processing: An Introduction. §2.2–2.5, с. 46–57; §2.7, с. 59–60; §6.1, с. 196–197; §6.3.2, с. 217–218; §7.1–7.2, с. 230–237; §8.4, с. 315–318. в списке литературы → — свёртка как сумма откликов на импульсы и пример 4 ∗ 4, длина N + M − 1, линейность и инвариантность во времени, отклик на комплексную экспоненту, устойчивость через сумму модулей, КИХ и БИХ, z-преобразование, передаточная функция и устойчивость по полюсам, КИХ-фильтры, линейная фаза и групповая задержка, каноническая и транспонированная формы второго порядка, разложение на секции.
- Bellanger M. Digital Signal Processing: Theory and Practice. §6.2, с. 127–131. в списке литературы → — чисто рекурсивная секция второго порядка: коэффициенты b₁ = −2r·cos θ и b₂ = r² (в обозначениях книги), АЧХ через расстояния до полюсов, подъём на резонансе обратно пропорционален расстоянию до окружности, ширина (1 − r)/π, групповая задержка и её отрицательные значения.
- Smith J. O. III. Introduction to Digital Filters with Audio Applications. Phase and Group Delay, Group Delay, BiQuad Section, Resonator Bandwidth in Terms of Pole Radius, Direct-Form I, Transposed Direct-Forms, Numerical Robustness of TDF-II. в списке литературы → — фазовая и групповая задержка, задержка огибающей узкополосной группы, биквад и полюсы через радиус и угол, ширина резонанса −ln r/(πT), прямая форма I без внутренних переполнений, транспонирование без изменения передаточной функции, нули перед полюсами в TDF-II.
- Bristow-Johnson R. Audio EQ Cookbook / ed. by R. Toy. W3C Working Group Note, 2021 — передаточная функция биквада, прямая форма I, коэффициенты ФНЧ и ФВЧ, учёт искажения частот билинейного преобразования.
- Zavalishin V. The Art of VA Filter Design. §3.11, с. 79–81; §4.1, с. 95–97. в списке литературы → — прямые формы и их поведение при модуляции, метод TPT, точность прямых форм высокого порядка, фильтр переменных состояний с выходами ФВЧ, полосового и ФНЧ, АЧХ 1/(2R) на частоте среза.
- JUCE 9.0.3. juce_IIRFilter.h, juce_IIRFilter.cpp, juce_IIRFilter_Impl.h — TDF-II,
ArrayCoefficientsиCoefficients::makeLowPass, нормировка на a₀, резерв на восемь коэффициентов, совет для быстрой модуляции. - JUCE 9.0.3. juce_FIRFilter.h — КИХ-фильтр для одного канала, граница 128 коэффициентов и класс
Convolution. - JUCE 9.0.3. juce_StateVariableTPTFilter.h и juce_StateVariableTPTFilter.cpp — шаг фильтра переменных состояний,
resonanceи сглаживание частоты среза. - FabFilter. Pro-Q 4 Help: Processing mode — задержка и предзвон линейно-фазового режима.
Связи
Связи списком
Ссылается на
- Белый и розовый шум: спектр и генерация
- Дисторшн и сатурация: передаточная кривая и гармоники
- Звук в пространстве: панорама, задержка, реверберация и мид-сайд
- Линия задержки: кольцевой буфер, эхо и обратная связь
- Математика для аудио
- Микширование сигналов: усиление, фаза и запас уровня
- Однополюсный фильтр нижних частот
- Принцип работы компрессора
- Спектр сигнала: ДПФ и БПФ
- Тремоло: глубина модуляции и усиление
- Эквализация: краткая история и виды эквалайзеров
- C++ в аудиопотоке: выделение памяти, общие объекты и инструменты JUCE
- C++ в плагине: классы, конструкторы и время жизни
- Dry/wet и bypass: исходный и обработанный сигнал в плагине
- LFO: низкочастотный генератор и модуляция
Ссылаются сюда
- Алиасинг в нелинейной обработке: интермодуляция и передискретизация
- Дисторшн и сатурация: передаточная кривая и гармоники
- Звук в пространстве: панорама, задержка, реверберация и мид-сайд
- Линия задержки: кольцевой буфер, эхо и обратная связь
- Математика для аудио
- Однополюсный фильтр нижних частот
- Спектр сигнала: ДПФ и БПФ
- Эквализация: краткая история и виды эквалайзеров