"Оптимальные" коэффициенты БИХ фильтра

Все что касается фильтрации
Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Фильтр Баттерворта 15 порядка.

По-видимому это предельный случай, который можно рассчитать "вручную". Калькулятор (1+z)^15 отказался считать :(

Итак, обозначим:



















Матрица z-преобразования:
Butt15.JPG

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Сегодня закончил вывод формул для пересчёта коэффициентов ФНЧ в ПФ для фильтра Баттерворта 3 порядка. Сложность формул возрастает значительно. Большой вопрос - получиться ли реализовать адаптивный фильтр выше 3 порядка на микроконтроллерах низкого быстродействия :(
Но есть и положительные моменты - нашёл формулу непосредственного z-преобразования Нфнч(S) --> Hпф(z). То есть промежуточное преобразование S--> (S*S+w*w)/BS можно не делать!
При применении "матрицы z-преобразования" запись получается довольно компактной.
Проверял всё с помощью filter.exe. Погрешность порядка 10^-7. Коэффициенты в Excel рассчитывал.
Таким образом, коэффициенты ФНЧ, ФВЧ и ПФ (не очень высокого порядка) довольно легко пересчитывать непосредственно в микроконтроллере.
Сергею Бахурину.
Сейчас я морально готов написать статью для сайта :D (Если такая необходимость имеется, в чём я не совсем уверен из-за полного отсутствия обсуждения :D )

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Рассмотрим преобразование ФНЧ(S)--> ПФ(z) на примере фильтра Баттерворта 2 порядка.
Будем использовать обозначения из статьи:
http://www.dsplib.ru/content/filters/bu ... terex.html

где

Матрица z-преобразования Нфнч(S)-->Hпф(z) для фильтра 2 порядка имеет вид:
M2.gif
M2.gif (3.24 КБ) 5878 просмотров
где

Fo- центральная частота фильтра, Fs - частота среза ФНЧ-прототипа, FN - частота Найквиста.

На этом расчёт цифрового полосового фильтра Баттерворта 2 порядка закончен (с) :D


Всех с праздником!

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Фильтр Баттерворта 3 порядка:


Матрица z-преобразования ПФ Баттерворта 3 порядка:
CodeCogsEqn.gif
CodeCogsEqn.gif (5.2 КБ) 5855 просмотров
где

Fo- центральная частота фильтра, Fs - частота среза ФНЧ-прототипа, FN - частота Найквиста.



А матрица 4 порядка - в окно не влезает... :lol: :lol: :lol:

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Как мы видим, технология расчёта цифрового полосового фильтра предельно упростилась. Теперь даже не надо вычислять коэффициенты ФНЧ в z-области. Кстати говоря, идея рассчитывать коэффициенты ПФ по коэффициентам ФНЧ в z-области по-видимому тупиковая! Для фильтра 2 порядка это ещё получилось, а выше возникают определённые трудности (в частности мешает нормировка на а0). А вот работать с коэффициентами Н(S) (я их по аналогии с идеями ООП называю коэффициенты -"предки" :D ) очень легко!

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Программа расчёта коэффициентов полосового фильтра Баттерворта 3 порядка:

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

Subroutine BP_Butterworth_3(F0,Fs,Rp,A,B)
!F0- относительная центральная частота, Fs-относительная частота среза,Rp - неравномерность АЧХ (дБ)
!A,B - выходные массивы коэффициентов
real*8 F0,FN,Fs,Fd,Rp,Pi,Psi,Psi2,Omega_p,Ep,Alpha,Beta
real*8 b1,b2,b3,a0
real*8, dimension (7) :: A,B
Pi=3.1415926535897932384626433832795
Omega_p=DTAN(Fs*0.5*Pi)
Ep=DSQRT(10.**(Rp*0.1)-1.)
Alpha=1.0/Ep**(1./3)
Beta=Alpha*Omega_p
Psi=-2.*DCOS(F0*Pi)/DCOS(Fs*0.5*Pi)
b1=2.*Beta
b3=Beta*Beta
b2=2.*b3
b3=beta*b3
a0=1.0/(1.+b1+b2+b3)
A(1)=1.
A(2)=Psi*(3.+2.*b1+b2)*a0
Psi2=Psi*Psi
A(3)=a0*((Psi2+1.)*(3.+b1)-b2-3.*b3)
A(4)=a0*Psi*(Psi2+6.-2*b2)
A(5)=a0*((Psi2+1.)*(3.-b1)-b2+3.*b3)
A(6)=a0*Psi*(3.-2.*b1+b2)
A(7)=a0*(1.-b1+b2-b3)
B(1)=b3*a0
B(2)=0.
B(3)=-3.*B(1)
B(4)=0.
B(5)=-B(3)
B(6)=0.
B(7)=-B(1)
return 
end
Если не вычислять Alpha в программе - скорость расчета на Intel Atom 1.6 ГГц - 1 млн. фильтров в секунду.
Жалко под рукой нет ATMegи... :D

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Полосовой фильтр Баттерворта 4 порядка:


Внимание! 04.05.2014 10:15 мск исправлена ошибка во втором столбце матрицы!
CodeCogsEqn.gif
CodeCogsEqn.gif (8.73 КБ) 5875 просмотров
Обозначения те же. :D

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Программа расчёта коэффициентов полосового фильтра Баттерворта 4 порядка:

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

Subroutine BP_Butterworth_4(F0,Fs,Rp,A,B)
!F0- относительная центральная частота, Fs-относительная частота среза,Rp - неравномерность АЧХ (дБ)
!A,B - выходные массивы коэффициентов
real*8 F0,FN,Fs,Fd,Rp,Pi,Psi,Psi0,Psi2,Psi3,Psi4,Omega_p,Ep,Alpha,Beta
real*8 K2,b1,b2,b3,b4,bv,b2w,b3v,a0,v,w
real*8, dimension (9) :: A,B
Pi=3.1415926535897932D+00
K2=dsqrt(2.0D+00)
v=dsqrt(2.-K2)+dsqrt(2.+K2)
w=K2+2.
Omega_p=DTAN(Fs*0.5*Pi)
Ep=DSQRT(10.**(Rp*0.1)-1.)
Alpha=1.0/Ep**(0.25)
Beta=Alpha*Omega_p
Psi0=1./DCOS(Fs*0.5*Pi)
Psi=-2.*DCOS(F0*Pi)*Psi0
Psi2=Psi*Psi
Psi3=Psi2*Psi
Psi4=Psi3*Psi
b2=beta*beta
b3=b2*beta
b4=beta*b3
bv=beta*v
b2w=b2*w
b3v=b3*v
a0=1.0/(1.D+00+bv+b2w+b3v+b4)
A(1)=1.
A(2)=Psi*(4.+3.*bv+2.*b2w+b3v)*a0
A(3)=a0*(2.*(3.*Psi2+2.)+bv*(3.*Psi2+2.)+b2w*Psi2-2.*(b3v+2.*b4))
A(4)=a0*(4.*Psi*(Psi2+3.) +bv*Psi*(Psi2+3.)-Psi*(2.*b2w+3.*b3v))
A(5)=a0*(6.+Psi4+12.*Psi2-2.*b2w*(Psi2+1.)+6.*b4)
A(6)=a0*(4.*Psi*(Psi2+3.)-bv*Psi*(Psi2+3.)-Psi*(2.*b2w-3.*b3v))
A(7)=a0*(2.*(3.*Psi2+2.)-bv*(3.*Psi2+2.)+b2w*Psi2+2.*(b3v-2.*b4))
A(8)=Psi*(4.-3.*bv+2.*b2w-b3v)*a0
A(9)=a0*(1.-bv+b2w-b3v+b4)
B(1)=b4*a0
B(2)=0.
B(3)=-4.*B(1)
B(4)=0.
B(5)=6.*B(1)
B(6)=0.
B(7)=B(3)
B(8)=0.
B(9)=B(1)
return 
end

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Рассмотрим вопрос получения ПФ 5 порядка из коэффициентов ФНЧ Чебышева 2 рода и Кауэра.
Передаточная характеристика этих фильтров имеет вид:

Пришлось 5 порядок рассчитывать, т.к. он приведен в примерах в статьях:
http://www.dsplib.ru/content/filters/ch5/ch5.html
http://www.dsplib.ru/content/filters/ch6/ch6.html
Сразу неприятность - матрица 11х11 не помещается в Latex :(
Ну и ладно, запишем коэффициенты в явном виде:

























Заметим, что нам теперь 2 матрицы z-преобразования рассчитывать для An и для Bn.
Проверено электроникой (с)

Аватара пользователя
Santik
Сообщения: 609
Зарегистрирован: 28 дек 2010, 08:04
Откуда: Мирный (Якутия)
Контактная информация:

Re: "Оптимальные" коэффициенты БИХ фильтра

Сообщение Santik »

Заработало!!! :D :D :D
Коэффициенты ФНЧ - прототипа взяты из статьи:
http://www.dsplib.ru/content/filters/ch5/ch5.html
Сделано преобразование коэффициентов на частоту среза 0.1 и потом преобразование в ПФ на центральную частоту 0.3
ПФЧ2.JPG
Аналогично для эллиптического фильтра:
http://www.dsplib.ru/content/filters/ch6/ch6.html
ПФК.JPG

Ответить