Ulubiony kiosk PRZEJRZYJ ONLINE WRZEŚNIOWE WYDANIE Live Sound ZAMÓW Z PRZESYŁKĄ GRATIS

Tutoriale

Filtry FIR. Filtry cyfrowe w praktyce II

Filtry FIR. Filtry cyfrowe w praktyce II

Dodano: piątek, 18 grudnia 2015

W ubiegłym miesiącu przedstawiliśmy kilka podstawowych informacji o filtrach FIR, czyli filtrach o skończonej odpowiedzi impulsowej.

 

Na początek małe podsumowanie tego, o czym mowa była w poprzednim numerze:

1. Korzystając z filtrów FIR możemy zaprojektować crossover z filtrami dolno i górnoprzepustowymi o bardzo stromych zboczach, który będzie charakteryzować się płaską charakterystyką fazową, a więc również płaskim przebiegiem charakterystyki opóźnienia grupowego (group delay), tj. takim samym opóźnieniem dla wszystkich częstotliwości.

2. Charakterystyka amplitudowa i fazowa w filtrach FIR może być kształtowana niezależnie. W filtrach IIR te charakterystyki są współzależne – nie można zmienić przebiegu jednej bez wpływania na przebieg drugiej.

3. Charakterystyka impulsowa, np. w formie nagranego pliku WAV, jest filtrem FIR, ponieważ ma skończoną długość i (teoretycznie) nie może osiągać zerowych wartości w nieskończoności. Dowolna zmierzona charakterystyka impulsowa – np. za pomocą programów takich jak SMAART, SatLive, REW czy SysTune – może być potencjalnym filtrem FIR, który możemy wykorzystać np. do strojenia systemu nagłośnieniowego.

Czas przejść od teorii do praktyki i powiedzieć co nieco o

TWORZENIU (PROJEKTOWANIU) FILTRÓW FIR


Nie mam tu na myśli projektowania hardware’owych filtrów, z wykorzystaniem „kości” układów scalonych (procesorów) i mnóstwa innych elementów elektronicznych – od tego są specjaliści, którzy się na tym znają, i którzy swoją wiedzę budowali latami. My, zwykli śmiertelnicy, możemy natomiast skorzystać z gotowych już urządzeń, które oferują możliwość zaimplementowania zaprojektowanych przez nas filtrów FIR. Takich urządzeń jest kilka na rynku – część procesorów głośnikowych, czy też wzmacniaczy z wbudowanymi DSP, oferuje takie możliwości (np. wzmacniacze Powersofta z serii K i X).

Trzeba bowiem pamiętać, iż filtr cyfrowy – w przeciwieństwie do analogowego, który jest układem zbudowanym z elementów elektronicznych, jak cewki, kondensatory i rezystory – jest tak naprawdę… ciągiem cyfr, a konkretnie ciągiem zer i jedynek. Oczywiście nam, ludziom, łatwiej jest interpretować zapis dziesiętny niż zero-jedynkowy („strawny” dla urządzeń cyfrowych), toteż przykładowy cyfrowy filtr korekcyjny FIR 37. rzędu tak naprawdę wygląda tak, jak to widać w ramce.

Ów ciąg liczb to współczynniki filtru (jest ich tyle, ile wynosi rząd filtru, czyli w naszym przypadku 37), zaś współczynniki filtru FIR to nic innego, jak odpowiedź impulsowa filtru – czyli jego reakcja na pobudzenie pojedynczą próbką o jednostkowej wartości (o wartości 1), przed którą następują próbki o zerowej wartości. Polega to po prostu na przemnożeniu kolejnych współczynników filtru przez jednostkową próbkę. Tak więc pojęcia „współczynniki filtru FIR” i „odpowiedź impulsowa filtru FIR” są synonimami. Ów ciąg cyfr w ramce, czyli, jak już wiemy, współczynniki filtru, są więc tak naprawdę bardzo krótkim, bo składającym się tylko z 37 sampli plikiem dźwiękowym, którego przebieg w dziedzinie czasu wygląda tak, jak na rysunku 1 (screenshot ze zwykłego programu do edycji plików dźwiękowych, w tym przypadku Cool Edit).

