Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 kwi 2024, o 22:03


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 15 paź 2017, o 15:56 
Offline
Nowy

Dołączył(a): 15 paź 2017
Posty: 5
Pomógł: 0

Witam,

Ogladalem poradnik, ktore opisuje zasade dzialania filtru dolnoprzepustowego. Zauwazylem, ze on dziala ono wiele lepiej niz zwykle usrednianie danych. Jednak nie rozumiem tego algorytmu, tzn. probowalem go rozpisac i wychodza mi glupoty. Bardzo prosze o weryfikacje mojego myslenia.
https://www.youtube.com/watch?v=LtLdMRG ... e=youtu.be

Mamy 4 probeki:
105, 110, 100, 105 - chce na tych probkach zrobic filtrowanie

czyli

wzor:
sr = sr * dt
sr = sr + wynik
sr = sr /(dt+1)

1) obieg petli: (zmienna srednia =0, dt = 4)
sr = 0 * 4 = 0
sr = 0 + 105
sr = 105 /5 = 21

2) obieg petli: (srednia = 21, dt = 4)
sr = 21 * 4 = 84
sr = 84 + 110 = 194
sr = 194 / 5 = 38,8

3) obieg petli : (srednia = 38,8, dt = 4)
sr = 38,8 * 4 = 155,2
sr = 155 + 100 = 255
sr = 51,04

4) obieg petli : (srednia = 51,04, dt =4 )
sr = 51,04 * 4 = 204,16
sr = 204,0 + 105 = 309
sr = 61,8

....
dlaczego srednia wynosi okolo 62? a nie jest w poblizu wartosci sredniej ~ 104?
(105, 110, 100, 105) / 4 = 105

Chcialem wykorzystac ten algorytm do uspokojenia pomiarow od ADCka. Chcialem nim zastapic srednia, ktora licze z 64 probek. Gdzie popelniam blad w mysleniu? Ogolnie rzecz biorac mierze sygnal w 100 roznych punktach. Kazdy punkt pomiarowy mierze 64razy i usredniam. Z czyli z 100 usrednien rysuje wykres. Nie jestem zadowolony z wynikow, gdyz zamiast liniowej zaleznosci, mam czasem falujaca krzywa. Chcialem troche polepszyc rysowanie poprzez zastosowanie tego filtru.. Czyli dla 64 pomiarow, tej samej wartosci chcialem wykorzystac ten algorytm, zamiast usredniania.

W skrocie:
100 zmieniam napiecie na aktuatorze o 5mV, czyli od 0-500mV. Mierze odpowiedz aktuatora, jego prad jest proporcjonalny do zadanego napiecia. Dla 5mV mam 5mA, dla 10mV mam 10mA.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 16:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zamiast tego wzoru:
sr = sr * dt
sr = sr + wynik
sr = sr /(dt+1)
użyj:
sr = sr * dt
sr = sr + wynik
sr = sr / dt

Teraz mamy:
1) obieg pętli: (wynik = 105, srednia = 0, dt = 4)
sr = 0 * 4 = 0
sr = 0 + 105 = 105
sr = 105 /4 = 26

2) obieg pętli: (wynik = 110, srednia = 26, dt = 4)
sr = 26 * 4 = 104
sr = 104 + 110 = 214
sr = 214 / 4 = 53

3) obieg pętli : (wynik = 100, srednia = 53, dt = 4)
sr = 53 * 4 = 212
sr = 212 + 100 = 312
sr = 312 / 4 = 78

4) obieg pętli : (wynik = 105, srednia = 78, dt = 4 )
sr = 78 * 4 = 312
sr = 312 + 105 = 417
sr = 417 / 4 = 104



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 17:35 
Offline
Nowy

Dołączył(a): 15 paź 2017
Posty: 5
Pomógł: 0

Dzieki za odpowiedz. Dlaczego bez dt+1 ? To jest srednia ruchoma?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 17:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2013
Posty: 45
Pomógł: 2

Bez tego sr = sr /(dt+1) średnia nigdy nie osiągnie wartości maxymalnej. Czyli jak będziesz cały czas podawał 105 to uśredniony wynik zawsze pokaże 104



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 18:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

anshar napisał(a):
Zamiast tego wzoru:
sr = sr * dt
sr = sr + wynik
sr = sr /(dt+1)
użyj:
sr = sr * dt
sr = sr + wynik
sr = sr / dt


to niestety nie jest dobry pomysł

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 18:35 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

karbiuch napisał(a):
dlaczego srednia wynosi okolo 62? a nie jest w poblizu wartosci sredniej ~ 104?
(105, 110, 100, 105) / 4 = 105

