реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как пересчитать IIR N порядка в Biquad, Как пересчетать IIR N порядка в коэфф. последовательности биквадов.
Russky
сообщение Nov 17 2014, 11:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Всем привет!
Вот собственно вопрос достаточно прост.
Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов.
Есть стандартное решение подобной задачи?

Спасибо.

Go to the top of the page
 
+Quote Post
andyp
сообщение Nov 17 2014, 11:18
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(Russky @ Nov 17 2014, 14:08) *
Всем привет!
Вот собственно вопрос достаточно прост.
Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов.
Есть стандартное решение подобной задачи?

Спасибо.


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

Если нужно просто посчитать, то можно использовать tf2sos из матлаб или октав. Если нужен алгоритм, то курить документацию к
tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами.
Go to the top of the page
 
+Quote Post
Russky
сообщение Nov 17 2014, 12:02
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Цитата(andyp @ Nov 17 2014, 15:18) *
Есть. Найти корни числителя и знаменателя передаточной функциию сгруппировать их в комплексно сопряженные пары, выбрать нужные пары нулей и полюсов для секций.

Если нужно просто посчитать, то можно использовать tf2sos из матлаб или октав. Если нужен алгоритм, то курить документацию к
tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами.



Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет?
Go to the top of the page
 
+Quote Post
andyp
сообщение Nov 17 2014, 12:52
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(Russky @ Nov 17 2014, 15:02) *
Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет?


Не встречал. Для нахождения корней может быть использована любая библиотека линейной алгебры, умеющая считать собственные числа матрицы. Остальное можно подсмотреть в матлабе или октаве.
Go to the top of the page
 
+Quote Post
Russky
сообщение Nov 18 2014, 11:57
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. sm.gif
Go to the top of the page
 
+Quote Post
thermit
сообщение Nov 18 2014, 17:35
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(Russky @ Nov 18 2014, 14:57) *
Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. sm.gif


на биквадратные звенья разбивают из-за того, что квантование к-тов таких звеньев менее фатально, нежели квантование к-тов передаточной функции всего фильтра. да и шумы меньше при конечной разрядности внутренних переменных. так что разбивайте на бикважратные блоки. это прально.
Go to the top of the page
 
+Quote Post
andyp
сообщение Nov 20 2014, 11:24
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(Russky @ Nov 18 2014, 14:57) *
Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. sm.gif


Ну смотрите сами - нахождение обственных чисел (это единственное, что там сложно) по сложности пропорционально N^3, памяти потребуется N^2. N - длина полинома числителя или знаменателя. Потом группируем нули и полюса в комплексно сопряженные пары - это сортировка по реальной части и поиск близких реальных и мнимых частей. Потом нужно будет проверить, все ли нули и полюса находятся внутри единичного круга (это скорее всего так, так как в результате синтеза получен стабильный, минимально-фазовый фильтр). Потом группируем нули и полюса в пары. Начинаем с полюса, наиболее близкого к единичной окружности - выбираем для него самый близкий ноль, чтобы минимизировать коэффициент передачи секции. Дальше - следующий полюс и ноль и т.п.

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

Вощем, я бы подумал перед тем как делать такое автоматически. Легко можно получить переполнение внутри секций или нестабильный фильтр из-за погрешностей вычислений.
Go to the top of the page
 
+Quote Post
Russky
сообщение Dec 10 2014, 14:45
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Цитата(andyp @ Nov 20 2014, 15:24) *
Ну смотрите сами - нахождение обственных чисел (это единственное, что там сложно) по сложности пропорционально N^3, памяти потребуется N^2. N - длина полинома числителя или знаменателя. Потом группируем нули и полюса в комплексно сопряженные пары - это сортировка по реальной части и поиск близких реальных и мнимых частей. Потом нужно будет проверить, все ли нули и полюса находятся внутри единичного круга (это скорее всего так, так как в результате синтеза получен стабильный, минимально-фазовый фильтр). Потом группируем нули и полюса в пары. Начинаем с полюса, наиболее близкого к единичной окружности - выбираем для него самый близкий ноль, чтобы минимизировать коэффициент передачи секции. Дальше - следующий полюс и ноль и т.п.

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

Вощем, я бы подумал перед тем как делать такое автоматически. Легко можно получить переполнение внутри секций или нестабильный фильтр из-за погрешностей вычислений.

Спасибо за совет.

Просто пересчет фильтра N порядка в биквады сходу не получился. Слишком нестабильный результат. Даже на плавучке. Но пробема решилась подругому.
Реализовать фильтр N порядка, даже на плавучке C6748 неполучилось из-за архетектурных особенностей C674x. Задержка в 4 такта между операцией и результатом в рекурсивном фильтре оказалась решающей. sm.gif

В общем проблему я решил вот как.
Оказалось что исходники расчета коэффициэнтов фильтра Баттерворта найти было очень просто. И соответственно когда есть нули и полюса изначального полинома, перегруппировать их оказалось очень просто. sm.gif
В общем коэффициенты теперь считаются не пересчетом, а напрямую из нулей и полюсов. Так и живем. sm.gif


Цитата(thermit @ Nov 18 2014, 21:35) *
на биквадратные звенья разбивают из-за того, что квантование к-тов таких звеньев менее фатально, нежели квантование к-тов передаточной функции всего фильтра. да и шумы меньше при конечной разрядности внутренних переменных. так что разбивайте на бикважратные блоки. это прально.

Вы все сказали верно, но у меня плавучка. Так что квантование не актуально (почти). sm.gif
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 10 2014, 16:16
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата
Russky:
В общем коэффициенты теперь считаются не пересчетом, а напрямую из нулей и полюсов. Так и живем


Так все живут.

Цитата
Вы все сказали верно, но у меня плавучка. Так что квантование не актуально


Квантование актуально вне зависимости от наличия/отсутствия пт.
Не стоит заблуждаться.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 08:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016