Czy są jakieś standardowe formularze implementacji przestrajalnych filtrów Butterworth?

17

Jednym ze standardowych sposobów implementacji filtra Butterwortha jest kaskada odcinków drugiego rzędu, z których każdy odpowiada parze złożonych sprzężonych biegunów. Na przykład dla filtra czwartego rzędu byłyby dwie sekcje drugiego rzędu. Jeśli weźmiemy pod uwagę, w jaki sposób lokalizacje biegunów filtra dolnoprzepustowego zmieniają się w płaszczyźnie Z, gdy punkt odcięcia jest zaprojektowany dla bliskiego 0 Hz do Nyquista, ścieżka „zmieciona” przez każdą parę biegunów odpowiada parze łuków wewnątrz okręgu jednostki , jak pokazano na poniższym rysunku [dla filtrów czwartego rzędu]:

Pozycje biegunowe w płaszczyźnie Z dla filtrów dolnoprzepustowych Butterworth czwartego rzędu

Biorąc pod uwagę, jak długo istniały te filtry, oraz biorąc pod uwagę fakt, że te „łuki” odpowiadają prostym liniom w płaszczyźnie s, oczywiste jest, że ktoś opracowałby formularz implementacji z jednym parametrem, który może zamiatać bieguny wzdłuż łuków w „czasie wykonywania” [w przeciwieństwie do „czasu projektowania”]. Jednak jeszcze czegoś takiego nie spotkałem.

Jest stosunkowo łatwo wymyślić różne sposoby na zrobienie tego, szczególnie w segmentach zakresu, i chęć rzucić na to trochę dodatkowych obliczeń. Zastanawiam się, co następuje:

Czy istnieje jakiś standardowy sposób implementacji przestrajalnego [cyfrowego] filtra Butterwortha danego zamówienia, który 1) ma optymalne właściwości (np. Wydajność, wytrzymałość), a 2) obejmuje cały zakres?

Czy to naprawdę tak łatwy problem, że nikt nie chce o tym rozmawiać? W takim przypadku wygląda na to, że pojawiłby się w programach do projektowania filtrów obok opcji dla projektów „statycznych”.

Znalazłem to: wielofunkcyjny filtr Butterwortha o zmiennej częstotliwości odcięcia , ale na początku Googling nie wydaje się być dużo informacji o tym, co w niej jest.

Aktualizacja (re: odpowiedzi)

Żeby było trochę bardziej jasne:

  • Szukam „meta-projektu” z parametrem (powiedzmy z [0,1]), który automatycznie dostosuje odcięcie z DC do Nyquista (zachowując znormalizowane wzmocnienie) do zastosowania w systemie zmieniającym się w czasie. Coś w rodzaju tego dwubiegunowego rezonatora , z wyjątkiem ograniczeń Butterwortha. Chodzi o to, że obliczenie parametru byłoby bardziej wydajne niż przejście przez typową procedurę projektowania offline w czasie wykonywania.
  • Niekoniecznie szukam nawet sposobu zaprojektowania „metafiltru” (tzn. Wykonania obliczeń matematycznych ze zmiennymi zamiast liczb). Zastanawiam się, czy istnieją opcje dla standardowych [nieoczywistych] form implementacji - ponieważ, powiedzmy, proste podejście, które odpowiada przypadkowi statycznemu, powoduje problemy numeryczne w przypadku zmieniającym się w czasie.
  • Może nie ma problemów, a w praktyce stosuje się proste podejście. Byłoby świetnie. Obawiam się, że nie widziałem wyraźnie wspomnianego tematu w żadnym ze źródeł, z którymi się konsultowałem, ale może po prostu przegapiłem coś naprawdę oczywistego, więc pytam.
  • W trakcie dodawania tutaj więcej szczegółów natknąłem się na ogólne podejście do parametrycznych struktur biquad, które jest prawie tym, czego szukam (i ma kilka ciekawych referencji).

Aktualizacja 2

Szukam odpowiedzi takich jak ta, którą zamieściłem w moim drugim komentarzu do Jasona R. w następujący sposób:

„Och tak, chcesz użyć parametryzacji III-2b z pracy typu„ tak a tak ”, w formie sieci z podsłuchem, ponieważ rozwiązuje ona taki i taki przypadek krawędzi przy użyciu minimalnej liczby mnożników.”

Może nic takiego nie istnieje, ale moje pytanie brzmi, czy tak jest, a jeśli tak, to co to jest lub gdzie mogę je znaleźć?

Pula

W oparciu o odniesienie do „formy kanonicznej obserwatora” podane przez Tima Wescott w wątku comp.dsp w odpowiedzi Jasona R , postanowiłem założyć, że być może będę musiał zacząć przekopywać się w literaturze dotyczącej systemów sterowania, więc spróbowałem poszukać „przestrzeń kosmiczna” Butterwortha , i okazało się, że to bardzo fajne podejście do projektowania / wdrażania, nie tylko parametrycznych filtrów Butterwortha, ale także filtrów Czebyszewa i Eliptycznych:

Sophocles J. Orfanidis, „High-Order Digital Parametric Equalizer Design”, J. Audio Eng. Soc., Vol. 53, s. 1026–1046, listopad 2005 r.

Zajmie mi to trochę czasu, ale w oparciu o to, co przeczytałem do tej pory, byłbym bardzo zaskoczony, gdyby nie to, czego szukam. Daję to Jasonowi R w celu uzyskania odniesienia do pliku comp.dsp, który doprowadził mnie do artykułu Orfanidis. Jego odpowiedź to także miły praktyczny przegląd projektowania filtrów Butterworth.

