"Оптимальные" коэффициенты БИХ фильтра
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
"Оптимальные" коэффициенты БИХ фильтра
Хотелось бы рассмотреть возможность построения системы оптимальных коэффициентов БИХ-фильтров с точки зрения быстродействия, что особенно актуально при реализации фильтров на микроконтроллерах. Т.е. хотелось бы, чтобы все коэффициенты а1, а2, а3... и b1, b2, b3... были из ряда ...1/16, 1/8, 1/4, 1/2, 1, 2, 4, 8... Тогда операция умножения заменяется операцией сдвига.
Последний раз редактировалось Santik 16 фев 2015, 08:51, всего редактировалось 1 раз.
- Бахурин Сергей
- Администратор
- Сообщения: 1114
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Оптимальные коэффициенты БИХ фильтра
Такой подход особый случай округления коэффициентов. Для бих всегда приходится контроллировать устойчивость потому что при округлении коэффициентов есть опасность выхода нуля за единичную окружность. Крометого думаю что такие трюки не прокатят на фильтрах чебышева или эллиптических фильтрах. Но вообще задача интересная.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Оптимальные коэффициенты БИХ фильтра
Ни в коем случае "округлять" коэффициенты я не предлагаю. Хотелось бы создать фильтр с коэффициентами удобными для применения на микроконтроллерах. А "поле" изменения параметров есть. Ради хороших коэффициентов можно пожертвовать в некоторых пределах характеристиками фильтра и даже подобрать нужную частоту дискретизации!Бахурин Сергей писал(а):Такой подход особый случай округления коэффициентов. Для бих всегда приходится контроллировать устойчивость потому что при округлении коэффициентов есть опасность выхода нуля за единичную окружность. Крометого думаю что такие трюки не прокатят на фильтрах чебышева или эллиптических фильтрах. Но вообще задача интересная.
Недавно эксперимент провёл - как отличается на современных процессорах скорость умножения на 1/2 и на 1/3.
Вывод - никак не отличается! Некоторые даже с целыми числами работают медленнее (CELERON), чем с floating point!
Но ждать когда такой же эффект будет у микроконтроллеров...
Предполагаю, что создать "оптимальные" коэффициенты можно будет только на фильтрах порядка больше 4 и меньше 7. А от типа фильтра не очень понимаю как может зависеть. Рекуррентная формула же не меняется...
Последний раз редактировалось Santik 16 фев 2015, 18:28, всего редактировалось 1 раз.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: Оптимальные коэффициенты БИХ фильтра
Пример оптимизации (может быть не очень удачный )
Пусть необходимо создать режекторный фильтр Fr=2000 Гц. Fd=10000 Гц.
Воспользуемся формулой(5) из статьи http://www.dsplib.ru/content/notch/notch.html
k1=-0.309017015
k2=0.5
соответственно коэффициенты:
G=(k2+1)/2=3/4
b0=1
b1=2*k1=-0.61803403
b2=1
a0=1
a1=k1(1+k2)=-0.463525522
a2=k2=0.5
Попытаемся оптимизировать коэффициенты a1и b1.
Пусть a1=k1(1+k2)=-0.5 =-1/2
Тогда k1=-1/3 или f0/Fd=0.195913279
Зададим Fd=10200 Гц
Тогда частота режекции будет Fr=1998.315449 (ошибка Fr 0.085%)
Таким образом при частоте дискретизации Fd=10200 Гц и Fr=1998.315449 Гц
получим следующие коэффициенты фильтра:
G=(k2+1)/2=3/4
b0=1
b1=2*k1=-2/3
b2=1
a0=1
a1=k1(1+k2)=-1/2
a2=k2=1/2
Положив G=1/2 получим:
b0=3
b1=-2
b2=3
a0=2
a1=-1
a2=1
Пусть необходимо создать режекторный фильтр Fr=2000 Гц. Fd=10000 Гц.
Воспользуемся формулой(5) из статьи http://www.dsplib.ru/content/notch/notch.html
k1=-0.309017015
k2=0.5
соответственно коэффициенты:
G=(k2+1)/2=3/4
b0=1
b1=2*k1=-0.61803403
b2=1
a0=1
a1=k1(1+k2)=-0.463525522
a2=k2=0.5
Попытаемся оптимизировать коэффициенты a1и b1.
Пусть a1=k1(1+k2)=-0.5 =-1/2
Тогда k1=-1/3 или f0/Fd=0.195913279
Зададим Fd=10200 Гц
Тогда частота режекции будет Fr=1998.315449 (ошибка Fr 0.085%)
Таким образом при частоте дискретизации Fd=10200 Гц и Fr=1998.315449 Гц
получим следующие коэффициенты фильтра:
G=(k2+1)/2=3/4
b0=1
b1=2*k1=-2/3
b2=1
a0=1
a1=k1(1+k2)=-1/2
a2=k2=1/2
Положив G=1/2 получим:
b0=3
b1=-2
b2=3
a0=2
a1=-1
a2=1
Последний раз редактировалось Santik 16 фев 2015, 18:29, всего редактировалось 1 раз.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Таким образом мы без всяких округлений получили целые коэффициенты фильтра, т.е. получили заведомо устойчивый фильтр .
Единственное деление на 2 для целых чисел легко получается арифметическим сдвигом вправо.
Для микроконтроллеров изменение частоты дискретизации легко может быть проведено путём подбора частоты кварцевого резонатора.
Единственное деление на 2 для целых чисел легко получается арифметическим сдвигом вправо.
Для микроконтроллеров изменение частоты дискретизации легко может быть проведено путём подбора частоты кварцевого резонатора.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Давайте теперь на примере всё того же режекторного фильтра рассмотрим случай Fr<<Fd.
Пусть Fr=50 Гц, Fd=44100 Гц. k2=1/2.
k1=-0.999974626
Положим k1=2^(-15)-1=-0.999969482, Fd=40250. Получим при этом Fr=50.04689734 Гц
Рекурентную формулу можно записать в виде:
Y(k)=3/4*{X(k)+(2^(-15)-1)*X(k-1)+X(k-2)-3/2*(2^(-15)-1)*Y(k-1)-1/2*Y(k-2)}
Заметим, что при 16-ти разрядном АЦП 2^(-15)*X(k) =0 при любом X(k).
Y(k)=3/4*{X(k)-X(k-1)+X(k-2)+3/2*Y(k-1)-3/2*2^(-15)*Y(k-1)-1/2*Y(k-2)}
Или
G=3/2
b0=1
b1=-1
b2=1
a0=2
a1=-3*[1-2^(-15)]
a2=1
Особо отметим, что нельзя приравнять a1=-3, т.к. Y- уже 32-разрядное число.
Пусть Fr=50 Гц, Fd=44100 Гц. k2=1/2.
k1=-0.999974626
Положим k1=2^(-15)-1=-0.999969482, Fd=40250. Получим при этом Fr=50.04689734 Гц
Рекурентную формулу можно записать в виде:
Y(k)=3/4*{X(k)+(2^(-15)-1)*X(k-1)+X(k-2)-3/2*(2^(-15)-1)*Y(k-1)-1/2*Y(k-2)}
Заметим, что при 16-ти разрядном АЦП 2^(-15)*X(k) =0 при любом X(k).
Y(k)=3/4*{X(k)-X(k-1)+X(k-2)+3/2*Y(k-1)-3/2*2^(-15)*Y(k-1)-1/2*Y(k-2)}
Или
G=3/2
b0=1
b1=-1
b2=1
a0=2
a1=-3*[1-2^(-15)]
a2=1
Особо отметим, что нельзя приравнять a1=-3, т.к. Y- уже 32-разрядное число.
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Рассмотрим фильтр Баттерворта N-порядка.
Отметим симметричность коэффициентов b:
N=3 b(k)=(1,3,3,1)
N=4 b(k)=(1,4,6,4,1)
N=5 b(k)=(1,5,10,10,5,1)
N=6 b(k)=(1,6,15,20,15,6,1)
N=7 b(k)=(1,7,21,35,35,21,7,1)
.....................
Коэффициент G, естественно, будет разный для каждой пары [Fs,N].
Заметим, что количество умножений при вычислении Y(k) можно существенно уменьшить.
Покажем это на примере N=5.
L1(n)_________L2(n)__________L3(n)
X(n)__________X(n)*5 ________ X(n)*10
X(n+1)_______ X(n+1)*5 ______ X(n+1)*10
X(n+2) ______ X(n+2)*5 ______ X(n+2)*10
X(n+3)_______ X(n+3)*5______ X(n+3)*10
X(n+4) ______ X(n+4)*5 _______ X(n+4)*10
X(n+5) ______ X(n+5)*5 ______ X(n+5)*10
Y(n+5)=(1/a0)*[L1(n+5)+L2(n+4)+L3(n+3)+L3(n+2)+L2(n+1)+L1(n) - a1*Y(n-1)-a2*Y(n-2)-a3*Y(n-3)-a4*Y(n-4)-a5*Y(n-5)]
Отметим симметричность коэффициентов b:
N=3 b(k)=(1,3,3,1)
N=4 b(k)=(1,4,6,4,1)
N=5 b(k)=(1,5,10,10,5,1)
N=6 b(k)=(1,6,15,20,15,6,1)
N=7 b(k)=(1,7,21,35,35,21,7,1)
.....................
Коэффициент G, естественно, будет разный для каждой пары [Fs,N].
Заметим, что количество умножений при вычислении Y(k) можно существенно уменьшить.
Покажем это на примере N=5.
L1(n)_________L2(n)__________L3(n)
X(n)__________X(n)*5 ________ X(n)*10
X(n+1)_______ X(n+1)*5 ______ X(n+1)*10
X(n+2) ______ X(n+2)*5 ______ X(n+2)*10
X(n+3)_______ X(n+3)*5______ X(n+3)*10
X(n+4) ______ X(n+4)*5 _______ X(n+4)*10
X(n+5) ______ X(n+5)*5 ______ X(n+5)*10
Y(n+5)=(1/a0)*[L1(n+5)+L2(n+4)+L3(n+3)+L3(n+2)+L2(n+1)+L1(n) - a1*Y(n-1)-a2*Y(n-2)-a3*Y(n-3)-a4*Y(n-4)-a5*Y(n-5)]
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Нужно отметить, что симметрией коэффициентов bn обладают фильтры Чебышева (1 и 2 рода), элиптические фильтры.
Но только фильтры Баттерворта и Чебышева 1 рода имеют целые коэффициенты
См. таблицу:
Но только фильтры Баттерворта и Чебышева 1 рода имеют целые коэффициенты
См. таблицу:
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Приведём пример "оптимизации" коэффициентов фильтра Баттерворта 4 порядка:
Пусть f0/fN=0.5, неравномерность 3 дБ
Воспользовавшись программой filter.exe получим:
Коэффициенты b:
9.409247452420184400e-002
3.763698980968073800e-001
5.645548471452109800e-001
3.763698980968073800e-001
9.409247452420184400e-002
Коэффициенты a:
1.000000000000000000e+000
1.475751202184475700e-003
4.860295104363562300e-001
3.094878156151232900e-004
1.766484293307393100e-002
Введем параметр G=b0
Оптимизируем G.
Удобно, если G=1/8.
Найдем такие параметры фильтра:
Пусть f0/fN=0.5, неравномерность 3 дБ
Воспользовавшись программой filter.exe получим:
Коэффициенты b:
9.409247452420184400e-002
3.763698980968073800e-001
5.645548471452109800e-001
3.763698980968073800e-001
9.409247452420184400e-002
Коэффициенты a:
1.000000000000000000e+000
1.475751202184475700e-003
4.860295104363562300e-001
3.094878156151232900e-004
1.766484293307393100e-002
Введем параметр G=b0
Оптимизируем G.
Удобно, если G=1/8.
Найдем такие параметры фильтра:
- Santik
- Сообщения: 609
- Зарегистрирован: 28 дек 2010, 08:04
- Откуда: Мирный (Якутия)
- Контактная информация:
Re: "Оптимальные" коэффициенты БИХ фильтра
Теперь рассмотрим ФВЧ :
ФНЧ 0.5 1 дБ ФВЧ 0.5 1 дБ
G=7.295008813812E-02
Коэффициенты b: Коэффициенты b:
7.295008813812E-02 1 7.295008813812E-02 1
3.647504406906E-01 5 -3.647504406906E-01 -5
7.295008813812E-01 10 7.295008813812E-01 10
7.295008813812E-01 10 -7.295008813812E-01 -10
3.647504406906E-01 5 3.647504406906E-01 5
7.295008813812E-02 1 -7.295008813812E-02 -1
Коэффициенты a: Коэффициенты a:
1.000000000000E+00 1.000000000000E+00
4.221861570594E-01 -4.221861570594E-01
6.957970951991E-01 6.957970951991E-01
1.471443658482E-01 -1.471443658482E-01
6.533141429455E-02 6.533141429455E-02
3.943788018486E-03 -3.943788018486E+00
Можно заметить, что у ФВЧ меняется только знак нечётных коэффициентов.
Таким образом ФНЧ с частотой Fs/FN всегда имеют свой ФВЧ "аналог" с частотой 1-Fs/FN различающийся лишь знаком нечётных коэффициентов an и bn.
С этой точки зрения интересно рассмотреть полосовые фильтры, имеющие частоты "симметричные" относительно 0.5.
ФНЧ 0.5 1 дБ ФВЧ 0.5 1 дБ
G=7.295008813812E-02
Коэффициенты b: Коэффициенты b:
7.295008813812E-02 1 7.295008813812E-02 1
3.647504406906E-01 5 -3.647504406906E-01 -5
7.295008813812E-01 10 7.295008813812E-01 10
7.295008813812E-01 10 -7.295008813812E-01 -10
3.647504406906E-01 5 3.647504406906E-01 5
7.295008813812E-02 1 -7.295008813812E-02 -1
Коэффициенты a: Коэффициенты a:
1.000000000000E+00 1.000000000000E+00
4.221861570594E-01 -4.221861570594E-01
6.957970951991E-01 6.957970951991E-01
1.471443658482E-01 -1.471443658482E-01
6.533141429455E-02 6.533141429455E-02
3.943788018486E-03 -3.943788018486E+00
Можно заметить, что у ФВЧ меняется только знак нечётных коэффициентов.
Таким образом ФНЧ с частотой Fs/FN всегда имеют свой ФВЧ "аналог" с частотой 1-Fs/FN различающийся лишь знаком нечётных коэффициентов an и bn.
С этой точки зрения интересно рассмотреть полосовые фильтры, имеющие частоты "симметричные" относительно 0.5.