Filtracja Sygnałów Cyfrowych: Zasada Działania i Zastosowania
- Szczegóły
Filtry cyfrowe to algorytmy, które służą do przetwarzania sygnałów cyfrowych. Pozwalają na usuwanie lub redukowanie niepożądanych składników sygnału, takich jak szum i zniekształcenia.
Specjalne Zastosowania Filtrów Cyfrowych
W wielu sytuacjach filtry cyfrowe są wykorzystywane do tłumienia lub przepuszczania wybranych zakresów częstotliwości.
Wygładzanie Sygnałów
Sygnały pozyskiwane z różnego rodzaju czujników (sensorów) są niemal zawsze zniekształcone przez szum. Aby uzyskać sygnał użyteczny, należy pozbyć się szumu. Jest to złożone zagadnienie, szum często ma zwykle niestacjonarny charakter (zmienny w czasie), do jego usuwania wykorzystywane są specjalne algorytmy estymujące szum. Tutaj zostanie pokazane prostsze podejście, polegające na wygładzaniu sygnału (smoothing). Poniżej pokazano przykładowe dane uzyskane z rzeczywistego czujnika.
Taki filtr nazywa się filtrem średniej ruchomej (MA, moving average filter). Długość filtru określa liczbę próbek sygnału uwzględnianych przy uśrednianiu. W kazdym przypadku widoczne są zafalowania charakterystyki. Dla filtru o długości 5 nastąpiło zmniejszenie szumu, ale jest on nadal obecny. Filtr o długości 11 daje dość dobre wygładzenie sygnału. Stosuje się również ważone filtry średniej ruchomej, w których współczynniki nie są jednakowe, można np.
Innym filtrem stosowanym do wygładzania sygnałów jest filtr Sawickiego-Golaya. Podczas gdy poprzednia metoda jedynie uśrednia odcinki sygnału, filtr S-G dopasowuje wielomian zadanego rzędu do poszczególnych odcinków sygnału, stosując metodę najmniejszych kwadratów. Dla filtrów S-G musimy podać dwa parametry. Długość okna wyznacza liczbę współczynników i określa liczbę próbek sygnału uwzględnianych przy wygładzaniu, długość okna musi być liczbą nieparzystą. Drugim parametrem jest rząd wielomianu dopasowywanego do punktów, musi on być mniejszy niż długość okna. Wielomiany rzędu trzeciego zazwyczaj dają tu dobre wyniki. Wykres charakterystyki filtru S-G jest dość podobny do filtru średniej ruchomej.
Przeczytaj także: Definicja i pomiar filtracji kłębuszkowej
Dla długości równej 5, szum jest usunięty w niewielkim stopniu. Dla długości 11 sygnał zostaje wygładzony, ale nadal podąża za kształtem zaszumionego sygnału. Kolejny wykres pokazuje porówanie działania filtru średniej ruchomej o długości 11 z filtrem S-G o długości 31. W tym przypadku efekty są niemal identyczne, więc prostszy filtr średniej ruchomej sprawdził się dobrze w wygładzaniu sygnału.
Filtr Różniczkujący
Zadaniem filtru różniczkowego (differentiator) jst obliczanie pochodnej sygnału. W obwodach analogowych, rolę układów różniczkujących pełnią układy zbudowane z rezystorów i cewek (RL). Cyfrowe filtry różniczkujące mogą mieć zastosowanie w przypadkach, gdw których pochodna sygnału jest potrzebna do uzyskania żądanych informacji. Przykładowo, mając sygnał opisujący zmiany położenia obiektu, możemy uzyskać informację o prędkości poruszania się tego obiektu.
Jeżeli filtr ma obliczać pochodną sygnału, to po podaniu na jego wejście sygnału $\sin(x)$ powinniśmy uzyskać na wyjściu sygnał $x \cos(x)$, czyli jego charakterystyka częstotliwościowa powinna narastać liniowo z częstotliwością, a charakterystyka fazowa powinna być stała i równa $\pi/2$. Opisane wyżej filtry mają charakterystyki znacznie odbiegające od oryginalnej. Filtr działa zgodnie z założeniami tylko w paśmie do ok. 5 kHz. Będzie więc różniczkował składowe sygnału o niskich częstotliwościach, natomiast wyższe częstotliwości zostaną stłumione.
Nie da się zrealizować cyfrowego filtru mającego idealną charakterystykę układu różniczkującego, można ją jednak przybliżyć stosując metody optymalizacyjne w projektowaniu filtru, np. metodę Parksa-McClellana. Do realizacji takiego filtru musimy wykorzystać filtr FIR typu III lub IV, czyli o asymetrycznej odpowiedzi impulsowej. Do zaprojektowania filtru możemy użyć funkcji scipy.signal.remez, podając parametr type='differentiator'. Musimy założyć zakres częstotliwości, w którym charakterystyka częstotliwościowa ma być liniowa. Załóżmy zakres przepustowy od 0 do 23 kHz i pasmo przejściowe prawie do częstotliwości Nyquista.
Jak widać, zwiększanie długości filtru powoduje zbliżenie charakterystyki do idealnej. Poniżej pokazano wynik różniczkowania sygnału, który wcześniej został poddany wygładzaniu. Sygnały zostały wyrównane i przeskalowane tak, aby można było je porównać. Widoczne jest, że miejsca zerowe zróżniczkowanego przebiegu pokrywają się z minimami i maksimami oryginalnego sygnału. Analizowany sygnał jest wolnozmienny, a w paśmie niskich częstotliwości, prosty filtr pierwszego rzędu ma w przybliżeniu liniową charakterystykę, dlatego oba filtry dają niemal identyczny wynik.
Przeczytaj także: Webber AP8400 - wymiana filtrów
Filtr Całkujący
Filtr całkujący (integrator) oblicza całkę sygnału, jego działanie jest zatem odwrotne do filtru różniczkującego. W obwodach analogowych, układy różniczkujące składają się z rezystorów i kondensatorów (RC). W dziedzinie cyfrowej, całkowanie sygnału odpowiada sumowaniu dyskretnych wartości.
Filtr całkujący musi mieć realizację IIR. Jest to tzw. filtr całkujący wstecz (backward rectangular integrator). to tzw. filtr całkujący w przód (forward rectangular integrator). Jest to tzw. Charakterystyka filtru trapezoidalnego leży nieco poniżej idealnej.
Wszystkie omówione powyżej filtry całkujące mają jedną wspólną cechę: są to filtry niestabilne. Łatwo zauważyć, że jeżeli na wejście filtru podamy sygnał o stałych wartościach, odpowiedź filtru będzie dążyła do nieskończoności. Rozwiązaniem problemu jest wprowadzenie do równania różnicowego współczynnika $\alpha < 1$. Układ o takim równaniu różnicowym nazywa się stratnym układem całkującym. Anglojęzyczna nazwa: leaky integrator, czyli "układ całkujący z przeciekiem", obrazowo opisuje efekt jego działania: część obliczonej wcześniej sumy "wycieka" z układu. Modyfikacja ta zapewnia, że moduł biegunów jest mniejszy od jedności i układ jest stabilny.
Wartości $\alpha$ stosowane w praktyce są zwykle bardzo bliskie jedności, najczęściej w zakresie 0,99-0,998. Zmniejszanie parametru $\alpha$ powoduje większe tłumienie charakterystyki dla niskich częstotliwości. Widać, że po różniczkowaniu, a następnie całkowaniu, otrzymujemy sygnał odpowiadający oryginalnemu sygnałowi, aczkolwiek sygnały nie są identyczne na skutek utraty części informacji w trakcie przetwarzania.
Filtr Składowej Stałej
Wiele sygnałów pozyskiwanych z czujników zawiera składową stałą, czyli są one przesunięte o pewną wartość na skali amplitudy. Składowa stała jest niepożądana i powinna być odfiltrowana z sygnału. Jeżeli mamy do dyspozycji kompletny sygnał, wystarczy obliczyć składową stałą i odjąć ją od sygnału. W praktycznych zastosowaniach przetwarzamy jednak sygnał ciągły. W widmie sygnału, składowa stała jest reprezentowana przez składową na zerowej częstotliwości.
Przeczytaj także: Optymalne rozcieńczenie bimbru
Filtr składowej stałej (DC blocker, DC oznacza składową stałą, direct component) jest filtrem górnoprzepustowym, który usuwa składową stałą z sygnału. Typowy filtr cyfrowy usuwający składową stałą powstaje poprzez połączenie filtru różniczkującego z filtrem całkującym. Filtr różniczkujący daje zerowe wzmocnienie składowej stałej, ale silnie tłumi niższe częstotliwości. Stratny filtr całkujący z kolei wzmacnia niskie częstotliwości.
Znaczenie parametru $\alpha$ jest takie samo jak dla filtru całkującego. Wynik usuwania składowej stałej z sygnału pochodzącego z czujnika pokazano na poniższym wykresie. Obliczenie średniej z próbek sygnału po filtracji pokazuje, że nie jest ona zerowa. Pamiętajmy, że stratny układ całkujący ma charakterystykę odbiegającej od idealnej.
Filtr Grzebieniowy
Filtr grzebieniowy (comb filter) jest to filtr o cyklicznie powtarzającej się charakterystyce amplitudowej, przypominającej kształtem grzebień.
Działanie filtru polega zatem na dodaniu do sygnału jego "echa", czyli opóźnionej i przeskalowanej kopii. Filtr grzebieniowy o opóźnieniu $L$ ma $L$ minimów w zakresie $\left[0, f_s \right)$. Minima charakterystyki odpowiadają położeniu zer transmitancji filtru: $L$ zer jest rozłożonych w równych odległościach na okręgu o promieniu $|\alpha|$.
Filtr grzebieniowy może być wykorzystany do odfiltrowania składowych widmowych na częstotliwościach harmonicznych (będących wielokrotnościami częstotliwości podstawowej). Dla przykładu, wygenerujmy sygnał harmoniczny o częstotliwości podstawowej 1 kHz (wykorzystamy do tego celu sygnału piłokształtny i zignorujemy aliasing), po czym użyjmy filtru grzebieniowego do usunięcia składowych o częstotliwościach 2 kHz i ich wielokrotnościach. Przy częstotliwości próbkowania równej 48 kHz, $48/2=24$, więc potrzebny jest filtr o opóźnieniu $L=24$ i ujemnym współczynniku $\alpha$. Gdyby stosunek ten nie był liczbą całkowitą, konieczne byłoby użycie filtru o ułamkowym opóźnieniu (z interpolacją).
Filtr grzebieniowy usunął z sygnału parzyste wielokrotności częstotliwości podstawowej i pozostawił tylko nieparzyste wielokrotności.
Rekursywny filtr grzebieniowy ma formę filtru IIR, można go uzyskać ze "zwykłego" filtru IIR poprzez zmianę wartości opóźnienia.
O ile filtr grzebieniowy FIR miał charakterystykę przypominającą złożenie wielu filtrów środkowozaporowych o wąskim paśmie zaporowym, tak tutaj mamy efekt złożenia wielu filtrów środkowoprzepustowych o wąskim paśmie przepustowym. "Grzebień" ma w tym przypadku ostrza skierowane w górę.
W przypadku filtru rekursywnego, częstotliwości maksimów widmowych są wyznaczone przez położenie biegunów. Interesująco wygląda odpowiedź impulsowa filtru grzebieniowego IIR. Widać na wykresie, że kolejne kopie odpowiedzi impulsowej pojawiają się co $L$ próbek, każda kolejna kopia ma $\alpha$ razy mniejszą amplitudę niż poprzednia, a ponadto faza co drugiej kopii jest odwrócona.
Rekursywny filtr grzebieniowy jest także stosowany w przetwarzaniu dźwięku, umożliwia on uzyskanie efektu wielokrotnego echa (multiple echo).
Filtr Wszechprzepustowy
Filtr wszechprzepustowy (all-pass filter) jest dość nietypowym filtrem, ponieważ jego charakterystyka amplitudowa jest równa jedności w całym zakresie częstotliwości. Zadaniem tego filtru jest natomiast modyfikacja fazy sygnału, bez wpływu na jego amplitudę.
Jeżeli popatrzymy na zamieszczone wcześniej wykresy charakterystyk amplitudowych filtrów grzebieniowych - zwykłego i rekursywnego, zobaczymy że jedna jest odwrotnością drugiej, ich iloczyn jest równy jedności. W istocie, połączenie kaskadowe nierekursywnego i rekursywnego filtru grzebieniowego o tym samym opóźnieniu $L$ i o przeciwnych współczynnikach skalujących $\alpha$, daje filtr wszechprzepustowy.
Rozpatrzmy filtr pierwszego rzędu ($L=1$). Wartość $z_0$ wyznacza położenie bieguna transmitancji, jest ona rzeczywista, natomiast położenie zera transmitancji określa wartość $1 / z_0$. Tak jest zawsze dla filtrów wszechprzepustowych: zera i bieguny tworzą pary, jedno z nich leży wewnątrz okręgu jednostkowego, drugie na zewnątrz, a moduł jednego jest odwrotnością drugiego.
W praktycznych zastosowaniach, chcemy uzyskać filtr wszechprzepustowy, którego zera i bieguny są położone w ściśle określonych miejscach. Jest to filtr IIR drugiego rzędu. Ma on parę zespolonych, sprzężonych biegunów $z_0$ i $z_0^*$ oraz parę zespolonych, sprzężonych zer $1/z_0^*$ i $1/z_0$. Zauważmy, że w liczniku i w mianowniku transmitancji występują dokładnie te same współczynniki, tylko w odwrotnej kolejności.
Charakterystyka fazowa jest podobna do uzyskanej dla poprzedniego filtru wszechprzepustowego, jest jednak przesunięta. Filtry wszechprzepustowe są często łączone kaskadowo z filtrami IIR. Wypadkowa charakterystyka fazowa układu filtrów jest sumą charakterystyk fazowych obu filtrów. Kształtując w odpowiedni sposób charakterystykę fazową filtru wszechprzepustowego, można zniwelować nieliniowość charakterystyki fazowej filtru IIR i w ten sposób uzyskać w przybliżeniu stałe opóźnienie grupowe układu filtrów w paśmie przepustowym. Charakterystyka amplitudowa filtru IIR nie ulega oczywiście zmianie.
Filtry wszechprzepustowe są także stosowane do tworzenia efektów dźwiękowych. Jak wspomniano powyżej, filtr grzebieniowy może być użyty do uzyskania efektu opóźnienia dźwięku, jednak ze względu na "grzebieniową" charakterystykę amplitudową, widmo amplitudowe dźwięku jest zniekształcane. Filtry wszechprzepustowe nie mają tej wady, a również są w stanie uzyskać efekt odbicia dźwięku.
Filtry wszechprzepustowe mogą również posłużyć do budowy układu realizującego rzeczywisty efekt pogłosu (np.
Filtr Hilberta i Sygnał Analityczny
Filtrem Hilberta nazywa się filtr, który dokonuje przesunięcia fazowego sygnału rzeczywistego o wartość $\pi$, czyli o 90 stopni. Sygnał analityczny (analytic signal) jest sygnałem zespolonym, którego część urojona jest równa części rzeczywistej przesuniętej o kąt $\pi$.
Sygnał analityczny ma jedną ważną cechę. Pamiętamy, że widmo sygnału rzeczywistego jest symetryczne, ma ono dwie kopie na "dodatnich i ujemnych" częstotliwościach. Przekształcenie sygnału rzeczywistego w analityczny powoduje, że pozostaje tylko jedna część widma, druga kopia ("nadmiarowa") dla ujemnych częstotliwości (lub, patrząc inaczej, od częstotliwości Nyquista do częstotliwości próbkowania) zostaje wyzerowana.
Filtr Uśredniający - Przykład Implementacji
Filtr uśredniający to jeden z najprostszych rodzajów filtrów cyfrowych. Działa na zasadzie obliczania średniej wartości sygnału w czasie i użycia tej wartości jako nowego sygnału na wyjściu. Jednym z najpopularniejszych typów filtrów uśredniających jest filtr z ruchomą średnią (ang. Moving Average Filter), który oblicza średnią wartość sygnału w określonym oknie czasowym, a następnie przesuwa okno czasowe i ponownie oblicza średnią wartość dla nowych próbek sygnału.
Przedstawiony powyżej wzór zakłada liczenie średniej z M próbek, które były pobrane wcześniej niż aktualnie obliczany sygnał wyjściowy. Jest to najczęściej stosowana forma, chociaż można równie dobrze obliczać średnią tzw. symetryczną, czyli średnią z kilku próbek przed i kilku próbek po obliczanym sygnale wyjściowym.
Zaletą filtru uśredniającego jest jego prostota, łatwość implementacji i niskie wymagania co do mocy obliczeniowej. Jedną z wad filtru uśredniającego jest fakt, że wprowadza on pewne opóźnienie sygnału, co może być niepożądane w niektórych aplikacjach.
Poznaliśmy niezbędną dawkę teorii potrzebną do zrozumienia działania filtru uśredniającego. Znamy jego wady i zalety. Teraz pora na przykład w języku C. Ja filtr uśredniający często stosuję, gdy chcę w szybki sposób przefiltrować dane otrzymane z pomiarów sygnałów analogowych, czyli wyjście z konwertera ADC.
Do dzisiejszego przykładu wykorzystamy mikrokontroler STM32L476RG dostępny w zestawie Nucleo-L476RG. Tworzymy nowy projekt wybierając „File->New->STM32 Project”. Przechodzimy przez wstępną konfigurację projektu i zabieramy się za konfigurację wyjść mikrokontrolera. Ja wygenerowałem projekt z domyślną konfiguracją dla płytki Nucleo, dlatego część pinów mam już skonfigurowane. Do obsługi potencjometru będziemy potrzebowali wejścia analogowego. W tej roli wykorzystamy wejście 5 przetwornika ADC1 (ADC1_IN5) podłączone do pinu PA0.
Teraz możemy przejść do konfiguracji ustawień przetwornika. Konwerter ADC w mikrokontrolerach STM32 to zaawansowany i dość rozbudowany system. Daje nam wiele możliwości, ale co za tym idzie, na początku trudniej jest się odnaleźć w „gąszczu” ustawień. Podstawowym wyborem jest wybór rodzaju konwersji. Mamy do dyspozycji dwa tryby: regularny (regular) i wstrzykiwany (injected). Podstawową różnicą jest to, że tryb wstrzykiwany ma wyższy priorytet i w przypadku wywołania jednoczesnej konwersji na kanale regularnym i wstrzykiwanym, to kanał wstrzykiwany będzie obsłużony w pierwszej kolejności. Poza wyniki konwersji kanałów wstrzykiwanych są przechowywane w indywidualnych rejestrach, a kanałów regularnych w jednym wspólnym rejestrze, który trzeba dostatecznie szybko odczytać, aby nie został nadpisany przez kolejny pomiar.
Ustawienia ogólne ADC (ADC Settings):
- Clock Prescaler - dzielnik zegara taktującego przetwornik. Wyższa wartość spowoduje, że pomiary będą wykonywane wolniej.
- Resolution - rozdzielczość pomiaru (6, 8, 10 lub 12 bitów).
- Data alignment - sposób wyrównania bitów danych w rejestrze wyjściowym (do prawej lub do lewej).
- Scan Conversion Mode - tryb skanowania dostępny w przypadku wykonywania pomiarów na kilku kanałach. Powoduje, że pomiar wykonywany jest na całej grupie kanałów jeden po drugim, czyli po wykonaniu pomiaru na jednym kanale, przetwornik automatycznie wykona pomiar na kolejnym (i tak aż przejdzie wszystkie kanały).
- Continuous Conversion Mode - tryb ciągły pomiarów, umożliwia automatyczne wystartowanie pomiarów na kanale (grupie kanałów) zaraz po ukończeniu poprzedniego.
- Discontinuous Conversion Mode - umożliwia wykonanie pojedynczo pomiarów w grupie.
W naszym przypadku będziemy wykonywali pomiar tylko na jednym kanale. W celu poprawnego skonfigurowania przetwornika wybieramy zatem brak dodatkowego Prescalera, rozdzielczość 12-bitów oraz wyrównanie danych do prawej. Ponieważ mamy tylko jeden pomiar, nie będziemy potrzebowali trybu skanowania. Pomiar ADC będziemy chcieli mieć wywoływany co 10 ms przez timera, dlatego tryb ciągły też nie będzie nam potrzebny. Analogicznie nie potrzebujemy też trybu Discontinuous. W ustawieniach trybu regularnej konwersji, wybieramy zewnętrzne zdarzenie jako Timer 3 Trigger Out Event (czyli przepełnienie od timera 3 - lista dostępnych źródeł przerwań jest dostępna w liście rozwijanej obok parametru External Trigger Conversion Source oraz w dokumentacji „Reference Manual” na stronie 528 w tabeli 108.) oraz zbocze narastające. W ustawieniach pomieru wybieramy kanał 5 (wejście na pinie PA0) oraz najdłuższy czas konwersji, czyli 640,5 cykli, co zapewni nam większą dokładność. Żeby wykorzystać przesyłanie danych za pomocą DMA, w zakładce DMA Settings wybieramy ADC1 i DMA1 Channel 1.
Teraz powinniśmy skonfigurować jeszcze Timer 3 w taki sposób, aby wywoływał nam pomiar na ADC co 10 ms. Wybieramy zatem Timers->TIM3. Aby skonfigurować licznik, musimy odpowiednio ustawić wartości: Prescaler i Counter Period. Potrzebujemy zatem informacji o częstotliwości taktowania Timera 3. Aby Timer mógł generować zdarzenie dla ADC, zaznaczamy jeszcze opcję Trigger Event Selection TRGO jako Update Event.
Jak będzie wyglądał kod dla filtru uśredniającego? Jak już wspominałem na wstępie, funkcja będzie składała się w dwóch operacji. Najpierw musimy przesunąć dane w buforze tak, aby wypadła z niego najstarsza dana, a pojawiła się najnowsza. Potem policzymy średnią z zapisanych w buforze pomiarów. Pierwszą operację możemy wykonać na dwa sposoby. Zgodnie z opisem możemy wszystkie dane w buforze przesunąć o jeden do przodu (tracąc w ten sposób ostatnią, czyli najstarszą daną w buforze) i na początku tablicy wpisać najnowszą daną. Będzie to jednak wymagało za każdym razem wykonania tylu operacji, ile danych w buforze przechowujemy. Znacznie lepszym wyjście będzie zastosowanie bufora kołowego. Dane będziemy dopisywali do bufora, jednocześnie zwiększając zmienną wskazującą na jego koniec. W momencie jak dojdziemy do końca tablicy, wrócimy na jej początek i będziemy nadpisywać najstarszą daną. Przy liczeniu średniej nie ma znaczenia w jakiej kolejności pobierzemy dane z bufora - wynik będzie taki sam. A zaoszczędzimy w ten sposób sporo czasu, ponieważ dodanie nowego pomiaru do bufora będzie polegało jedynie na zapisie jej w tablicy w odpowiednim miejscu.
Na początku musimy zapewnić, że w tablicy nie ma żadnych przypadkowych danych. Dodanie danej do bufora będzie polegało na wpisaniu jej do tablicy w miejsce aktualnego końca bufora oraz zwiększenie licznika. W ten sposób mamy wykonaną pierwszą część zadnia - nowa dana jest w buforze. Teraz pozostało policzyć średnią z pomiarów. Przed rozpoczęciem filtrowania musimy jeszcze stworzyć nasz filtr oraz go zainicjalizować w funkcji main(). W funkcji main() wywołujemy przed pętlą while(1) start pomiaru DMA oraz uruchamiamy Timer. Program gotowy. Czas przejść do sprawdzenia działania filtru.
Oscylacje wartości w przypadku potencjometru nie są bardzo duże, ale bardzo dobrze widać, że pomiar nie jest stabilny. Pomimo tego, że nie dotykam gałki potencjometru, wartości pojedynczych pomiarów różnią się nawet o kilkanaście jednostek ADC. Wynikać to może z wielu rzeczy - słabej jakości przewodów, zbyt długich przewodów lub złego styku. Jak można było się spodziewać, największe oscylacje są widoczne przy filtrze o najmniejszym buforze danych. Mimo wszystko nawet kilkuelementowy filtry potrafi skutecznie wygładzić dane. Długość bufora wpływa jednak nie tylko na jakość filtrowania. Zwiększanie ilości danych branych do liczenia średniej ma niestety także negatywny skutek. Im więcej danych w buforze, tym widoczne jest większe opóźnienie sygnału wyjściowego filtra. Musimy tutaj dobierać wartości w zależności od tego, do czego stosujemy filtr. Jeżeli potrzebujemy przefiltrować np. wartość napięcia z baterii, opóźnienie raczej nie będzie nam przeszkadzało - poziom baterii rzadko kiedy zmienia się szybko. Ale gdy odczytujemy dane np.
W materiale przedstawiłem podstawowe założenia i zasadę działania filtru oraz jego implementację z języku C. Pokazane przykłady filtrowania sygnału potencjometru pokazują zarówno zalety, jak i wady działania prostego, ale jakże przydatnego i często stosowanego filtru uśredniającego.
tags: #filtracja #sygnałów #cyfrowych #zasada #działania

