Russky 0 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба Всем привет! Вот собственно вопрос достаточно прост. Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов. Есть стандартное решение подобной задачи? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 9 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба Всем привет! Вот собственно вопрос достаточно прост. Надо пересчитать коэффициенты для IIR фильтра N порядка в коэффициенты последовательности биквадов. Есть стандартное решение подобной задачи? Спасибо. Есть. Найти корни числителя и знаменателя передаточной функциию сгруппировать их в комплексно сопряженные пары, выбрать нужные пары нулей и полюсов для секций. Если нужно просто посчитать, то можно использовать tf2sos из матлаб или октав. Если нужен алгоритм, то курить документацию к tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба Есть. Найти корни числителя и знаменателя передаточной функциию сгруппировать их в комплексно сопряженные пары, выбрать нужные пары нулей и полюсов для секций. Если нужно просто посчитать, то можно использовать tf2sos из матлаб или октав. Если нужен алгоритм, то курить документацию к tf2sos, tf2zp, zp2sos из матлаба. Там есть ссылки на статьии книги с алгоритмами. Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 9 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба Спасибо. А уже готовой реализации в виде библиотеки на С или С++ нигде нет? Не встречал. Для нахождения корней может быть использована любая библиотека линейной алгебры, умеющая считать собственные числа матрицы. Остальное можно подсмотреть в матлабе или октаве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 18 ноября, 2014 Опубликовано 18 ноября, 2014 · Жалоба Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 18 ноября, 2014 Опубликовано 18 ноября, 2014 · Жалоба Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :) на биквадратные звенья разбивают из-за того, что квантование к-тов таких звеньев менее фатально, нежели квантование к-тов передаточной функции всего фильтра. да и шумы меньше при конечной разрядности внутренних переменных. так что разбивайте на бикважратные блоки. это прально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andyp 9 20 ноября, 2014 Опубликовано 20 ноября, 2014 · Жалоба Похоже, что написать фильтр N порядка будет проще чем реализовать разбиение на биквады. :) Ну смотрите сами - нахождение обственных чисел (это единственное, что там сложно) по сложности пропорционально N^3, памяти потребуется N^2. N - длина полинома числителя или знаменателя. Потом группируем нули и полюса в комплексно сопряженные пары - это сортировка по реальной части и поиск близких реальных и мнимых частей. Потом нужно будет проверить, все ли нули и полюса находятся внутри единичного круга (это скорее всего так, так как в результате синтеза получен стабильный, минимально-фазовый фильтр). Потом группируем нули и полюса в пары. Начинаем с полюса, наиболее близкого к единичной окружности - выбираем для него самый близкий ноль, чтобы минимизировать коэффициент передачи секции. Дальше - следующий полюс и ноль и т.п. Все это, разумеется, сложнее реализовать, чем просто фильтрацию. Если фильтр целочисленный, то потребуется проверить общий коэфициент передачи на переполнение, а также проверить коэффициент передачи в отвод внутренней линии задержки и выбрать общий коэффициент передачи секции, чтобы избежать переполнения. Вощем, я бы подумал перед тем как делать такое автоматически. Легко можно получить переполнение внутри секций или нестабильный фильтр из-за погрешностей вычислений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 10 декабря, 2014 Опубликовано 10 декабря, 2014 · Жалоба Ну смотрите сами - нахождение обственных чисел (это единственное, что там сложно) по сложности пропорционально N^3, памяти потребуется N^2. N - длина полинома числителя или знаменателя. Потом группируем нули и полюса в комплексно сопряженные пары - это сортировка по реальной части и поиск близких реальных и мнимых частей. Потом нужно будет проверить, все ли нули и полюса находятся внутри единичного круга (это скорее всего так, так как в результате синтеза получен стабильный, минимально-фазовый фильтр). Потом группируем нули и полюса в пары. Начинаем с полюса, наиболее близкого к единичной окружности - выбираем для него самый близкий ноль, чтобы минимизировать коэффициент передачи секции. Дальше - следующий полюс и ноль и т.п. Все это, разумеется, сложнее реализовать, чем просто фильтрацию. Если фильтр целочисленный, то потребуется проверить общий коэфициент передачи на переполнение, а также проверить коэффициент передачи в отвод внутренней линии задержки и выбрать общий коэффициент передачи секции, чтобы избежать переполнения. Вощем, я бы подумал перед тем как делать такое автоматически. Легко можно получить переполнение внутри секций или нестабильный фильтр из-за погрешностей вычислений. Спасибо за совет. Просто пересчет фильтра N порядка в биквады сходу не получился. Слишком нестабильный результат. Даже на плавучке. Но пробема решилась подругому. Реализовать фильтр N порядка, даже на плавучке C6748 неполучилось из-за архетектурных особенностей C674x. Задержка в 4 такта между операцией и результатом в рекурсивном фильтре оказалась решающей. :) В общем проблему я решил вот как. Оказалось что исходники расчета коэффициэнтов фильтра Баттерворта найти было очень просто. И соответственно когда есть нули и полюса изначального полинома, перегруппировать их оказалось очень просто. :) В общем коэффициенты теперь считаются не пересчетом, а напрямую из нулей и полюсов. Так и живем. :) на биквадратные звенья разбивают из-за того, что квантование к-тов таких звеньев менее фатально, нежели квантование к-тов передаточной функции всего фильтра. да и шумы меньше при конечной разрядности внутренних переменных. так что разбивайте на бикважратные блоки. это прально. Вы все сказали верно, но у меня плавучка. Так что квантование не актуально (почти). :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 10 декабря, 2014 Опубликовано 10 декабря, 2014 · Жалоба Russky: В общем коэффициенты теперь считаются не пересчетом, а напрямую из нулей и полюсов. Так и живем Так все живут. Вы все сказали верно, но у меня плавучка. Так что квантование не актуально Квантование актуально вне зависимости от наличия/отсутствия пт. Не стоит заблуждаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться