Personal tools
Namespaces
Variants
Actions
Navigation
Projects
Toolbox

Bass redirection (math) (rus)

From AC3Filter
Revision as of 14:44, 8 February 2014 by Valex (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

English version of this article is here: Bass redirection (math).

Contents

Постановка задачи

Перенаправление баса - это извлечение низкочастотной составляющей из основных каналов и добавление извлеченного их в низкочастотный канал.

Есть две основных схемы перенаправления баса:

Pic 1: Redirection to the subwoofer
Pic 2: Redirection to front channels

Для простоты рассмотрения мы будем рассматривать только первую схему с отдельными поправками для второй.

Каждый канал, к которому применяется перенаправление, разделяется фильтрами на две части - низкочастотную и высокочастотную. Низкие частоты суммируются и направляются на сабвуфер. Для упрощения вычислений вместо применения НЧ фильтра к каждому каналу, все каналы суммируются и НЧ фильтр применяется к сумме:

Pic 3: Redirection to the subwoofer - equivalent scheme

ВЧ фильтр необходим для:

Для иллюстрирования важности ВЧ фильтра на Рис.4 приведены АЧХ результата с применением ВЧ фильтра и без него:

Pic 4: Frequency response with and without high-pass filter.

К сабвуферу НЧ/ВЧ фильтры не применяются. Однако, так как НЧ и ВЧ фильтры не фазолинейны, то между басом из основных каналов и басом сабвуфера появляется разность фаз. Полученный эффект аналогичен, изображенному на Рис 4. Поэтому к сабвуферу должен быть применен всепропускающий фазокорректирующий фильтр, имеющий ФЧХ, аналогичную ФЧХ НЧ/ВЧ фильтра для устранения этой разности. Также надо заметить, что ФЧХ НЧ и ВЧ фильтров должны быть одинаковы.

Итак, мы получили следующие требования к фильтрам:

Этим критериям отвечает фильтр Линквица-Райли. Этот тип фильтра реализуется как два последовательных фильтра Баттерворта. Поэтому задача сводится как разработке фильтра Баттерворта и правильном его применении.

Теория

Представление фильтра

Фильтр Баттерворта является БИХ фильтром. Для реализации БИХ фильтра его нужно выразить в одном из стандартных видов:

Разумеется все представления эквивалентны и могут быть преобразованы один в другой.

Прямая форма

Коэффициенты разностного уравнения предполагают прямую реализацию фильтра в виде:

(1) H(z) = \frac{\sum_{i=0}^{M}{b_i z^{-i}}}{\sum_{i=0}^{N}{a_i z^{-i}}}

(2) y[n] = \sum_{i=0}^{M}{\frac{b_i}{a_0} x[n-i]} - \sum_{i=1}^{N}{\frac{a_i}{a_0} y[n-i]}

Однако, при большом порядке фильтра такая реализация очень чуствительна к эффектам конечной разрядности, поэтому все источники рекомендуют избегать такой реализации.

При вещественных коэффициентах a_i и b_i и вещественной входной последовательности x[n], выходная последовательность также будет вещественной.

Нули и полюсы

Разложение системной функции вида (1) на множители приводит к виду:

(3) H(z) = G \frac{\prod_{i=1}^{M}{(1-n_i z^{-1})}}{\prod_{i=1}^{N}{(1-p_i z^{-1})}}
где n_i - комплексный нуль системной функции, p_i - полюс, G=b_0/a_0 - общий коэффициент усиления.

Т.е. представлением фильтра является набор нулей и полюсов. Это представление удобно тем, что многие методы расчета фильтров дают именно нули и полюсы системной функции.

С другой стороны становится возможным задавать фильтр, который дает комплексную последовательность на выходе.

Каскадная форма

Каскадная (последовательная) реализация - это разложение системной функции вида (1) на произведение биквадратных множителей:

(4) H(z) = \prod_{i=0}^{K-1} \frac{b_{0,i} + b_{1,i} z^{-1} + b_{2,i} z^{-2}} {a_{0,i} + a_{1,i} z^{-1} + a_{2,i} z^{-2}}

где K = \lceil N/2 \rceil - число каскадов фильтра (при нечетном N один из каскадов будет билинейным).

Реализацией этого метода является последовательное применение прямой формы (2) для каждого каскада:

(5) y_i[n] = \frac{1}{a_{0,i}} (b_{0,i} x_i[n] + b_{1,i} x_i[n-1] + b_{2,i} x_i[n-2] - a_{1,i} y[n-1] - a_{2,i} y[n-2])

Входом для i-го каскада является выход предыдущего (т.е. x_i[n] = y_{i-1}[n] и x_0[n]=x[n]). Результатом работы фильтра является последовательность y[n] = y_{K-1}[n].

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

Разложение системной функции вида (1) на множители приводит к виду (3). Так как на выходе мы хотим получить вещественную последовательнсть, то нули и полюсы образуют комплексно-сопряженные пары и каждая пара образует квадратичную форму:

(1 - n z^{-1})(1 - n^* z^{-1}) = 1 - 2 |n| \cos(\arg(n)) z^{-1} + |n|^2 z^{-2}

т.е. коэффициенты звена системной функции будут равны:

\\
a_{0,i} = 1\\
a_{1,i} = -2 |p_i| \cos(\arg(p_i))\\
a_{2,i} = |p_i|^2 \\
b_{0,i} = 1\\
b_{1,i} = -2 |n_i| \cos(\arg(n_i))\\
b_{2,i} = |n_i|^2

Если некоторые нули и полюсы являются вещественными, то соответствующие звенья системной функции будут линейными.

Комбинирование квадратичных форм нулей и полюсов дает вид (4). Возможны разные комбинации нулей и полюсов, которые дают один и тот же фильтр. Однако, точность вычислений разных представлений может отличаться, поэтому необходимо подбирать порядок каскадов и комбинации нулей и полюсов.

Параллельная форма

Вместо разложения на множители можно разложить системную функцию на сумму дробей:

(6) H(z) = \sum_{i=0}^{N_1}{c_i z^{-i}} + \sum_{i=1}^{N_2}{\frac{b_{0,i} + b_{1,i} z^{-1}}{a_{0,i} + a_{1,i} z^{-1} + a_{2,i} z^{-2}}}

(Если M < N, то первое слагаемое отсутствует)

Реализацией этого метода является сумма прямых форм (2) для каждого звена:

(7) y[n] = \sum_{i=0}^{N_1}{c_i x[n-i]} + \frac{1}{a_{0,i}} \sum_{i=0}^{N_2}{(b_{0,i} x_i[n] + b_{1,i} x_i[n-1] - a_{1,i} y[n-1] - a_{2,i} y[n-2])}

Порядок каскадов не влияет на точность, и эта точность сравнима с точностью лучшего варианта последовательного метода. Таким образом нет необходимости в переборе вариантов.

Выбор представления фильтра

Главное требование к представлению фильтры - должно быть удобно задавать параметры фильтра и оперировать ими. Сама процедура фильтрации может использовать собственное, оптимизированное представление фильтра.

Наиболее развиты методы для расчета фильтров в виде каскада биквадратных звеньев. Расчет, приведенный ниже, также удобно выражать в виде каскада. Поэтому основным представлением фильтра будет каскадное.

Фильтр Баттерворта

Pic 5: Poles of Butterworth filter

ФНЧ Баттерворта определен через квадрат его АЧХ следующим образом:

A^2(w) = \frac{1}{1+(\frac{w}{w_c})^{2N}}

где N - порядок фильтра и w_c - частота среза.

Полагая s=iw получаем:

H_s(s)H_s(-s) = \frac{1}{1+\left(\frac{s^2}{-w_c^2}\right)^N} = \frac{w_c^{2N}}{w_c^{2N} + (-s^2)^N}

Нулями знаменателя (полюсами системной функции) будут:

(-s^2)^N = -w_c^{2N}

s_{1,k} = w_c i \sqrt[2N]{-1}  = w_c e^{i \pi (2k+1)/2N + i \pi / 2}
s_{2,k} = - w_c i \sqrt[2N]{-1} = w_c e^{i \pi (2k+1)/2N - i \pi / 2}

Заметим, что корни s_{1,k} лежат в левой полуплоскости. Поэтому:

H_s(s) = \frac{w_c^N}{\prod_{k=0}^{N-1}{(s-s_{1,k})}} = \frac{w_c^N}{\prod_{k=0}^{N-1}{(s-w_c e^{i \pi (2k+1)/2N + i \pi / 2})}}

Сгруппируем комплексно-сопряженные корни s_{1,k} и s_{1,N-1-k}:

(s-s_{1,k}) (s-s^*_{1,k}) = s^2 + 2 w_c s \sin \phi_k + 1

Где k=0..K-1, K=\lfloor N/2 \rfloor и \phi_k = \pi (2k+1)/2N

При четном N все полюса комплексно-сопряжены, при нечетном s_K = -w_c - вещественный корень. Поэтому:

H_s(s) = w_c^N \prod_{k=0}^{K-1}{\frac{1}{s^2 + 2 w_c s \sin \phi_k + w_c^2}} (при четном N)

H_s(s) = \frac{w_c^N}{s+w_c} \prod_{k=0}^{K-1}{\frac{1}{s^2 + 2 w_c s \sin \phi_k + w_c^2}} (при нечетном N)

Таким образом, мы получили функцию передачи в s-области. Однако, для реализации фильтра нам нужна функция передачи в z-области. Существует несколько методов преобразования в z-область. Для фильтров Баттерворта классическим методом является метод билинейного преобразования. Этот метод сохраняет существенные достоинства фильтра - гладкость и монотонность AЧХ, и не имеет проблем с алиасингом (сворачиванием спектра).

Билинейное преобразование

Билинейное преобразование задается заменой переменных:

(7) s=k\frac{1-z^{-1}}{1+z^{-1}}

где k - коэффициент масштабирования.

Подставим (7) в выражение для биквадратного звена:

\frac{b_0 + b_1 s + b_2 s^2}{a_0 + a_1 s + a_2 s^2} \left | _{s=k\frac{1-z^{-1}}{1+z^{-1}}} = \frac{B_0 + B_1 z^{-1} + B_2 z^{-2}}{A_0 + A_1 z^{-1} + A_2 z^{-2}}

\\
A_0 = a_0 + a_1 k + a_2 k^2\\
A_1 = 2(a_0 - a_2 k^2)\\
A_2 = a_0 - a_1 k + a_2 k^2 \\
B_0 = b_0 + b_1 k + b_2 k^2\\
B_1 = 2(b_0 - b_2 k^2)\\
B_2 = b_0 - b_1 k + b_2 k^2

Так как билинейное преобразование деформирует частоты, то нам нужно выбрать коэффициент масштабирования k так, чтобы частота среза переводилась сама в себя. Для этого нам нужно найти связь между частотами в s и z областях. Обозначим f_s - частота дискретизации, \Omega = w T = w / f_s - нормированная частота в z-области. Подставляя в (7) s = iw и z=e^{i\Omega} получим:

(8) iw = k \frac{1-e^{i\Omega}}{1+e^{i\Omega}}=i k \frac{\sin\Omega}{1+\cos\Omega}=i k \tan \frac{\Omega}{2}

k = \frac{w_c}{\tan \frac{w_c}{2 f_s}} = w_c \frac{1+\cos(w_c/f_s)}{\sin(w_c/f_s)}

Прототипирование

Итак, масштабирование при билинейном преобразовании необходимо в любом случае. Поэтому мы можем положить w_c в выражении для H(s) равным любому удобному значению. Широко используется нормализованная форма, где w_c = 1:

H_s(s) = \prod_{k=0}^{K-1}{\frac{1}{s^2 + 2 s \sin \phi_k + 1}} (при четном N)

H_s(s) = \frac{1}{s+1} \prod_{k=0}^{K-1}{\frac{1}{s^2 + 2 s \sin \phi_k + 1}} (при нечетном N)

Такая форма - прототип, из которого можно получить разные формы фильтра при помощи замены переменной.

Прототип ФВЧ получается заменой s=1/s. Такая замена приводит к следующему преобразованию биквадратного звена:

\frac{b_0 + b_1 s + b_2 s^2}{a_0 + a_1 s + a_2 s^2} \left | _{s=1/s} = \frac{b_2 + b_1 s + b_0 s^2}{a_2 + a_1 s + a_0 s^2}

Т.е. пары коэффициентов a_0, a_2 и b_0, b_2 просто меняются местами.

Чтобы получить коэффициент масштабирования для прототипа, подставим w=1 и \Omega=w_c/f_s в (8):

k = \cot \frac{w_c}{2 f_s}

Фильтр Линквица-Райли

Так как фильтр Линквица-Райли представляет собой каскад из друх фильтров Баттерворта, то для его построения достаточно просто удвоить каждый каскад фильтра Баттерворта.

Также учтем, что одно из звеньев фильтра Баттерворта может быть билинейным. Это звено удваивать не нужно, достаточно возвести его в квадрат получения одного биквадратного звена (сэкономим одно звено). Таким образом получим следующие прототипы для НЧ (H_{LP}) и ВЧ (H_{HP}) фильтров:

При четном N:

H_{LP}(s) = \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

H_{HP}(s) = \prod_{k=0}^{K-1}{\left(\frac{s^2}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

При нечетном N:

H_{LP}(s) = \frac{1}{s^2+2s+1} \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

H_{HP}(s) = \frac{s^2}{s^2+2s+1} \prod_{k=0}^{K-1}{\left(\frac{s^2}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

Разность фаз

Интересен вопрос о разности фаз между НЧ и ВЧ фильтрами Линквица-Райли. Для четных N эта разность равна:

\Delta \phi (w) = \arg (H_{LP}(iw)) - \arg(H_{HP}(iw))

\arg (H_{HP}(iw)) = \sum_{k=0}^{K-1} \arg((iw)^4) + \arg (H_{LP}(iw))

\Delta \phi (w) = -\sum_{k=0}^{K-1} \arg((iw)^4) = -\sum_{k=0}^{K-1} 4 \arg(iw) = -2K\pi

Разность фаз постоянна (не зависит от частоты) и пропорциональна 2\pi, т.е. НЧ и ВЧ части синфазны, но НЧ запаздывает на целое число периодов.

Аналогично, для нечетных N:

\arg (H_{HP}(iw)) = \arg(-w^2) + \sum_{k=0}^{K-1} 4 \arg(iw) + \arg (H_{LP}(iw))

\Delta \phi (w) = - \arg(-w^2) - \sum_{k=0}^{K-1} 4 \arg(iw) = - \pi - 2K\pi

Здесь появилась дополнительная разность фаз в пол-периода. Компенсировать ее можно инвертированием дополнительного звена.

Кроссовер

Учитывая поправки фазы для фильтра Линквица-Райли, НЧ и ВЧ фильтры для кроссовера примут следующий вид:

При четном N:

H_{LP}(s) = \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

H_{HP}(s) = \prod_{k=0}^{K-1}{\left(\frac{s^2}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

При нечетном N:

H_{LP}(s) = \frac{-1}{s^2+2s+1} \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

H_{HP}(s) = \frac{s^2}{s^2+2s+1} \prod_{k=0}^{K-1}{\left(\frac{s^2}{s^2 + 2 s \sin \phi_k + 1} \right)^2}

Всепропускающий фильтр

Pic 6: Nulls of allpass filter
Pic 7: Nulls and poles of allpass filter

Всепропускающий (фазокорректирующий) фильтр получается суммированием ВЧ и НЧ фильтров:

H_{AP}(s) = (s^{2N} + 1) \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2} (при четном N)

H_{AP}(s) = \frac{s^{2N} - 1}{s^2+2s+1} \prod_{k=0}^{K-1}{\left(\frac{1}{s^2 + 2 s \sin \phi_k + 1} \right)^2} (при нечетном N)

Если сравнить системные функции, то можно увидеть, что фильтр получается добавлением нулей к НЧ фильтру Линквица-Райли. Найдем их (Рис 6):

s_{1,k} = \sqrt[2N]{-1} = e^{i\pi (2k+1)/2N} (При четном N)
s_{2,k} = \sqrt[2N]{1} = e^{i\pi k/N} (При нечетном N)

Если сравнить нули с полюсами фильтра Баттерворта (Рис 5), то можно увидеть, что нули левой полуплоскости совпадают с найденными полюсами. Поэтому полюса второго порядка фильтра Линквица-Райли станут полюсами первого порядка, а нули расположатся в правой полуплоскости симметрично полюсам (Рис 7):

p_{1,k} = w_c e^{i \pi (2k+1)/2N + i \pi / 2} (полюса)
n_{2,k} = w_c e^{i \pi (2k+1)/2N - i \pi / 2} (нули)

Сгруппировав комплексно-сопряженные пары получим следующий вид системной функции:

H_{AP}(s) = \prod_{k=0}^{K-1}{\frac{s^2 - 2 s \sin \phi_k + 1}{s^2 + 2 s \sin \phi_k + 1}} (при четном N)

H_{AP}(s) = \frac{s-1}{s+1} \prod_{k=0}^{K-1}{\frac{s^2 - 2 s \sin \phi_k + 1}{s^2 + 2 s \sin \phi_k + 1}} (при нечетном N)

Итог

БИХ фильтр будем представлять в виде каскада биквадратных звеньев вида

\frac{b_0 + b_1 s + b_2 s^2}{a_0 + a_1 s + a_2 s^2}

Прототип фильтра Баттерворта порядка N задается следующим образом:

\\
a_{0,i} = 1\\
a_{1,i} = 2 \sin \phi_i\\
a_{2,i} = 1 \\
b_{0,i} = 1\\
b_{1,i} = 0\\
b_{2,i} = 0

Где i = 0..K, K = \lfloor N/2 \rfloor$ - 1 и \phi_i = \pi(2i+1)/2N

При нечетном N добавляется еще одно звено:

\\
a_{0,K} = 1\\
a_{1,K} = 1\\
a_{2,K} = 0 \\
b_{0,K} = 1\\
b_{1,K} = 0\\
b_{2,K} = 0

Для преобразования ФНЧ-прототипа в ФВЧ нужно поменять местами пары коэффициентов a_{0,i}, a_{2,i} и b_{0,i}, b_{2,i}.

Билинейное преобразование задается так:

\\
A_0 = a_0 + a_1 k + a_2 k^2\\
A_1 = 2(a_0 - a_2 k^2)\\
A_2 = a_0 - a_1 k + a_2 k^2 \\
B_0 = b_0 + b_1 k + b_2 k^2\\
B_1 = 2(b_0 - b_2 k^2)\\
B_2 = b_0 - b_1 k + b_2 k^2

Коэффициент масштабирования k равен:

k = \cot \frac{w_c}{2 f_s}

Фильтр Линквица-Райли получается дублированием биквадратных звеньев фильтра Баттерворта и возведением в квадрат билинейного звена (при нечетном N).

Фазокорректирующий фильтр порядка N имеет следующий прототип:

\\
a_{0,i} = 1\\
a_{1,i} = 2 \sin \phi_i\\
a_{2,i} = 1 \\
b_{0,i} = 1\\
b_{1,i} = -2 \sin \phi_i\\
b_{2,i} = 1

Где i = 0..K

При нечетном N добавляется еще одно звено:

\\
a_{0,K} = 1\\
a_{1,K} = 1\\
a_{2,K} = 0 \\
b_{0,K} = -1\\
b_{1,K} = 1\\
b_{2,K} = 0

Результаты

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

Сгенерируем белый шум и пропустим его через перенаправление баса. Для того, чтобы увидеть фазовые эффекты, шум в разных каналах должен быть коррелированным (проще всего просто использовать одинаковых сигнал для всех каналов). Используя разные матрицы микширования AC3Filter можно получить "чистые" результаты работы фильтров по отдельности. Также нас будет интересовать совокупный спектр результата перенаправления (т.е. спектр суммы всех каналов). Он должен быть плоским.

Старая реализация

В старой реализации не применялись ВЧ и всепропускающий фильтры. Поэтому будут приведены графики только для НЧ фильтра и суммы всех каналов.

Pic 8: Old bass redirection method (up to v1.63b)

Очевидно, что ни НЧ фильтр ни результат работы перенаправления не удовлетворительны. Т.к. фазокорректирующий фильтр не применялся, то результат работы очень напоминает приведенный на Pис 4. Общая неравномерность АЧХ в переходной области достигает 12дБ.

Новая реализация

Pic 8: New bass redirection method (v2.0 and later)

Результаты работы фильтров точно такие, как и ожидалось. Общая неравномерность АЧХ в обоих режимах работы лежит в пределах 1дБ (на рисунке не показана, т.к. совпадает с всепропускающим фильтром).

Перемещение сабвуфера

Так как часто сабвуфер устанавливается в комнате независимо от основных колонок, то из-за разности расстояний между сабвуфером и колонками в переходной области могут возникать искажения. Смоделировать эти искажения можно суммированием всех каналов после перенаправления, при этом накладывая канал сабвуфера с некоторым сдвигом.

Pic 10: Subwoofer movement (old bass redirection method)

Хорошо видно, что даже при небольших перемещениях сабвуфера возникают значительные искажения.

File:Bass redirection 11.png
Pic 11: Subwoofer movement (new bass redirection method)

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

Links