Datageist
źródło

Odpowiedzi:

10

Nie jestem pewien, czego dokładnie szukasz. Jak zauważyłeś w swoim pytaniu, funkcje przenoszenia rodziny filtrów Butterworth są dobrze zrozumiałe i łatwe do obliczenia analitycznego. Zaimplementowanie struktury filtra Butterwortha, którą można dostrajać według kolejności filtrów i częstotliwości odcięcia, jest bardzo proste:

  1. Na podstawie wybranej kolejności filtrów, częstotliwości odcięcia i częstotliwości próbkowania oblicz położenie biegunów dla prototypowego filtra analogowego Butterworth. Ponieważ filtry Butterwortha nie mają zer, funkcja przenoszenia zależy od położenia biegunów (i wzmocnienia DC).

  2. Za pomocą transformacji dwuliniowej zamapuj lokalizacje biegunów prototypu analogowego na odpowiadających im lokalizacjach w cyfrowej realizacji filtra.

  3. Ponownie, filtr cyfrowy jest definiowany przez lokalizacje biegunów znalezione w kroku 2. Podziel filtr na sekcje drugiego rzędu , grupując bieguny w pary.

Otóż ​​to. Jak powiedziałem, programowanie filtra Butterwortha przy użyciu dowolnych parametrów może być proste; żadna z operacji nie jest strasznie skomplikowana do wdrożenia.

Edycja: Nie jestem pewien, jakiego efektu końcowego szukasz. Myślę, że najbardziej interesuje Cię, jak zaimplementować filtry IIR ze zmiennymi w czasie współczynnikami, niekoniecznie specyficznymi dla filtra Butterwortha. Zakładam, że Twoim celem jest zminimalizowanie artefaktów podczas zmiany częstotliwości odcięcia filtra; zostało to omówione w dyskusji na grupie dyskusyjnej comp.dsp na początku tego roku. Chociaż nie jestem pewien, jaki jest Twój przypadek użycia lub wymagania dla tej struktury filtrów, istnieje wiele sposobów na przełączenie.

Wiem, że powiedziałeś, że chciałbyś, aby twój filtr miał jeden parametr, który określa częstotliwość odcięcia, ale faktem jest, że twoja przestrajalna struktura musi mieć sposób na przełożenie częstotliwości odcięcia na wymagane współczynniki (lub w przypadku Butterwortha tylko lokalizacje biegunów). Opisany powyżej proces jest odpowiedni do generowania lokalizacji biegunów w oparciu o pożądaną znormalizowaną częstotliwość próbkowania.

Możesz potencjalnie uprościć proces obliczania położenia biegunów, analizując geometrię położenia biegunów filtra cyfrowego w płaszczyźnie Z. Analogowy filtr Butterwortha ma bieguny, które leżą w półkole w lewej połowie płaszczyzny s; transformacja dwuliniowa odwzorowuje ten półkole w eliptyczny wzór, który zilustrowałeś w opisie pytania. Używając tego znanego wzoru do biegunów analogowego filtra Butterwortha, funkcji mapowania transformacji dwuliniowej i pewnej algebry, możesz być w stanie uzyskać stosunkowo proste wyrażenie dla lokalizacji biegunów filtra cyfrowego, co daje bardziej przejrzysty filtr działanie tuningowe.

Jason R.
źródło
Jason, nie szukam sposobu zaprojektowania danej specyfikacji Butterwortha, szukam „meta-projektu”. Zaktualizuję pytanie nieco bardziej szczegółowo.
Datageist
1
Odp: Edycja. Proces opisany w ostatnim akapicie jest dokładnie taki, jak do tego podejdę - po prostu zastanawiam się, czy to gdziekolwiek zostało omówione. Innymi słowy, rzeczy takie jak: „O tak, chcesz użyć parametryzacji III-2b z pracy typu„ tak a tak ”, w formie siatki z podsłuchem, ponieważ rozwiązuje ona taki i taki przypadek krawędzi przy użyciu minimalnej liczby mnożników. „
Datageist
1
Mały wybredny komentarz: W płaszczyźnie Z filtr BW rzeczywiście ma zera. W przypadku filtrów dolnoprzepustowych wszystkie mają wartość -1, aw przypadku filtrów górnoprzepustowych - +1.
Hilmar
s±ss0
2

Tak, istnieją standardowe formularze implementacyjne dla Butterworth i prawie każda inna odpowiedź filtra. Wszystkie są w pełni zaimplementowane w mojej bibliotece filtrów IIR typu open source. Oto fragment kodu, który wytwarza pary biegun / zero dla filtra Butterwortha o dowolnym stopniu:

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());
  }
}

Jak widać, położenie biegunów oblicza się, dzieląc płaszczyznę s na „pary” równych segmentów.

Zapewniono odpowiedni kod dla wszystkich popularnych typów odpowiedzi filtrów: Czebyszew, Elliptic, Legendre, w tym wersje półkowe każdego z nich.

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

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

Zrzut ekranu

Vinnie Falco
źródło
Biblioteka DSPFilters bezpośrednio zajmuje się przypadkiem użycia rozważanym w pierwotnym pytaniu, wykorzystując sparametryzowane równanie do obliczenia par biegun / zero filtra cyfrowego w czasie wykonywania. Zmienię odpowiedź, dodając także fragment kodu źródłowego.
Vinnie Falco