Перейти к содержанию
    

Разбивка фильтра на биквадратные каскады

Здравствуйте! Стоит задача разбить цифровой фильтр 4-го порядка (верно?) на каскад биквадратных звеньев. Нули и полюсы рассчитал при помощи программы ELLF.EXE. Полюсы и нули такие:

 

        Полюсы            Нули
    Re        Im        Re        Im
1    -0.76593    0.62206    -0.18492    0.98275
2    -0.86692    0.47769    -0.97603    0.21763
3    -0.78424    0.56677    -0.61162    0.79115
4    -0.82839    0.50674    -0.93307    0.35970

Вот так они лежат на z-плоскости:

 

image.png

 

Хочу разбить на биквадртаные звенья для использования с библиотекой CMSIS DSP. У меня уже успешно работает каскад из двух биквадратных фильтров CMSIS (рассчитал коэффициенты численным методом). Но тем же способом рассчитать с нуля более сложный фильтр не выходит. Слишком много локальных минимумов и экстремумов у оценки результата. Поэтому хочу попробовать классическими методами. К сожалению, в своё время не освоил ЦОС в должном объёме. Прошу помощи.

Выше нули и полюсы полосового фильтра, удовлетворяющего мои требования. Нужно разбить фильтр на биквадратные каскады. Как я понимаю задачу, у меня фильтр четвёртого порядка. Но его нули и полюсы - не комплексно-сопряжённые. А биквадратное звено - второго порядка, но с комплексно-сопряжёнными нулями и полюсами. Или я не верно понимаю? Если верно, значит, для фильтра четвёртого порядка понадобиться больше двух звеньев второго порядка. Это не страшно, ресурсы позволяют задействовать до восьми биквадратных звеньев (лучше до 6). Но как их разбивать? Выписывать на бумагу нули и полюсы и раскрывать их произведения? Какие есть приёмы?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

        Полюсы            Нули
    Re        Im        Re        Im
1    -0.76593    0.62206    -0.18492    0.98275
2    -0.86692    0.47769    -0.97603    0.21763
3    -0.78424    0.56677    -0.61162    0.79115
4    -0.82839    0.50674    -0.93307    0.35970

 

 

Хочу разбить на биквадртаные звенья для использования с библиотекой CMSIS DSP.

Спасибо.

 

 

Ваши нули и полюса не образуют комплексно сопряженных пар. Это требуется для того, чтобы числитель и знаменатель передаточной функции имели действительные коэффициенты. Если это устраивает, то группируйте нули и полюса в пары и считайте многочлены числителя и знаменателя как (z - pole1)*(z - pole2). Только коэффициенты биквадов получатся комплексными.

 

А так, лучше чем-то типа octave или matlab воспользоваться для синтеза фильтра. Там же есть функция tf2sos для нужного Вам преобразования. Ну и можно вот эту тему посмотреть

https://electronix.ru/forum/index.php?showt...=124301&hl=

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваши нули и полюса не образуют комплексно сопряженных пар. Это требуется для того, чтобы числитель и знаменатель передаточной функции имели действительные коэффициенты. Если это устраивает, то группируйте нули и полюса в пары и считайте многочлены числителя и знаменателя как (z - pole1)*(z - pole2). Только коэффициенты биквадов получатся комплексными.

 

Нет. Библиотечные фильтры SIMD работают только с вещественными коэффициентами. Есть способ, пусть ценой увеличения количества каскадов, добавить комплексно-сопряжённые множители?

 

А так, лучше чем-то типа octave или matlab воспользоваться для синтеза фильтра. Там же есть функция tf2sos для нужного Вам преобразования. Ну и можно вот эту тему посмотреть

https://electronix.ru/forum/index.php?showt...=124301&hl=

 

Спасибо. Посмотрел тему. Свелось к рекомендации использовать готовые функции Mathlab. Мне нужна лицензионная чистота для коммерческого применения. Покупать Mathlab не планирую. Попробую поискать в GNU Octave. До сих пор использовал CRAN R, но в R не нашёл таких функций, к сожалению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Библиотечные фильтры SIMD работают только с вещественными коэффициентами. Есть способ, пусть ценой увеличения количества каскадов, добавить комплексно-сопряжённые множители?

 

Нет.

 

PS Если у Вас стандартный ФНЧ, ФВЧ или полосовик, предназначенный для фильтрации действительного сигнала, то с результатами синтеза фильтра что-то не так.

 

