Filtracja Dolnoprzepustowa w Pythonie: Poradnik
- Szczegóły
Filtr dolnoprzepustowy (ang. low-pass filter) to rodzaj filtru, który przepuszcza sygnały o niższych częstotliwościach i tłumi sygnały o wyższych częstotliwościach. Często, stosując filtr dolnoprzepustowy, nie dobieramy współczynników na podstawie wymagań, takich jak częstotliwość odcięcia. Do prostych zastosowań stroimy filtr zazwyczaj „na oko”. Dlatego nie będziemy się mocno zagłębiać w teorię dotyczącą filtru, a skupimy się na implementacji w kodzie.
Zalety i Wady Filtrów Dolnoprzepustowych
Do głównych zalet filtrów dolnoprzepustowych zaliczamy to, że poprzez tłumienie sygnałów o wyższych częstotliwościach, filtry dolnoprzepustowe pozwalają skoncentrować się na sygnałach o bardziej istotnych niższych częstotliwościach. Dodatkowo filtry dolnoprzepustowe mogą być wykorzystywane do wygładzania sygnałów, eliminując nagłe zmiany i fluktuacje. To przydatne w przypadkach, gdy zależy nam na uzyskaniu bardziej stabilnego i jednostajnego sygnału.
Jednak filtry dolnoprzepustowe mają także wady. Przejście między pasmem przepustowym a pasmem zaporowym może powodować pewne zniekształcenia w sygnale. Zazwyczaj w okolicach częstotliwości granicznej można zaobserwować tzw. efekt wyciemniania (ang. roll-off), który prowadzi do stopniowego zmniejszania się amplitudy sygnału. Filtry dolnoprzepustowe wprowadzają opóźnienie grupowe, co oznacza, że różne składowe częstotliwości sygnału będą przesunięte w czasie w zależności od swojej częstotliwości. Może to mieć znaczenie w aplikacjach, w których wymagana jest synchronizacja sygnałów. Poza tym może tłumić nie tylko niepożądane składowe sygnału, ale także pewne części sygnału, które mogą być istotne.
Filtry FIR i IIR
Filtr FIR to filtr o skończonej odpowiedzi impulsowej, a IIR - nieskończonej. Filtry FIR są prostsze "logicznie", zawsze są stabilne, ale do osiągnięcia tych samych parametrów wymagają większej liczby współczynników.
W bibliotece scipy.signal jest kilka funkcji do projektowania filtrów o zadanych parametrach. Filtry typu FIR zwykle wymagają znacznie wyższych rzędów, aby osiągnąć transmitancję o porządanej formie. Mają jednak dwie podstawowe zalety:
Przeczytaj także: Definicja i pomiar filtracji kłębuszkowej
- ich funkcja odpowiedzi jest skończona opisana wektorem b - efekty brzegowe sięgają z obu końców filtrowanego sygnału na dokładnie połowę długości wektora b
- mają liniową zależnaość fazy od częstości.
Parametry przy projektowaniu filtrów FIR:
- numtaps: int, ilość współczynników filtru (rząd filtru+1).
- cutoff: częstość odcięcia filtru. Może być jedną liczbą zmiennoprzecinkową dla filtru dolno- lub górno- przepustowego lub tablicą dla filtrów pasmowych.
- window: napis lub krotka: określa jakiego okna użyć do projektu filtru.
- pass_zero: bool, Jeśli True to zero jest przenoszone, jeśli False to nie jest.
- nyq: float.
Biblioteka scipy.signal również implementuje okienkową metodę projektowania filtrów FIR. Daje ona nieco większą swobodę w kształtowaniu idealnej funkcji przenoszenia. Zadaje się ją przez podanie dwóch wektorów:
- freq: Wektor freq definiuje punkty w częstości (jednostki takie same jak nyq, muszą zawierać 0 i nyq) dla których znana jest wartość pożądanego przenoszenia. Wartości freq muszą być ułożone w kolejności rosnącej, dopuszczalne jest powtórzenie tej samej wartości częstości i odpowiadających im różnych wartości gain aby zdefiniować nieciągłość funkcji przenoszenia.
- gain: Pożądane wartości przenoszenia odpowiadające kolejnym częstościom definiowane są w gain.
Filtry Butterwortha, Czebyszewa i Eliptyczne
W module scipy.signal dostępne są funkcje do projektowania czterech typów filtrów: Butterwortha, Czebyszewa typu I i II, oraz eliptyczny. Do opisu wymagań projektowych funkcje te wykorzystują następujące pojęcia:
- wp, ws - krawędzie pasma przenoszenia i tłumienia. Częstości są znormalizowane do zakresu od 0 do 1 (1 odpowiada częstości Nyquista) przykładowo:
- dolno-przepustowy: wp = 0.2, ws = 0.3
- górno-przepustowy: wp = 0.3, ws = 0.2
- pasmowo-przepustowy: wp = [0.2, 0.5], ws = [0.1, 0.6]
- pasmowo-zaporowy: wp = [0.1, 0.6], ws = [0.2, 0.5]
- gpass - maksymalna dopuszczalna strata w pasmie przenoszenia (w funkcjach projektujących filtry jest to rp) (dB).
- gstop - minimalne wymagane tłumienie w pasmie tłumienia (w funkcjach projektujących filtry jest to rs) (dB).
Filtrowanie sygnałów off-line można zrealizować tak, aby sygnał wyjściowy nie miał przesunięcia fazowego. Procedura powyższa zaimplementowana jest w funkcji: scipy.signal.filtfilt.
Implementacja w Języku C
Implementacja kodu filtra dolnoprzepustowego nie jest skomplikowana. Sprowadza się do zapisania równania, które już wcześniej omówiliśmy w formie jednej linijki w języku C. Ale zanim o tym, najpierw przygotujemy podstawy pod użycie filtra. W przypadku filtra dolnoprzepustowego nie będziemy potrzebowali bufora do przechowywania danych. Wystarczy, że wiemy jaki jest współczynnik filtru oraz zapiszemy poprzednie wyjście filtru.
Przeczytaj także: Webber AP8400 - wymiana filtrów
W przypadku filtra dolnoprzepustowego nie będziemy potrzebowali bufora do przechowywania danych. Wystarczy, że wiemy jaki jest współczynnik filtru oraz zapiszemy poprzednie wyjście filtru. Jak pewnie zauważyłeś, użyłem zmiennych typu float. Aby filtr dobrze działał, będzie potrzebował przechowywać ułamkowe części wyjścia, dzięki czemu nie utracimy płynności jego działania. Poza tym współczynnik alfa może przyjmować wartości od 0 do 1, dlatego również musi być typu float. Użycie typów zmiennoprzecinkowych wiąże się z większym obciążeniem mikrokontrolera. Szczególnie jeżeli nie mamy do dyspozycji jednostki FPU. Oczywiście, jeżeli filtrujemy dane np. co sekundę, to nie będzie to żadnym problemem. Ale już wywoływanie obliczeń z dużą częstotliwością może spowodować pewne problemy.
Przeczytaj także: Optymalne rozcieńczenie bimbru
tags: #filtracja #dolnoprzepustowa #python #tutorial

