Страница 1 из 6

Коэффициенты БИХ фильтров

Добавлено: 08 дек 2010, 21:49
Dmitri Seva
Здравствуйте. В демонстрационной программе filter.exe рассчитываются коэффициенты a и b. Как я понимаю это коэффициенты для стандартного разностного уравнения БИХ фильтров?

Я хочу рассчитывать коэффициенты a и b динамически в зависимости от характеристик фильтра. Искал на сайте формулы, по которым можно рассчитать эти коэффициенты, но нашел только формулы для расчета передаточных характеристик H(z). Я не совсем понимаю, как сделать фильтрацию, если рассчитаны нули и полюса передаточной функции и вообще передаточная функция известна. Если бы это был КИХ фильтр, то там как я понимаю, нужно было бы сделать обратное преобразование Лапласа для того - чтобы получить импульсную характеристику, с которой производим свертку. Здесь же для БИХ непонятно как найти коэффициенты a и b которые нужны для разностного уравнения.

Re: Коэффициенты БИХ фильтров

Добавлено: 09 дек 2010, 08:25
Бахурин Сергей
Если у вас есть передаточная характеристика цифрового бих-фильтра Н(z), то коэффициенты полинома числителя H(z) это к-ты "b" разностного уравнения, а коэффициенты полинома знаменателя H(z) это к-ты "a" разностного уравнения бих фильтра. Поэтому те коэффициенты которые вы видите в программе filter они же к-ты разностного уравнения, и они же к-ты передаточной характеристики H(z). Про это можно подробно почитатьв этой статье. Обратите внимание на формулы (10), (18) и (19).
Для динамического расчета возьмите dsp.dll она умеет расчитывать бих-фильтры.

Re: Коэффициенты БИХ фильтров

Добавлено: 09 дек 2010, 21:16
Dmitri Seva
Дело в том что я не могу использовать dsp.dll, попробую разобраться с теорией.

Как я понял динамический расчет фильтра можно осуществить если предварительно вывести формулы расчета коэффициентов для всех желаемых порядков N и необходимых типов (ФНЧ,ФВЧ,ПФ,РФ) фильтров (Баттерворт, Чебышев, Кауэр):

1) Задаем передаточную функцию H(s) указанного типа и порядка (например ФНЧ Баттерворта порядка N).
2) Приводим H(s) к H(z) с помощью билинейного преобразования к виду (10) как здесь.
3) Выписываем формулы при соответствующих степенях z как коэффициенты a[n],b[n].

Обобщаем все что можно для произвольного N.

Правильно ли я понимаю процесс?

По идее должны получится стандартные формулы, удивительно что я так их нигде и не нашел.

Re: Коэффициенты БИХ фильтров

Добавлено: 09 дек 2010, 22:25
Бахурин Сергей
Здесь приведена последовательность действий:
# Постановка задачи.
# Выбор аппроксимации частотной характеристики фильтра, или как еще говорят, типа фильтра. Основными возможными вариантами являются фильтры Баттерворта, Чебышева 1-го или 2-го рода, а также эллиптические фильтры (фильтры Кауэра). Приведенные типы фильтров аппроксимируют амплитудно-частотную характеристику. При аппроксимации фазочастотной характеристики фильтра применяют аппроксимацию по Бесселю.
# Расчет фильтра нижних частот (ФНЧ) заданного типа с частотой среза 1 рад/с
# Использование одного из частотных преобразований фильтра: ФНЧ-ФНЧ, ФНЧ-ФВЧ, ФНЧ-ПФ или же ФНЧ-РФ
# Применение билинейного преобразования для расчета цифрового фильтра с заданными характеристиками

Для начала необходимо задать требования для цифрового фильтра или как его называют коридор АЧХ. После этого пресчитываем коридор цифрового фильтра в коридор аналогового (читай здесь в частности формула (6)). Получили коридор аналогового фильтра, который может быть фнч, фвч, полосовой или режекторный. Следующий шаг пересчитываем полученный коридор аналогового фильтра произвольной формы в коридор АЧХ аналогового нормированного фнч (с частотой среза 1 рад/c), поскольку именно аналоговый фнч наиболее просто рассчитать. Данный пересчет рассмотрен здесь и здесь Для заданного коридора АЧХ уже аналогового нормированного фнч и выбранного типа фильтра (Баттерворта Чебышева или эллиптического) расчитываем порядок фильтра (читай здесь). Следующий этап расчет H(s) нормированного ФНЧ заданного порядка по заданному коридору АЧХ (для каждого типа фильтра это подробно описано с примерами). Потом делаем частотное преобразование H(s) нормированного аналогового фнч в фнч с заданной частотой среза или в фвч или полосовой или в режекторный фильтры. Как это сделать тоже описано. Ну и последний шаг - билинейное преобразование полученного H(s) в H(z) требуемого цифрового фильтра.

