X4L - wzmacniacz z DSP z serii X
Biznes „nagłośnieniowy” – w porównaniu z innymi dziedzinami techniki (np. przemysłem samochodowym, czy ...
Mamy już za sobą temat filtrów cyfrowych SOI (FIR), czyli filtrów o skończonej odpowiedzi impulsowej. Filtry te, dla przypomnienia, charakteryzują się m.in. stosunkowo prostą budową (algorytmem) i liniową fazą w zakresie częstotliwości przepuszczanych (w paśmie pracy).
Drugą grupę stanowią filtry o nieskończonej odpowiedzi impulsowej NOI, z angielska określane również skrótem IIR od angielskiej nazwy - Infinite Impulse Response. Filtry te są zasadniczo różne od filtrów SOI, ponieważ zawsze wymagają sprzężenia zwrotnego. O ile próbki sygnału wyjściowego filtru SOI zależą jedynie od przeszłych wartości sygnału wejściowego, to każda próbka wyjściowa filtru NOI zależy od poprzednich próbek sygnału wejściowego i poprzednich próbek sygnału wyjściowego. Stosowanie sprzężenia zwrotnego, czyli próbek wyjściowych podawanych z powrotem na wejście, jest zarówno korzystne, jak i niekorzystne.
Tak jak we wszystkich systemach ze sprzężeniem zwrotnym zmiany sygnału wejściowego filtru NOI mogą, w niektórych przypadkach, spowodować powstanie na wyjściu niestabilności i oscylacji o nieskończonym czasie trwania. Stąd też wzięła się nazwa "nieskończona odpowiedź impulsowa", czyli możliwość istnienia na wyjściu niezerowych próbek o nieskończonym czasie trwania w sytuacji, gdy na wejście filtru nie podawany jest żaden sygnał (lub próbki zerowe).
Jak się można więc domyślić już z tego opisu, struktura filtrów NOI nie będzie już taka prosta, jak filtrów SOI, a to oznacza, że są one trudniejsze do projektowania i analizy. Oprócz tego filtry NOI nie zapewniają, tak jak to było z filtrami SOI, liniowej fazy w zakresie przenoszenia.
Po cóż więc stosować i w ogóle zajmować się filtrami, które na pierwszy rzut oka mają same wady w stosunku do prostszych i łatwiejszych w projektowaniu filtrów SOI? Odpowiedź sama się nasunie, jeśli spojrzymy na rysunek 1. Filtry NOI są po prostu bardziej efektywne, niż filtry SOI, czyli wymagają mniejszej liczby mnożeń dla wyliczenia pojedynczej próbki sygnału wyjściowego, przy zapewnieniu wymaganej charakterystyki częstotliwościowej. Ze sprzętowego punktu widzenia oznacza to, że filtry NOI mogą być bardzo szybkie, a więc mogą działać w czasie rzeczywistym, operując przy znacznie wyższych częstotliwościach próbkowania, niż filtry SOI.
Właśnie na rysunku 1 porównano charakterystyki amplitudowe dolnoprzepustowego filtru NOI 4-go rzędu i również dolnoprzepustowego filtru SOI, tyle że 31-go rzędu, a więc o 31 ogniwach. Taki 31-ogniwowy filtr wymaga 19 operacji mnożenia dla wyznaczenia każdej próbki sygnału wyjściowego, podczas gdy filtr NOI 4-go rzędu tych mnożeń wymaga tylko 9.
A jak widać na rysunku 1 taki filtr NOI nie dość, że wymaga mniej, niż połowy mnożeń w stosunku do filtru SOI, to jeszcze ma mniejsze nierównomierności charakterystyki w paśmie przepustowym oraz większą stromość charakterystyki w paśmie przejściowym w porównaniu z filtrem o skończonej odpowiedzi impulsowej.
Zysk z powodu zmiany filtru z SOI na NOI wydaje się oczywisty, zwłaszcza że, jak pamiętamy z ubiegłego miesiąca, aby wymusić dużą stromość obszaru przejściowego musieliśmy projektować filtry SOI o bardzo długiej odpowiedzi impulsowej. Im dłuższa będzie odpowiedź, tym bardziej charakterystyka częstotliwościowa będzie zbliżać się do ideału.
W aspekcie sprzętowym maksymalna liczba ogniw filtru SOI, którą może mieć filtr, zależy od tego jak szybko nasz sprzęt będzie w stanie wykonać określoną liczbę mnożeń i sumowań, wymaganą do wyznaczenia pojedynczej próbki sygnału wyjściowego, zanim na wejściu pojawi się następna próbka wejściowa. Filtry NOI zaś mogą być projektowane tak, że długość odpowiedzi impulsowej może być większa, niż liczba ogniw filtru. Zatem filtry NOI mogą zapewnić znacznie lepszą filtrację przy określonej liczbie mnożeń dla jednej próbki sygnału wyjściowego, niż filtry SOI.
Czas najwyższy aby nieco bliżej przyjrzeć się filtrom NOI i choć pobieżnie omówić
ICH STRUKTURĘ
Jak już wiemy nazwa filtru NOI wynika stąd, że do obliczenia bieżącej próbki sygnału wyjściowego korzysta się z wartości przeszłych próbek sygnału wejściowego. Efekt jest taki, że pewien skończony ciąg niezerowych wartości wejściowych może spowodować pojawienie się na wyjściu filtru NOI ciągu próbek o nieskończonym czasie trwania.
Zatem, jeśli sygnał wejściowy filtru NOI stałby się nagle ciągiem samych wartości zerowych, to sygnał wyjściowy mógłby - w pewnych określonych warunkach - już na zawsze pozostać niezerowym. Ta szczególna właściwość filtru NOI wynika ze sposobu jego realizacji, tzn. sprzężenia zwrotnego obejmującego bloki opóźnienia, mnożniki i sumatory.
Strukturę filtru NOI możemy niejako "wyprowadzić" ze struktury filtru SOI. Z rysunku 2a przypomnijmy sobie jak taka struktura cztero-ogniwowego filtru SOI wygląda. Teraz, w celu określenia, w jaki sposób przeszłe próbki sygnału wyjściowego są obecne w strukturze filtru NOI, dokonamy przekształcenia struktury filtru z rysunku 2a do postaci przedstawionej na rysunku 2b - obie struktury są identyczne obliczeniowo.
Teraz, "dołączając" do struktury z rysunku 2b gałąź z pętlą sprzężenia zwrotnego, otrzymujemy filtr NOI (rysunek 3). Ponieważ filtry NOI mają dwa zestawy współczynników, stosujemy standardową notację b(k) dla współczynników operujących na przeszłych próbkach wejściowych i a(k) dla współczynników w pętli sprzężenia zwrotnego z rysunku 3. Równanie opisujące filtr NOI będzie miało postać:
y(n) = b(0)x(n) + b(1)x(n-1) + b(2)x(n-2) + b(3)x(n-3) + a(1)y(n-1) + a(2)y(n-2) + a(3)y(n-3)
Trochę się tego nam nazbierało, ale nie stresujmy się, ten wzór to tylko dla porównania, nikt nie musi go obowiązkowo znać na pamięć. A teraz jeszcze kilka zdań o
PROJEKTOWANIU FILTRÓW NOI
W ubiegłym miesiącu nie zagłębialiśmy się zbytnio w sam proces projektowania filtrów SOI, a więc i dziś czynić tego też nie będziemy. Zwłaszcza że projektowanie filtrów NOI nie jest już tak proste, jak to miało miejsce w przypadku filtrów SOI (przynajmniej w teorii).
Wtedy wystarczyło zdefiniować funkcję transmitancji (czyli de facto określić charakterystykę częstotliwościową filtru), obliczyć odwrotną transformatę Fouriera tej funkcji, wynik transformaty poddać przesunięciu, i uzyskiwaliśmy odpowiedź impulsową filtru w dziedzinie czasu.
W przypadku filtru SOI pożądane współczynniki filtru h(k) są dokładnie równe wartościom poszczególnych próbek odpowiedzi impulsowej. W przypadku filtrów NOI możemy postąpić tak samo (tzn. określić pożądaną funkcję transmitancji i obliczyć jej odwrotną transformatę Fouriera, aby uzyskać odpowiedź impulsową filtru), jednakże zła wiadomość jest taka, że nie ma bezpośredniej metody obliczenia współczynników a(k) i b(k) z odpowiedzi impulsowej. A więc stosunkowo proste techniki projektowania filtrów SOI nie mogą być zastosowane do projektowania filtrów NOI.
Nie ma to jednak wielkiego znaczenia, bo obecnie nikt nie projektuje filtrów cyfrowych z kartką i ołówkiem w ręku, wykonując mniej lub bardziej żmudne obliczenia. Obecnie wszystko to wykonuje komputer (za pomocą odpowiedniego oprogramowania), a nasze zadanie ogranicza się tylko do wpisania pożądanych parametrów, jakimi ma wykazywać się nasz filtr.
Na przykład przy obliczaniu filtru dolnoprzepustowego program wspomagający projektowanie może od nas zażądać podania wartości parametrów: ∂p, ∂s, f1 i f2, pokazanych na rysunku 4. Pewne programy wymagają też od użytkownika określenia rzędu filtru NOI. Programy takie obliczają współczynniki filtru, które pozwalają najlepiej aproksymować żądaną charakterystykę częstotliwościową.
Z drugiej strony niektóre programy nie wymagają od użytkowników podania rzędu filtru. Obliczają one filtr najniższego rzędu, aproksymujący żądaną charakterystykę częstotliwościową. Oczywiście, trzeba takim odpowiednim oprogramowaniem dysponować, ale, jak się okazuje, zarówno programy do projektowania filtrów SOI, jak i NOI są stosunkowo łatwo dostępne (dla tych, którzy wiedzą, gdzie ich szukać), a więc to czy chcemy zaprojektować filtr SOI, czy też NOI nie jest już tak wielkim problemem.
Jakie są więc
PROBLEMY
Z uwagi na to, że w filtrach NOI stosuje się sprzężenie zwrotne, przy implementacji zaprojektowanego filtru mogą występować problemy ze stabilnością (czyli wspomniane już występowanie niezerowych próbek na wyjściu filtru w sytuacji gdy na wejściu nie ma sygnału lub jest on zerowy - wszak projektujemy filtr, a nie generator, więc chcemy, aby na wyjściu również był sygnał zerowy, gdy na wejściu są same 0).
Innymi problemami, z jakimi możemy się spotkać przy implementacji, są zniekształcenia charakterystyki częstotliwościowej. Takie problemy występują, ponieważ jesteśmy zmuszeni stosować dwójkową (czyli 0 lub 1 - wszak operujemy w domenie cyfrowej) reprezentację współczynników filtru i wyników pośrednich. A liczby dwójkowe mają tę paskudną przypadłość, że mają skończoną liczbę bitów. Efekty skończonej długości słowa są szczególnie dotkliwe, jeśli wielomian funkcji transmitancji H(z) jest wysokiego rzędu, tj. jeśli filtr ma dużą liczbę elementów opóźniających.
Istnieją trzy główne rodzaje błędów pochodzących od skończonej długości słowa, które utrudniają implementację filtrów NOI:
- reprezentacja współczynników przy użyciu zmniejszonej liczby bitów
- błędy przepełnienia (ang. overflow)
- błędy zaokrąglenia (ang. roundoff)
Króciutko kilka zdań o tych błędach i jak im zapobiegać.
Przy obliczaniu współczynników filtru uzyskuje się bardzo dużą dokładność, np. ułamkowe wartości współczynników filtru mogą mieć dokładność do ośmiu cyfr po przecinku i większą. Aby zapisać lub zapamiętać współczynniki o takiej dokładności potrzebować będziemy 32 bitów (cyfra dziesiętna potrzebuje ich minimum 4).
Co więc stanie się, jeśli do zapamiętania współczynników i wyników obliczeń dysponujemy rejestrami 4-bitowymi? Wtedy, np. zamiast obliczonego współczynnika b(n) = 0,20482712, będziemy zmuszeni użyć współczynnika b(n) = 0,2. To spowoduje przesunięcie biegunów i zer filtru na płaszczyźnie "z", co nie dość że spowoduje nam zniekształcenia charakterystyki częstotliwościowej, to jeszcze może przesunąć bieguny poza obszar stabilności (z filtru zrobi się generator przebiegów losowych).
Jak się okazuje filtry wyższych rzędów są bardziej wrażliwe na dokładność współczynników i dla takich filtrów reprezentacja współczynników ze zmniejszoną liczbą bitów jest najbardziej prawdopodobną przyczyną pojawienia się niemożliwych do zaakceptowania zniekształceń charakterystyki częstotliwościowej.
Przepełnienie, drugi efekt skończonej długości słowa, pojawia się, gdy wynik operacji arytmetycznej jest zbyt duży, aby mógł być przechowywany w rejestrach o stałej długości. Bez wprowadzenia zabezpieczeń pozwalających na obsługę błędów przepełnienia mogą pojawić się duże błędy nieliniowe w próbkach wyjściowych filtru - często w postaci oscylacji przepełnienia (ang. overflow oscillations).
Istnieje kilka sposobów redukowania szkodliwych skutków błędów reprezentacji współczynników ze zmniejszoną liczbą bitów i zjawiska oscylacji sygnału wyjściowego. Możemy zwiększyć długość rejestrów sprzętowych, przechowujących wyniki pośrednie obliczeń. Aby uniknąć pojawienia się sygnału wejściowego o samych zerach niekiedy dodaje się do sygnału wejściowego niewielki sygnał zakłócający dither.
Sygnał ten jest ciągiem liczb pseudolosowych o małych wartościach (o sygnale dither pisałem więcej, kiedy omawialiśmy sobie w cyklu Technika cyfrowa próbkowanie i kwantyzację). Ten sposób zmniejsza jednak efektywny stosunek sygnał/szum w sygnale wyjściowym filtru. Ostatecznie, aby uniknąć zjawiska oscylacji, możemy po prostu zastosować filtry SOI, które z definicji mają odpowiedź impulsową o skończonej długości i nie mają sprzężenia zwrotnego, nie mogą zatem generować żadnych oscylacji.
Jeżeli chodzi o oscylacje wywołane przepełnieniem, to możemy wyeliminować niebezpieczeństwo ich powstawania, jeżeli zwiększymy długość słowa, tak aby w filtrze NOI nigdy nie występowało przepełnienie w czasie sumowań. Jeżeli implementuje się filtr na sprzęcie o architekturze zmiennoprzecinkowej, to okazuje się, że stosowanie danych w reprezentacji zmiennoprzecinkowej istotnie ogranicza możliwość powstawania błędów przepełnienia i oscylacji.
Najpopularniejszym sposobem minimalizowania błędów wynikających ze skończonej długości słowa jest projektowanie struktury kaskadowej lub równoległej filtrów niskiego rzędu. Czyli np. zamiast stosować filtr 6. rzędu łączymy 3 filtry rzędu drugiego, bądź kaskadowo (szeregowo), bądź równolegle.
PORÓWNANIE FILTRÓW SOI I NOI
Cała ta pisanina zmierza do tego, aby spróbować zawyrokować, który z filtrów jest lepszy, a który gorszy. Zła wiadomość jest taka, że nie ma takiej jednoznacznej odpowiedzi, ba, nawet gdybyśmy chcieli wybrać jeden z filtrów do konkretnych struktur cyfrowych też trudno jednoznacznie orzec, że ten będzie OK, a tamten nie za bardzo. Spróbujmy jednak wskazać kilka czynników, które pozwolą nam dokonać takiego wyboru.
Po pierwsze możemy przyjąć, że nie ma różnicy w stopniu trudności procedury projektowania dla obu typów filtrów, zwłaszcza że w 99,999% wykorzystuje się do tego celu komputer wraz z odpowiednim oprogramowaniem (a ich obsługa jest bardzo podobna, zarówno w przypadku projektowania filtru NOI, jak i SOI). Wychodząc ze sprzętowego punktu widzenia, gdzie różnice pomiędzy filtrami SOI i NOI są zasadnicze, nasz wybór musi wynikać z tych właściwości filtru, które są najbardziej i najmniej dla nas istotne.
Na przykład, jeśli wymagany jest filtr o dokładnie liniowej fazie, to jedynym poprawnym wyborem będzie filtr SOI. Jeżeli jednak wymagane jest, aby filtr pracował z bardzo wielką częstotliwością, a dopuszczalna jest niewielka nieliniowość fazy, możemy skłonić się ku filtrom NOI z ich zredukowaną liczbą operacji mnożenia dla jednej próbki sygnału wyjściowego.
W celu całościowego ogarnięcia właściwości obu filtrów proszę spojrzeć na Tabelę 1 i już wszystko będzie jasne (przynajmniej mam taką nadzieję).
Jan Erhard
Jan Erhard z wykształcenia jest informatykiem i specjalistą od sieci cyfrowych, zaś z zamiłowania muzykiem. Zajmuje się też realizacją dźwięku, stąd jego zainteresowania i duża wiedza na temat cyfrowego przetwarzania sygnałów.