Jeśli teraz ten plik poddamy analizie częstotliwościowej, np. w jakimś programie do pomiarów FFT (w moim przypadku był to SatLive), otrzymamy charakterystykę filtru w funkcji częstotliwości – zarówno amplitudową, jak i fazową (rysunek 2). Jest to zgodne z oczekiwaniami, bowiem poddając analizie FFT odpowiedź impulsową (a więc współczynniki filtru FIR) uzyskujemy jego charakterystykę częstotliwościową. I na odwrót – mając charakterystykę częstotliwościową, stosując odwrotną transformatę Fouriera (IFFT lub IDFT), dostajemy odpowiedź impulsową, a więc współczynniki filtru FIR.

Rysunek 2. Poddając analizie częstotliwościowej plik WAV z odpowiedzią impulsową
(współczynnikami) filtru FIR otrzymujemy jego charakterystykę w funkcji częstotliwości
– zarówno amplitudową (niebieska), jak i fazową (czerwona).


Na tej właśnie zasadzie działa program do projektowania filtrów FIR, o którym więcej w tym i kolejnym artykule.

REPHASE


RePhase to darmowe oprogramowanie służące do projektowania filtrów FIR. Korzystając z rePhase można stworzyć filtr cyfrowy o skończonej odpowiedzi impulsowej na dwa sposoby – można to zrobić „od zera” lub wykorzystując do tego zmierzoną już charakterystykę, którą dzięki naszemu filtrowi będziemy chcieli poprawić. W tym drugim przypadku „naprawiać” możemy zarówno przebieg amplitudy, jak i fazy, i to – co, jak wiemy jest dużą zaletą FIR-ów – zupełnie niezależnie. Nasz przywoływany wcześniej filtr o parametrach jak w ramce na poprzedniej stronie, a więc o odpowiedzi impulsowej z rysunku 1 i charakterystyce z rysunku 2, został właśnie zaprojektowany jako filtr korygujący pewną zmierzoną już wcześniej charakterystykę, która najpierw została zaimportowana do programu (z pliku tekstowego), korzystając z rozwijanego menu File/Import Measurement. Charakterystyka, którą próbowaliśmy korygować naszym filtrem, pierwotnie wyglądała tak, jak na rysunku 3 – jest to zrzut ekranowy z programu rePhase po zaimportowaniu owej charakterystyki, na którym grubszą linią ciągłą uwidoczniono przebieg charakterystyki amplitudowej, a przerywaną charakterystyki fazowej.

Chcąc „ulepszyć” charakterystykę amplitudową i/lub fazową korzystamy z dwóch ostatnich zakładek w oknie pod wykresem (z lewej strony ekranu) – Paragraphic Phase EQ (korekcja fazy) i Paragraphic Gain EQ (korekcja amplitudy). Są to 17-pasmowe korektory parametryczne (paragraficzne), w których każdemu filtrowi możemy zadać dowolną wartość częstotliwości środkowej i dobroci, zaś suwakami wartość tłumienia/podbicia tego pasma (dla korektora amplitudy) lub wartość przesunięcia fazy, in plus lub in minus (dla korektora fazy). Co ciekawe, nie jesteśmy „skazani” tylko na jedną wartość zakresu zmian amplitudy czy fazy – możemy wybrać zakresy od ±3 dB do ±96 dB(!) dla amplitudy oraz od ±10º do ±720 º!

To nie koniec „atrakcji”, bowiem takich 17-pasmowych banków filtrów mamy 16, tak że gdy wykorzystamy wszystkie 17 filtrów pierwszego banku, przechodzimy do następnego, i znów możemy użyć kolejnych 17 filtrów, równolegle do banku poprzedniego, i tak aż do ostatniego banku. W sumie więc mamy do dyspozycji 16 × 17, czyli 272 w pełni parametryczne filtry. Mało tego, każdy bank może mieć inne zakresy pracy filtrów, tak więc w jednym banku możemy dokonać zgrubnej korekcji filtrami o szerokim zakresie wzmocnienia/tłumienia czy zmian fazy, a następnie filtrami w innym banku „dopieścić” jeszcze bardziej przebieg charakterystyk za pomocą precyzyjnych filtrów o małym zakresie pracy. Mamy też możliwość wyboru rodzaju filtru (dotyczy to tylko korekcji amplitudy), przy czym do wyboru mamy filtry półkowe (low i high), typu constant Q i proportional Q, filtry o stałym nachyleniu (constant slope) i stałym kształcie (constant shape) oraz filtry cosinusowe (rised cosine), a poza tym możemy wybrać, czy mają to być filtry minimalnofazowe (w których zmianie amplitudy towarzyszy proporcjonalna zmiana fazy), czy filtry o liniowej fazie (faza nie ulega zmianie przy zmianie amplitudy) – nie dotyczy to filtrów cosinusowych i filtrów o stałym nachyleniu, które z definicji są filtrami o liniowej fazie.