Должен честно признаться я потратил больше года разбираясь с этим и реализовывая это все программно. ;)

Re: Коэффициенты БИХ фильтров

Добавлено: 23 фев 2011, 18:08
Dmitri Seva
Признаться, я не представляю зачем такие сложности с реализацией аналитического расчета фильтров. (Там действительно вплоть до 12го порядка были выведены формулы? :o ). Должны быть оптимизационные методы, которые позволяют аппроксимировать частотную характеристику БИХ-фильтра по заданным параметрам, подбором коэффициентов a и b до приемлемой погрешности. Пока ищу статьи с проверенными методами. Буду рад если чего подскажете по этому поводу.

Вообще изначально стоит задача фильтровать низкие частоты (до 7 Гц) волновых форм (Частота дискр: 100 Гц) полученных с сейсмодатчиков. Сигнал изначально тишина - почти ничего нету, затем резко возникает событие - скачок (Удар гири по почве). Необходимо почистить событие от высоких частот. Пробовал по неопытности оптимальный КИХ-фильтр Чебышевской аппроксимации, но там порядок в районе 50-100 выдает просто нереальный переходный процесс (порядка секунды), в результате в выходном сигнале я вижу нарастающую гармошку, вызванную переходным процессом (а точнее это чуть ли не импульсная характеристика). Сигнал смотрят глазами и эта гармошка весьма мешается. Пробовал эллиптический БИХ-фильтр в матлабе, при малых порядках (3-4) выдает то что нужно - отфильтрованный затухающий скачок. Поэтому пока реализовал расчет БИХ-фильтра с фиксированными коэффициентами.

Re: Коэффициенты БИХ фильтров

Добавлено: 23 фев 2011, 21:35
Бахурин Сергей
цифровые фильтры рассчитываются исходя из аналоговых фильтров путем билинейного преобразования. Это основной способ расчета бих фильтров на сегодняшний день (в матлабе при расчете фильтров функциями butter, cheby и ellip реализован тот же метод что и рассмотрен в статьях). Фильтры Баттерворта, Чебышева и эллиптические (Кауэра) это и есть различные аппроксимации идеального фильтра. Причем никакая оптимизация не даст фильтр лучше эллиптического при заданных неравномерности в полосе пропускания и подавлении в полосе заграждения. Если вам нужно быстро пересчитать коэффициенты фильтра, то можно воспользоваться частотными преобразованиями для цифровых фильтров, которые позволяют цифровой ФНЧ быстро пересчитать в цифровой же ФНЧ но с другой частотой среза. Аналогично существуют преобразования цифровой ФНЧ - цифровой ФВЧ , полосовой и режекторный фильтры. Формулы пересчета есть практически в любой книге по цифровым фильтрам. В частности Константинидис введение в цифровые фильтры, или Гольденберг, Матюшкин Поляк ЦОС. Думаю такой способ пересчета фильтров вам поможет быстро их перестраивать. Но нужно сделать замечание, неравномерность в полосе пропускания и подавление в полосе заграждения при пересчете не меняются.

Re: Коэффициенты БИХ фильтров

Добавлено: 11 мар 2011, 14:37
Dmitri Seva
Моя программная реализация выдает неверные коэффициенты для Режекторных фильтров. Для примера решил рассчитать простенький цифровой фильтр 1го порядка Баттерворта со следующими характеристиками:

рад/сек
рад/сек
рад/сек
рад/сек

где индексы p - pass, l - low, s - stop, h - high, соответственно pl - нижняя частота пропускания, sh - верхняя частота подавления, и т.д.

дБ
дБ

Считаю следующим образом:

1. Т.к. нам нужен цифровой фильтр то перед биллинейным преобразованием нужно сделать предискажение частот:
рад/сек
рад/сек
рад/сек
рад/сек

2. Т.к. у нас режекторный фильтр, нам нужно вычислить и :

рад^2/сек^2
рад/сек

3. Для режекторного фильтра частота среза нормированного ФНЧ прототипа пересчитывается согласно Частотное преобразование ФНЧ-РФ

Рассчитаем
Т.к. то


4. Рассчитаем передаточную характеристику нормированного ФНЧ Баттерворта 1го порядка.






