Чи існують якісь стандартні форми реалізації фільтра Баттерворта?


17

Один із стандартних способів реалізації фільтра Баттерворта - це каскад секцій другого порядку, кожен з яких відповідає пари складних сполучених полюсів. Для фільтра четвертого порядку, наприклад, було б два розділи другого порядку. Якщо ми розглянемо, як місця розташування полюсів для фільтра низьких частот змінюються в площині z, коли відсічення розраховане на відстань приблизно від 0 Гц до Найквіста, шлях "промітання" кожної пари полюсів відповідає парі дуг всередині одиничного кола , як проілюстровано на наступному малюнку [для фільтрів четвертого порядку]:

Позиційні полюси Z-площини для фільтрів нижнього проходу Баттерворта четвертого порядку

З огляду на те, як довго існували ці фільтри, і враховуючи той факт, що ці "дуги" відповідають прямим лініям на площині s, не можна вважати, що хтось розробив форму реалізації з єдиним параметром, який здатний змітати полюси уздовж дуг на "час виконання" [на відміну від "часу проектування"]. Однак я ще не натрапив на щось подібне.

Досить просто придумати різні способи зробити це, особливо в сегментах діапазону, і з готовністю кинути на нього трохи додаткових обчислень. Мені цікаво:

Чи існує якийсь стандартний спосіб реалізації настроюваного [цифрового] ​​фільтра Баттерворта заданого порядку, який 1) має оптимальні властивості (наприклад, ефективність, надійність) та 2) охоплює весь діапазон?

Або це справді просто така проста проблема, що ніхто не заважає говорити про це? Якщо це так, то, схоже, це відображатиметься у програмах фільтрування поруч із параметрами для "статичних" конструкцій.

Я знайшов це: багатоцільовий фільтр Баттерворта зі змінною частотою обрізання , але спочатку в Google не здається багато інформації про те, що в ньому є.

Оновлення (re: відповіді)

Просто, щоб бути трохи більш зрозумілим:

  • Я шукаю "мета-дизайн" з параметром (скажімо, від [0,1]), який автоматично регулює відключення від DC до Nyquist (зберігаючи нормалізацію посилення) для використання в системі, що змінюється за часом. Щось подібне до цього двополюсного резонатора , за винятком обмежень Баттерворта. Ідея полягає в тому, що обчислення параметра було б більш ефективним, ніж проходження типової процедури проектування в режимі офлайн під час виконання.
  • Мені не обов’язково навіть шукати, як створити "мета-фільтр" (тобто робити математику зі змінними замість чисел), мені цікаво, чи є вибір для стандартних [неочевидних] форм реалізації - тому що, скажімо, прямолінійний підхід, який відповідає статичному випадку, у кінцевому підсумку має числові питання в залежності від часу.
  • Можливо, проблем немає, і прямий підхід - це те, що використовується на практиці. Було б чудово. Мене хвилює те, що я не бачив цієї теми прямо в жодному з джерел, з якими я консультувався, але, можливо, я просто пропустив щось дійсно очевидне, тому я запитую.
  • У процесі додавання більш детальної інформації тут я натрапив на загальну обробку параметричних біквадних структур, що майже є те, що я шукаю (і має кілька приємних посилань).

Оновлення 2

Я шукаю відповіді, як той, який я виклав у своєму другому коментарі до Джейсона Р, наступним чином:

"О так, ви хочете використовувати параметризацію III-2b з тези" так і так ", у формі ґратчастого решітки, оскільки вона вирішує такий і такий крайовий випадок, використовуючи мінімальну кількість множень."

Можливо, нічого подібного не існує, але моє запитання - чи це так, і якщо так, то що це, або де його знайти?

Джекпот

Спираючись на посилання на "канонічну форму спостерігача", яку дав Тім Вескотт у потоці comp.dsp у відповіді Джейсона Р , я вирішив припустити, що, можливо, мені доведеться почати копатися в літературі про системи управління, тому я спробував зробити пошук "державний простір" Масловорт , і виявилося наступне, дуже класне, лікування проектування / впровадження, не тільки параметричного Баттерворта, але і Чебишевського та Еліптичного фільтрів:

Софокл Дж. Орфанідіс, "Цифровий параметричний еквалайзерний дизайн високого порядку", J. Audio Eng. Соц., Вип. 53, стор 1026-1046, листопад 2005.

Це займе трохи часу, щоб розібратися, але виходячи з того, що я читав до цього часу, я був би дуже здивований, якщо це не те, що я шукаю. Я передаю це Джейсону Р для посилання на comp.dsp, яке привело мене до статті Orfanidis. Його відповідь - також хороший практичний огляд проектування фільтрів Баттерворта.

Відповіді:


10