Oczywiście tak naprawdę nie są to żadne filtry sensu stricte, ale pasma o wybieranej szerokości (dobroci), które możemy regulować w zakresie zmian amplitudy i/lub fazy. Reasumując mamy więc 272 takie pasma, które pozwalają na niemalże dowolne dostrajanie zaimportowanej charakterystyki, osobno dla fazy i amplitudy.

Możemy też stworzyć swój filtr FIR od zera, tzn. nie importując żadnej charakterystyki, a kształtując charakterystykę amplitudową i fazową (w sposób zależny, jak i niezależny) filtru, poczynając od płaskiego przebiegu ich obu. Charakterystyki owe możemy kształtować bądź korzystając z wirtualnych filtrów paragraficznych fazy i amplitudy, bądź też – jeśli projektujemy crossover – z gotowych presetów filtrów dolno i górnoprzepustowych również kilku różnych typów (zarówno o zmiennej, jak i niezmiennej fazie). O tym jednak opowiemy sobie szerzej w kolejnym numerze, a teraz wróćmy do poprawiania zaimportowanej charakterystyki za pomocą banków wirtualnych filtrów paragraficznych.

POPRAWIAMY


Mając zaimportowaną charakterystykę, którą chcemy poprawić, tzn. możliwie najlepiej ją zlinearyzować (amplitudową i fazową), możemy przystąpić do „zabawy” suwaczkami naszych wirtualnych filtrów w zakładkach Paragraphic Phase EQ i Paragraphic Gain EQ. Powiedzmy, że udało nam się osiągnąć satysfakcjonujący nas efekt w postaci docelowych charakterystyk – amplitudowej i fazowej – które powinny wyglądać tak, jak te z rysunku 4 (zarówno na rysunku 4a, jak i 4b są te same charakterystyki, natomiast pokazane zostały dwa razy, aby uwidocznić, w jaki sposób – jakimi wirtualnymi filtrami i o jakich parametrach – taki efekt udało się uzyskać). Jak widać z rysunków 4a i 4b, domniemany efekt udało się uzyskać „zatrudniając” do tego tylko 16 najprostszych filtrów typu constant Q korygujących amplitudę i 13 korygujących fazę.

Rysunek 4. Pracując mozolnie suwakami wirtualnych korektorów amplitudy i fazy udało
nam się uzyskać satysfakcjonujący nas efekt: a) pod charakterystykami parametry filtrów
użytych do linearyzacji fazy, b) filtry użyte do linearyzacji charakterystyki amplitudowej.

Czy aby na pewno nam się to udało?

SPRAWDZAM!


Jak widać w środkowym okienku pod wykresem, sąsiadującym z oknem z suwakami wirtualnych filtrów, zaryzykowaliśmy zaprojektowanie filtru 37. rzędu (pierwsze okienko od góry), a więc o 37 współczynnikach (samplach) – lepiej będzie to widoczne w zbliżeniu, na rysunku 5.

Wiadomo (mam nadzieję), iż im większy rząd filtru FIR (im więcej współczynników), tym większa rozdzielczość w dziedzinie częstotliwości, co ma szczególnie istotne znaczenie w zakresie niższych częstotliwości. Wiadomo też (również mam nadzieję), że im więcej współczynników, tym większa latencja wprowadzana przez filtr – co wynika z liczby mnożeń wykonywanych przez procesor DSP, potrzebnych do uzyskania efektu filtracji sygnału. Owa liczba 37 współczynników nie jest tutaj jakaś istotna – ot, chciałem użyć ich możliwie jak najmniej, aby nasza ramka ze współczynnikami na drugiej stronie artykuły nie zajęła nam całej strony. Czy więc 37 ogniw (współczynników) filtru wystarczy, aby uzyskać charakterystykę, jak na rysunku 4?