5. Преобразование ФНЧ прототипа к частоте среза


6. Преобразование полученного ФНЧ прототипа с частотой среза 0.47277 в РФ с параметрами и



7. Билинейное преобразование аналоговой передаточной характеристики H(s) в цифровую характеристику H(z).
При , можно принять что



Разделим числитель и знаменатель передаточной характеристики на коэффициент знаменателя при



8. Выпишем полученные коэффициенты фильтра

b0 = 0.645837
b1 = -0.2267
b2 = 0.645837

a0 = 1
a1 = -0.2267
a2 = 0.291675

Если использовать программу filter для рассчета этого фильтра то на выходе будет:
Коэффициенты b:
1.958767097331436900e-003
-6.878032178968385500e-004
1.958767097331436900e-003

Коэффициенты a:
1.000000000000000000e+000
-6.878032178968385500e-004
-9.960824658053371000e-001

При бОльших порядках у меня рассчеты тоже не сходятся, хотя все рассчитанно арифметически верно.
Я пробовал смотреть получаемые фильтры в матлабе через fvtool, всегда откуда то берется усиление в полосах пропускания, причем усиление не всегда одинаковое в разных полосах пропускания :( Что я делаю не так?

Re: Коэффициенты БИХ фильтров

Добавлено: 11 мар 2011, 15:51
Бахурин Сергей
вы рассчитываете режекторный фильтр. При расчете режекторного фильтра или фвч есть один нюанс. Необходимо делать одно преобразование фнч - фнч перед преобразованием фнч - рф (или фнч-фвч).
Т.е. ваш нормированный фнч баттерворта


надо преобразовать на частоту:


в вашем случае получается

и частота


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

Делать преобразование на вашу не нужно
Я поясню. Это преобразование делается для того чтобы гарантировать заданный уровень подавления в заданной полосе для заданного порядка фильтра вне зависимости от параметров wpl и wsl. Если вы не делаете этого преобразования, то вы гарантируете заданный уровень неравномерности на частотах wpl и wsl в независимость от уровня подавления в полосе заграждения. Об этом никто не пишет (по крайней мере я об этом нигде не читал, а доходил до них самостоятельно). Приведенная формула годится только для фильтра Баттерворта, для других фильтров формулы такие:
для Чебышева 1 и 2 рода:


для эллиптического:


где функция пересчета согласно (5) статьи про эллиптические фильтры

Re: Коэффициенты БИХ фильтров

Добавлено: 12 мар 2011, 21:49
Dmitri Seva
Спасибо большое! У меня получились такие же коэффициенты как и у вас, но с небольшим НО. Дело в том что все заработало когда я применил формулу



а не
Бахурин Сергей писал(а):
Я так думаю что для Режекторных фильтров отношение переворачивается, т.е. полосы заграждения и подавления меняются местами. Пока я работал только над Баттервортом, для остальных типов фильтров (вч,полосовой,нч), никаких дополнительных преобразований исходного нормированного ФНЧ не потребовалось, прямое преобразование выдало то, что нужно. Странно, почему для ВЧ не потребовалось дополнительного преобразования?
Получается совпадение с коэффициентами, которая выдает программа filter 6 цифр double (8 байт ieee754). Я так понимаю у вас рассчитывается с помощью float (4 байта ieee754) ?.
Кстати, я пробовал способ расчета режекторного фильтра без дополнительного преобразования ФНЧ. В этом случае,
я использовал следующие формулы:


Если
то

в противном случае


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

Re: Коэффициенты БИХ фильтров

Добавлено: 13 мар 2011, 19:06
Бахурин Сергей
Насчет формулы необходимо проверить. Открыл свой код у меня es/ep:

Код: Выделить всё


double ep = sqrt(pow(10.0,fp.Rp/10.0) - 1); 
double es = sqrt(pow(10.0,fp.Rs/10.0) - 1);

if((pfp->type & FA_TYPE) == FA_BUTTER)	w = pow(es/ep, 1.0/(double)order);
if((pfp->type & FA_TYPE) == FA_CHEBY1)	w = cosh(acosh(es/ep)/(double)order);
if((pfp->type & FA_TYPE) == FA_CHEBY2)	w = cosh(acosh(es/ep)/(double)order);
if((pfp->type & FA_TYPE) == FA_ELLIP)	w = 1.0/ellipdeg(order,ep/es);

По поводу представления double в программе фильтр. Расчет в dsp.dll производится в doiuble (8 байт), и если вы будете использовать dsp.dll, то результаты должны совпасть по идее, но при печати в программе фильтр используется float