Я не впевнений, що саме ви шукаєте. Як ви зазначали у своєму запитанні, функції передачі сімейства фільтрів Баттерворта добре зрозумілі і легко обчислюються аналітично. Досить просто реалізувати структуру фільтру Баттерворта, яку можна налаштувати за порядком фільтра та частотою відсічення:

  1. На основі обраного порядку фільтра, частоти зрізу та швидкості вибірки обчисліть місця полюсів для аналогового фільтра прототипу Баттерворта. Оскільки фільтри Баттерворта не мають нулів, функція передачі визначається місцями полюсів (і посиленням постійного струму).

  2. Використовуючи білінеарне перетворення , картографуйте місця полюсів аналогового прототипу у відповідних місцях у вашій цифровій реалізації фільтра.

  3. Знову ж таки, цифровий фільтр визначається місцями полюсів, знайденими на кроці 2. Розбийте фільтр на секції другого порядку , групуючи полюси по парах.

Це воно. Як я вже говорив, програмувати фільтр Баттерворта досить просто, використовуючи будь-які параметри, які вам можуть знадобитися; жодна з операцій не є надзвичайно складною для здійснення.

Редагувати: Я не дуже впевнений, який кінцевий результат ви шукаєте. Я думаю, що натомість вас найбільше цікавить, як реалізувати фільтри IIR з коефіцієнтами, що змінюються у часі, не обов'язково специфічні для фільтра Баттерворта. Я припускаю, що ваша мета - мінімізувати артефакти при зміні частоти обрізання фільтра; про це йшлося в дискусії про групу новин comp.dsp раніше цього року. Хоча я не впевнений, що стосується Вашого використання або вимог щодо цієї структури фільтру, існує кілька способів здійснити комутацію.

Я знаю, ви сказали, що хочете, щоб ваш фільтр мав єдиний параметр, який визначає частоту обрізання, але факт залишається фактом, що ваша настроювана структура повинна мати спосіб перевести частоту відсічення до необхідних коефіцієнтів (або у випадку Баттерворта, просто місця полюсів). Описаний вище процес підходить для генерації місця полюсів на основі бажаної нормованої швидкості вибірки.

Можна потенційно спростити процес обчислення місця розташування полюсів, проаналізувавши геометрію розташування полюсів цифрового фільтра в площині z. Аналоговий фільтр Баттерворта має полюси, які лежать півколом у лівій половині площини s; білінеарне перетворення відображає це півколо в еліптичний вигляд, який ви проілюстрували в описі запитання. Використовуючи цю відому схему для полюсів аналогового фільтра Баттерворта, функцію відображення білінеарного перетворення та деяку алгебру, ви можете придумати порівняно просте вираження для розташування полюсів цифрового фільтра, таким чином, ви отримаєте більш простий фільтр настройка дії.


Джейсон, я не шукаю, як розробити задану специфікацію Баттерворта, я шукаю "метадизайн". Я оновлю питання трохи детальніше.
datageist

1
Re: Редагувати. Процес, який ви описали в останньому абзаці, полягає саме в тому, як я би підходив до нього - мені просто цікаво, чи це десь було висвітлено. Іншими словами, такі речі, як "О так, ви хочете використовувати параметризацію III-2b з тези" так і так ", у формі решітки, що реєструється, оскільки вона вирішує такий і такий крайовий випадок, використовуючи при цьому мінімальну кількість множень. "
datageist

1
Невеликий прискіпливий коментар: У площині Z фільтр BW дійсно має нулі. Для фільтрів низьких частот вони рівні в -1, а для фільтрів високих частот - +1.
Гільмар

с±сс0

2

Так, є стандартні форми реалізації для Butterworth та майже всіх інших відповідей фільтрів. Всі вони повністю реалізовані в моїй бібліотеці фільтрів IIR з відкритим кодом. Ось фрагмент коду, який створює пари полюс / нуль для фільтра Баттерворта довільного ступеня:

void AnalogLowPass::design (int numPoles)
{
  if (m_numPoles != numPoles)
  {
    m_numPoles = numPoles;

    reset ();

    const double n2 = 2 * numPoles;
    const int pairs = numPoles / 2;
    for (int i = 0; i < pairs; ++i)
    {
      complex_t c = std::polar (1., doublePi_2 + (2 * i + 1) * doublePi / n2);
      addPoleZeroConjugatePairs (c, infinity());
    }

    if (numPoles & 1)
      add (-1, infinity());
  }
}

Як бачимо, положення полюсів обчислюється шляхом поділу s-площини на «пари» рівних відрізків.

Відповідний код надається для всіх поширених типів відповідей фільтрів: Чебишев, Еліптик, Легендр, включаючи версії для полиць кожного.

https://github.com/vinniefalco/DSPFiltersDemo.git

https://github.com/vinniefalco/DSPFilters.git

Знімок екрана


Бібліотека DSPFilters безпосередньо звертається до випадку використання, передбаченого оригінальним запитанням, використовуючи параметризоване рівняння для обчислення пар полюс / нуль цифрового фільтра під час виконання. Я зміню відповідь, щоб включити фрагмент вихідного коду.
Вінні Фалько
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.