Chyba trochę źle to zrozumiałeś ;)
Należy przyjąć, iż uśrednianie ma zastąpić filtr RC. Stała czasowa filtru RC to czas, w którym napięcie na kondensatorze (po podaniu na filtr napięcia stałego) osiągnie wartość 63,2% napięcia zasilającego taki filtr (https://pl.wikipedia.org/wiki/Uk%C5%82ad_RC). Czyli jesteś blisko ;)

Wartość zbliżoną do napięcia zasilającego, przy założeniu utrzymania cały czas tej samej wartości napięcia, możesz uzyskać po 30-40 pomiarach (w zależności od tego, jaka różnica jest akceptowalna). Na przykład przy utrzymaniu wartości 105, po 40 pomiarach powinieneś uzyskać wartość średnią ok. 104,98 (po 30 - 104,84).

_________________
AVR-GCC - dane w pamięci FLASH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 18:39 
Offline
Użytkownik

Dołączył(a): 28 wrz 2016
Posty: 215
Pomógł: 14

anshar napisał(a):
sr = sr * dt
sr = sr + wynik
sr = sr /(dt+1)

To jest człon inercyjny o stałej czasowej T równej około 4t, gdzie t to okres między próbkami.
Lub też filtr dolnoprzepustowy pierwszego rzędu o częstotliwości granicznej równej 1/2*pi*T (0,04 1/t).
Po 1 stałej czasowej (czyli po 4 próbkach) osiągnie on 63% wartości ustalonej.
Po 2 stałych czasowych (czyli po 8 próbkach) osiągnie on 86% wartości ustalonej.
Po 4 stałych czasowych (czyli po 16 próbkach) osiągnie on 98% wartości ustalonej.
Czyli wszystko się zgadza, nalezy tylko dać trochę wiecej czasu (próbek), na dojście inercji do stanu ustalonego.

_________________
de gustibus non est disputandum



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 18:40 
Offline
Nowy

Dołączył(a): 15 paź 2017
Posty: 5
Pomógł: 0

Yyy,.. jeszcze raz, ale tak dla prostych ludzi. Na razie nie probkuje rzeczywistego sygnalu, tylko siedze w excelu.

Zalozmy, ze mam 8 probek sygnalu, ktore maja mi pomoc w tym, ze ADC nie lata gora/dol. Rozumiem, ze w takim wypadku lepiej zastosowac zwykle usrednianie? Ewentualnie rozszerzyc do 16 probek, i wtedy stala czasowa bedzie rzedu 98%?

Czy moze zamiast tego zrobic cos takiego, zmierzyc 8 probek sygnalu, odrzucic 3 skrajne, a usrednic 5 probek? Dzieki temu jezeli wpadnie mi jakis pik, to nie zaburze wartoci sredniej?

Ogolnie rzecz biorac chcialbym "poswiecic" 16 probek, tak aby wyeliminowac szumy/zaklocenia i pozbyc sie latania przetwornika. Jak to zrobic najrozsadniej? Wg mnie liczenie samej sredniej jest bez sensu, bo to nie jest odporne na pojedyncze zaklocenia.

Z tego wynika, ze ten filtr sens tylko wtedy jezeli ciagle mierzmy sygnal. Natomiast jezeli wrzuce to do petli, ktora wykonuje sie N-niewiele razy to mija sie to z celem? Znacie jakas ksiazke gdzie sa fajnie rozpisane i wytlumaczone takie algorytmy? Temat niesamowicie ciekawy!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 19:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

mirekk36 napisał(a):
to niestety nie jest dobry pomysł

Zgadza się. Mój błąd.

W ramach pokuty zrobiłem małą symulację i faktycznie wszystko pięknie działa, ale tylko dla zmiennych typu float. Dla zmiennych typu int niestety nigdy nie uzyskamy prawidłowego wyniku.

Wklejcie ten kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

na przykład tutaj http://rextester.com/l/c_online_compiler_gcc

------------------------ [ Dodano po: 4 minutach ]

Aby działało poprawnie również dla zmiennych typu int proponuję takie małe oszustwo:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Co Wy na to?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 19:43 
Offline
Nowy

Dołączył(a): 15 paź 2017
Posty: 5
Pomógł: 0

To nie ma sensu. Przeciez od probki 5 do 100 Twoj wynik = 105. Czyli 95 probek ma wartosc 105. Przy takim sygnale cos kolwiek bys zrobil bylo by dobrze. 95% Twoich srednich ma wartosc 101, a sygnal ma wartosc 105.

Wez dodaj losowy szum do wartosc 105 i wtedy dopiero to przetestuj. Np. losowo niech dodaje wartosci +-3 do kolejnych probek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 19:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

No właśnie, że nie jest dobrze, sprawdź proszę. Wlej ten kod, ale ten pierwszy i zobacz co się dzieje, jaką otrzymujemy wartość zmiennej sr?

------------------------ [ Dodano po: 1 minucie ]

No właśnie dlaczego otrzymujemy 101 skoro większość próbek ma wartość 105?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 19:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2013
Posty: 45
Pomógł: 2

Cytuj:
Czy moze zamiast tego zrobic cos takiego, zmierzyc 8 probek sygnalu, odrzucic 3 skrajne, a usrednic 5 probek? Dzieki temu jezeli wpadnie mi jakis pik, to nie zaburze wartoci sredniej?

Tak też można. Nazywa się to średnia mediana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 20:02 
Offline
Użytkownik

Dołączył(a): 05 wrz 2017
Posty: 169
Pomógł: 31

Cyfrowa filtracja sygnałów jest względnie złożonym zagadnieniem. Z tego co pamiętam to projektowanie filtra dyskretnego jest podzielone na następujące kroki:
1. Określenie częstotliwości próbkowania przetwornika i częstotliwości sygnału próbkowanego (czy sygnał da się próbkować twierdzenie Shanona Kotelnikova)
2. Zaprojektowanie analogowego filtra
3. Wyznaczenie transmitancji filtra analogowego
4. Dyskretyzacja układu analogowego
5. Zbadanie zapasu stabilności układu (charakterystyki Bodego)

Przykładowo mogę podać równania dla dolnoprzepustowego filtra Czybyszewa I rodzaju o parametrach:
    pasmo przenoszenia Fpass = 0-10 [Hz]
    tłumienie w pasmie przenoszenia Apass= 0.2 [dB]
    tłumienie przy częstotliwości granicznej Fstop = 80 [Hz] równe 50 [dB].
    próbkowanie fp = 760 [Hz]
    częstotliwość sygnału próbkowanego fs = 50 [Hz]

<Pominę tu wyprowadzenie całości>

Jako wynik otrzymałem filtr 3 rzędu składający się z dwóch sekcji (filtr SOI):

Sekcja I
wy(n)= 0.0023339 we(n) + 1.925625 wy(n−1) + 0.0046678 we (n−1) − 0.934961 wy(n−2) + 0.0023339 we(n−2)

Sekcja II
wy(n)= 0.03259526 we(n) + 0.934809 wy(n−1)+0.03259526 we(n−1)

wy(n) - wynik pracy filtra z aktualną próbką (najnowszą)
wy(n-1) - wynik pracy filtra z poprzednią próbką
wy(n-2) - wynik pracy filtra z jeszcze wcześniejszą próbką
we(n) - najnowsza próbka ADC
we(n-1) - poprzednia próbka z ADC
we(n-2) - jeszcze wcześniejsza próbka z ADC

Wynik sekcji I jest sygnałem wejściowym dla sekcji II

Tu charakterystyki Bodego:
Obrazek

zapas wzmocnienia Δk wynosi -160[dB]
zapas fazy Δϕ = 34,2[°]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 20:08 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

anshar napisał(a):
            sr = sr * dt;
            sr = sr + wynik + dt; //tutaj zaszła zmiana
            sr = sr / (dt + 1);


proponuję spojrzeć na pewien sposób uzyskiwania lepszego zaokrąglania przy dzieleniu liczb całkowitych tutaj na blogu ;) też o tym było przecież