Спасибо. Посмотрел тему. Свелось к рекомендации использовать готовые функции Mathlab. Мне нужна лицензионная чистота для коммерческого применения. Покупать Mathlab не планирую. Попробую поискать в GNU Octave. До сих пор использовал CRAN R, но в R не нашёл таких функций, к сожалению.

 

В октаве нужное есть в пакете signal. Код доступен. В матлабе реализацию этих функций тоже можно посмотреть.

Изменено пользователем andyp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку пакета. Попробую, отпишусь.

Жаль, сервер с пакетами Октав сейчас "лежит" на обслуживании: "Sourceforge project sites are currently under maintenance. Please check back later. We thank you for your patience".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жаль, сервер с пакетами Октав сейчас "лежит" на обслуживании: "Sourceforge project sites are currently under maintenance. Please check back later. We thank you for your patience".

 

https://www.gnu.org/software/octave/#install

 

или

 

https://ftp.gnu.org/gnu/octave/windows/

 

см. 4.2.1

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том, что сам сервер пакетов лежит. Что из консоли Октавы "error: get_forge_pkg: could not read URL, please verify internet connection", что по кнопке "Browse Packages": "Sourceforge project sites are currently under maintenance. Please check back later. We thank you for your patience."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дело в том, что сам сервер пакетов лежит. Что из консоли Октавы "error: get_forge_pkg: could not read URL, please verify internet connection", что по кнопке "Browse Packages": "Sourceforge project sites are currently under maintenance. Please check back later. We thank you for your patience."

 

 

дистр для windows вроде включает нужные пакеты по умолчанию

pkg list

должен показать что уже стоит

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, signal в дистрибутив для Windows действительно включён:

signal | 1.3.2 | C:\Octave\OCTAVE~1.1\share\octave\packages\signal-1.3.2

 

Пробую, но пока ничего не выходит с Октавой. Пробую преобразование полосового фильтра:

>> help lp2bp
error: help: the 'lp2bp' function belongs to the signal package from Octave Forge but
has not yet been implemented.

Жаль...

tf2sos есть в наличии. Разбираюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Беру полосовой фильтр 4-го порядка, такой:

z plane Denominator      Numerator
0  1.000000000E+000  4.897393680E-002
1  3.156595753E+000  1.382087237E-001
2  4.297982543E+000  1.831212979E-001
3  2.864855754E+000  1.382087237E-001
4  8.248016793E-001  4.897393680E-002

В Octave:

tf2sos([4.897393680E-002, 1.382087237E-001, 1.831212979E-001, 1.382087237E-001, 4.897393680E-002], [1.000000000E+000, 3.156595753E+000, 
4.297982543E+000, 2.864855754E+000, 8.248016793E-001])
ans =
   0.048974   0.093684   0.048974   1.000000   1.675990   0.919131
   1.000000   0.909161   1.000000   1.000000   1.480605   0.897371

Так и должно быть? Коэффициенты - эллиптического фильтра из ELLF.EXE (Copyright 2014 by Stephen L. Moshier, http://www.moshier.net/ellf.zip). На входе tf2sos 10 коэффициентов, 9 не считая a0. А на выходе 12 коэффициентов, из них значащих всего 8. Немного странно. Или это свойство эллиптического фильтра?

Вот Баттерворт с той же полосой:

z plane Denominator      Numerator
0  1.000000000E+000  7.242292251E-003
1  3.118290694E+000  0.000000000E+000
2  4.185016757E+000 -1.448458450E-002
3  2.742317079E+000  0.000000000E+000
4  7.742169529E-001  7.242292251E-003

Octave:

tf2sos([7.242292251E-003, 0.000000000E+000, -1.448458450E-002, 0.000000000E+000, 7.242292251E-003], [1.000000000E+000, 3.118290694E+000, 4.185016757E+000, 2.742317079E+000, 7.742169529E-001])
ans =
   0.0072423   0.0144846   0.0072423   1.0000000   1.6355921   0.8908491
   1.0000000  -2.0000000   1.0000000   1.0000000   1.4826986   0.8690775

Нужно проверять работу таких каскадов. Отпишусь по результатам.

 

Удивительно, но это работает!

Вставил результат tf2sos, всего два каскада, после пересчёта в 16-бит целые в цепочку фильтров модели системы. Работает!

 

image.png

 

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

andyp, спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...