Aby się o tym przekonać, musimy wygenerować te współczynniki. Oprócz rzędu filtru możemy wybrać długość słowa FFT (co znów wpływa nam na rozdzielczość, tym razem konwersji odpowiedzi impulsowej filtru na jego charakterystyki częstotliwościowe) oraz rodzaj okna czasowego (duży wybór, ale tym parametrem nie musimy sobie zbytnio zawracać głowy, zostawiając domyślne prostokątne, czyli rectangular, albo trójkątne (triangular) lub Blackmana-Harrisa). Optymalizację najlepiej zostawić domyślną, czyli średnią (moderate), istotne natomiast będą dwa kolejne okienka. W pierwszym wybieramy częstotliwość próbkowania filtru, co będzie miało swoje skutki w postaci różnych wartości latencji oraz rozdzielczości.

Im większa częstotliwość próbkowania, tym mniejsza latencja, która zawsze równa się połowie liczby współczynników (w naszym przypadku 18, bowiem wszystkich współczynników jest 37). Czas trwania jednego sampla jest jednak uzależniony od częstotliwości próbkowania – im ona jest wyższa, tym ten czas jest krótszy, a więc i latencja będzie mniejsza. Np. dla częstotliwości próbkowania 44,1 kHz czas trwania jednej próbki wynosi ok. 22,5 mikrosekundy, a więc latencja naszego filtru 37. rzędu wyniesie ok. 0,4 milisekundy (18 x 22,5 μs = 0,4 ms). Nie musimy tego zresztą wcale liczyć – wielkość latencji wprowadzanej przez nasz filtr widzimy na samym dole okienka z parametrami filtru, w postaci liczby sampli i czasu w milisekundach. Tak nawiasem mówiąc, możemy tam też zobaczyć, jaka będzie maksymalna wartość amplitudy charakterystyki naszego filtru w stosunku do referencyjnej wartości 0 dB.

Jeśli jednak ustawimy dużą częstotliwość próbkowania, przy małej liczbie ogniw filtru jego rozdzielczość będzie bardzo marna (zaraz to pokażemy).

Drugi istotny parametr do ustawienia to format danych o naszym filtrze. Możemy uzyskać nasz filtr w formie pliku WAV (jak wiemy, jest to odpowiedź impulsowa naszego filtru, czyli po prostu wartość poszczególnych próbek/współczynników filtru – jak na rysunku 1). I tutaj mamy do wyboru 16- 24- i 32-bitowe pliki w formacie LPCM (linear PCM), jak i 32-bitowym IEEE, w obu przypadku zarówno w trybie mono, jak i stereo. Możemy też nasze współczynniki uzyskać w formie pliku binarnego (32 bity IEE-745 mono), a także – co nas będzie najbardziej interesowało – w postaci pliku tekstowego (również 32-bitowy filtr mono). Są jeszcze dwa pliki w postaci zmiennoprzecinkowych tablic.

Na koniec pozostaje nam wybrać nazwę dla naszego pliku z danymi o filtrze oraz destynację, w której będzie on zapisany, a na koniec nacisnąć przycisk „generate”. Po pewnym czasie – zależnym od liczby współczynników oraz wybranej optymalizacji – uzyskamy wynik w postaci pliku o wybranym przez nas formacie. Jednocześnie w okienku z domniemaną charakterystyką naszego filtru pojawiają się jego rzeczywiste charakterystyki (zarówno amplitudowa, jak i fazowa), tzn. program pokazuje nam, co udaje się uzyskać przy założonych parametrach (liczbie ogniw, częstotliwości próbkowania, okienkowaniu i optymalizacji).

Wygląda to tak, jak na rysunku 6. Widać, iż o ile w zakresie wysokich częstotliwości uzyskaliśmy dużą zgodność wykresu założonego i wynikowego, o tyle w zakresie niższym do naszego ideału (wykres niebieski) trochę nam brakuje, a w przypadku fazy również i w zakresie środka.

Rysunek 6. Po wciśnięciu przycisku „generate” program pokazuje nam, co udaje się
uzyskać z charakterystyką pierwotną „potraktowaną” naszym filtrem FIR, przy założonych
parametrach (liczba ogniw filtra 37, częst. próbkowania 44,1 kHz – wykres czerwony).

No cóż, latencja nieprzekraczająca pół milisekundy przy częstotliwości próbkowania 44,1 kHz to żadna latencja, możemy więc nieco „zaszaleć” i spróbować np. stworzyć filtr 1.000. rzędu (a co się rozdrabniać). Wpisujemy więc w pierwszym okienku liczbę tysiąc (automatycznie długość słowa FFT wzrasta nam do 8.192). No, to „generate”! I jak? Noooo, od razu widać dużą poprawę, wykresy uzyskują bardzo dużą zbieżność, i to praktycznie w całym zakresie użytecznym (rysunek 7).