http://mirekk36.blogspot.com/2013/01/rs ... trick.html

i wtedy bez żadnego jak mówisz "małego oszustwa" ;) damy radę - zobacz o tak:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ładne zaokrąglanie w górę wyniku dzielenia całkowitego

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 20:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

mirekk36 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ładne zaokrąglanie w górę wyniku dzielenia całkowitego


Zgadza się! ;)
Chociaż dużo lepiej będzie działało z 0.5 zamiast 0.9 no ale wiemy o co chodzi! :D

------------------------ [ Dodano po: 2 minutach ]

Może się komuś przyda do testów.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 20:27 
Offline
Nowy

Dołączył(a): 15 paź 2017
Posty: 5
Pomógł: 0

Okej, teraz to sie duzo wyjasnilo. Wniosek prosty. W moim przypadku gdzie mam praktycznie staly sygnal, ktore jest zaszumiony i okazjonalnie pojawia sie pik najlepiej bedzie.

Wykonac 8 pomiarow, usunac 2x MAX i 2 MIN, obliczyc srednia z 4 pomiarow.
Nastepnie 4 razy powtorzyc ta czynnosc. I ze sredniej policzyc srednia. Wtedy mam pewnosc, ze sygnal jest w miare okej. Operuje na 32 probkach, czyli wywalam 16 probek, a z 16 licze srednia.

Jak zrobile filtr na 32 probkach to mam gorszy efekt. Dzieki za pomoc. Troche mnie to dzwilo, ale tak to wychodzi.

Chyba, ze ktos ma lepszy pomysl ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO