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

Как пересчитать IIR N порядка в Biquad

Всем привет!

Вот собственно вопрос достаточно прост.

Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов.

Есть стандартное решение подобной задачи?

 

Спасибо.

 

 

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


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

Всем привет!

Вот собственно вопрос достаточно прост.

Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов.

Есть стандартное решение подобной задачи?

 

Спасибо.

 

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

 

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

tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами.

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


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

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

 

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

tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами.

 

 

Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет?

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


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

Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет?

 

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

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


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

Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :)

 

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


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

Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :)

 

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

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


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

Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :)

 

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

 

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

 

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

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


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

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

 

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

 

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

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

 

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

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

 

В общем проблему я решил вот как.

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

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

 

 

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

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

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


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

Russky:

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

 

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

 

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

 

Квантование актуально вне зависимости от наличия/отсутствия пт.

Не стоит заблуждаться.

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


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

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

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

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

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

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

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

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

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

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