Rysunek 7. Zwiększając liczbę współczynników (rząd) filtru do 1.000 uzyskujemy dużo
większą zbieżność charakterystyki założonej z wynikową, zwiększa nam się za to dość
istotnie latencja

Faza również przepiękna. Gdzie tkwi haczyk? Ano latencja wzrosła nam już do ponad 11 ms, co nie jest już takie niezauważalne. To prawie 4 metry różnicy w dystansie, czyli tak, jakbyśmy odsunęli się od naszego źródła dźwięku o kilka kroków – tragedii jeszcze nie ma, ale w przypadku odsłuchu na słuchawkach (np. w systemach IEM) byłbym już ostrożny.

Przy częstotliwości próbkowania 48 kHz w dalszym ciągu przebieg charakterystyk jest mocno zbieżny, ale też i latencja jakoś szczególnie nie zmalała – ot, tylko do ok. 10,5 ms. Jeśli jednak „szarpniemy” się na 96 kHz, to o ile latencja wyniesie już tylko nieco ponad 5 ms, o tyle charakterystyki w dole pasma znów zaczynają się nam rozjeżdżać, choć dopiero poniżej 150 Hz (rysunek 8). Jeszcze gorzej wygląda owe 96 kHz przy naszym 37-rzędowym filtrze FIR – tutaj charakterystyki nam się rozjeżdżają już poniżej 6 kHz!

Widać więc, jak ostrożnie trzeba dobierać parametry i nie szafować nimi zbyt hojnie (jak mam, to czemu nie użyć), bowiem, po pierwsze, filtr może okazać się po prostu niepraktyczny (np. o zbyt dużej latencji) albo daleko odbiegający od ideału (zbyt duża częstotliwość próbkowania w stosunku do liczby ogniw filtra). Po drugie zaś trzeba też liczyć się z ograniczeniem sprzętowym procesora DSP, który nasz filtr będzie „przeżuwał” – przeważnie zarówno maksymalna liczba ogniw filtra, jak i częstotliwość próbkowania są z góry narzucone. Dla przykładu DSP wzmacniaczy Powersofta X4 i X8 ma ograniczoną maksymalną liczbę współczynników filtra do 384, a częstotliwość próbkowania musi wynosić 48 kHz.

Możemy także zobaczyć, jak wygląda charakterystyka samego filtru, który zaprojektowaliśmy (a nie jak być może będzie wyglądała charakterystyka naszego urządzenia po przepuszczeniu sygnału doń docierającego przez nasz filtr). Wystarczy w ostatnim okienku (na dole po prawej), w zakładce Measurements wcisnąć „bypass”. Wtedy właśnie zamiast charakterystyki wynikowej możemy zobaczyć charakterystyki (amplitudową i fazową) naszego filtru, zarówno tego idealnego (niebieska), jak i tego, jaki jesteśmy w stanie uzyskać przy założonych parametrach. Oczywiście można też sobie zapisać nasz filtr w pliku WAV, a następnie poddać go analizie w innym programie FFT – tak, jak to ja zrobiłem, aby uzyskać charakterystykę z rysunku 2. Jednak program rePhase też to umożliwia bez konieczności eksportowania, importowania i analizowania plików – wystarczy wcisnąć jeden przycisk i mamy to, jak na dłoni (rysunek 9).

Widać, że przebieg charakterystyki amplitudowej jest odzwierciedleniem położenia suwaków naszego wirtualnego korektora paragraficznego, a przy 1.000 współczynników i częstotliwości próbkowania 44,1 kHz (latencja 11,34 ms) mamy tylko niewielką rozbieżność w stosunku do charakterystyki „idealnej” w okolicy 120 i 190 Hz, nieprzekraczającą 1 dB. Z kolei na rysunku 10 widać, jak niewielka jest rozdzielczość w zakresie niskich częstotliwości filtru 37. rzędu, gdzie założona przez nas 4-decybelowa „górka” w okolicy 62 Hz jest całkowicie „niewidzialna” dla filtru, podobnie jak próby zmiany fazy w okolicach 100 Hz.

Jeśli ktoś myśli, że to koniec pracy, to się myli. To dopiero połowa sukcesu – teraz trzeba skonfrontować to z rzeczowością. Ale o tym już w kolejnym wydaniu LSI.

Piotr Sadłoń