Mam problem z filtrowaniem.
Jak by to był zwykły sygnał to problemu by nie było.
Rzecz w tym że sygnał może się przewinąć. Chodzi o sygnał z kompasu.
Mianowicie sygnał może się przewinąć z 359 do 0 i z punktu widzenia kąta jest to zmiana o 1* a nie o 359* i nic nadzwyczajnego nie powinno się stać.
Niestety staje się.
Sygnał z kompasu wygląda tak:
Filtruję go zwykłym filtrem IIR 2-giego rzędu.
Kompas ma rozdzielczość 1* i szumi mało. Ale ze względu na małą częstotliwość wykonywania pomiarów oraz dużą częstotliwość wyświetlania wskaźnika kompasu na LCD (w postaci graficznej) następowały gwałtowne skoki wskaźnika.
Filtrowanie pomogło je usunąć.
Wskaźnik normalnie płynie mimo że kompas daje wyniki powiedzmy wzrastające co raz o 10*. Normalnie miodzio dla oczu.
Ale pojawia się problem przy przejściu z wartości 359 na 0.
Mianowicie filtr IIR robi z tego coś takiego:
Pomiędzy 359* a 0* wskaźnik powinien się po prostu przesunąć o jeden pixel, tak jak na przykład robi to pomiędzy 222* a 223*.
Ale niestety dla filtru jest to zmiana o 359* i filtr robi z tego taki przebieg jak widać.
Na ekranie wskaźnik po prostu robi obrót o 359* przeciwnie do pierwotnego kierunku ruchu aby przejść z wartości 359 do 0*. Tak samo oczywiście jak przechodzi z 0 na 359.
Chciałbym zatem uzyskać taki efekt filtrowania:
Czyli tak żeby zmiana z 359 na 0 następowała szybko, tak jak na przykład z 222 na 223.
No i nie wiem jak.
Mam taki pomysł żeby poprzesuwać fazy powiedzmy o 60* i zrobić 6 filtrów. Gdy jeden będzie przechodził przez z 359 na 0 to drugi z 59 na 60, trzeci ze 119 na 120 itd. Czyli tylko jeden będzie robił błąd.
Na koniec oczywiście będzie przywracanie fazy i sumowanie.
Filtrowanie będzie o wiele lepsze ale nadal będzie problem, tyle że teraz już w 6-ciu punktach.
Całkowicie można by wyeliminować ten problem stosując 360 filtrów. Jakiś błąd może by był, ale stały niezależny od aktualnie filtrowanej wartości.
Tylko czy 360 filtrów to nie jest przegięcie?
Drugi pomysł taki żeby przy przechodzeniu głównej wartości z 359 na 0 inną wartość zwiększać na 360. I filtrować tą druga wartość.
Po filtrowaniu odzyskiwać kąt (liczyć resztę z dzielenia przez 360).
Ale po kilku obrotach ta druga zmienna miała by już jakąś dużą wartość.
A może jest jakiś gotowy filtr który to realizuje? Nie wiem nawet jak to nazwać. Ma to jakąś nazwę (filtr który to zrealizuje)? Sam bym poszukał ale jak mam szukać skoro nie wiem co pisać w google?
A może nie ma takiego filtru i trzeba samemu zadbać o to żeby filtr nie wariował, po prostu wyłączając filtr przy zbliżaniu się do wartości 359?
No więc proszę o jakieś wskazówki i z góry dziękuję.
Jak by to był zwykły sygnał to problemu by nie było.
Rzecz w tym że sygnał może się przewinąć. Chodzi o sygnał z kompasu.
Mianowicie sygnał może się przewinąć z 359 do 0 i z punktu widzenia kąta jest to zmiana o 1* a nie o 359* i nic nadzwyczajnego nie powinno się stać.
Niestety staje się.
Sygnał z kompasu wygląda tak:
Filtruję go zwykłym filtrem IIR 2-giego rzędu.
Kompas ma rozdzielczość 1* i szumi mało. Ale ze względu na małą częstotliwość wykonywania pomiarów oraz dużą częstotliwość wyświetlania wskaźnika kompasu na LCD (w postaci graficznej) następowały gwałtowne skoki wskaźnika.
Filtrowanie pomogło je usunąć.
Wskaźnik normalnie płynie mimo że kompas daje wyniki powiedzmy wzrastające co raz o 10*. Normalnie miodzio dla oczu.
Ale pojawia się problem przy przejściu z wartości 359 na 0.
Mianowicie filtr IIR robi z tego coś takiego:
Pomiędzy 359* a 0* wskaźnik powinien się po prostu przesunąć o jeden pixel, tak jak na przykład robi to pomiędzy 222* a 223*.
Ale niestety dla filtru jest to zmiana o 359* i filtr robi z tego taki przebieg jak widać.
Na ekranie wskaźnik po prostu robi obrót o 359* przeciwnie do pierwotnego kierunku ruchu aby przejść z wartości 359 do 0*. Tak samo oczywiście jak przechodzi z 0 na 359.
Chciałbym zatem uzyskać taki efekt filtrowania:
Czyli tak żeby zmiana z 359 na 0 następowała szybko, tak jak na przykład z 222 na 223.
No i nie wiem jak.
Mam taki pomysł żeby poprzesuwać fazy powiedzmy o 60* i zrobić 6 filtrów. Gdy jeden będzie przechodził przez z 359 na 0 to drugi z 59 na 60, trzeci ze 119 na 120 itd. Czyli tylko jeden będzie robił błąd.
Na koniec oczywiście będzie przywracanie fazy i sumowanie.
Filtrowanie będzie o wiele lepsze ale nadal będzie problem, tyle że teraz już w 6-ciu punktach.
Całkowicie można by wyeliminować ten problem stosując 360 filtrów. Jakiś błąd może by był, ale stały niezależny od aktualnie filtrowanej wartości.
Tylko czy 360 filtrów to nie jest przegięcie?
Drugi pomysł taki żeby przy przechodzeniu głównej wartości z 359 na 0 inną wartość zwiększać na 360. I filtrować tą druga wartość.
Po filtrowaniu odzyskiwać kąt (liczyć resztę z dzielenia przez 360).
Ale po kilku obrotach ta druga zmienna miała by już jakąś dużą wartość.
A może jest jakiś gotowy filtr który to realizuje? Nie wiem nawet jak to nazwać. Ma to jakąś nazwę (filtr który to zrealizuje)? Sam bym poszukał ale jak mam szukać skoro nie wiem co pisać w google?
A może nie ma takiego filtru i trzeba samemu zadbać o to żeby filtr nie wariował, po prostu wyłączając filtr przy zbliżaniu się do wartości 359?
No więc proszę o jakieś wskazówki i z góry dziękuję.