Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как пересчитать IIR N порядка в Biquad
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Russky
Всем привет!
Вот собственно вопрос достаточно прост.
Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов.
Есть стандартное решение подобной задачи?

Спасибо.

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

Спасибо.


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

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

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



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


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


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


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

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

Вощем, я бы подумал перед тем как делать такое автоматически. Легко можно получить переполнение внутри секций или нестабильный фильтр из-за погрешностей вычислений.
Russky
Цитата(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
thermit
Цитата
Russky:
В общем коэффициенты теперь считаются не пересчетом, а напрямую из нулей и полюсов. Так и живем


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

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


Квантование актуально вне зависимости от наличия/отсутствия пт.
Не стоит заблуждаться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.