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



Teraz jest 7 kwi 2026, o 10:56


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 28 paź 2015, o 08:37 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Witam szanownych Forumowiczów,

nie do końca wiedziałem gdzie wstawić ten wątek, bo trąca troszkę działem rybnym ale mimo wszystko bardziej chodzi mi o nauczenie się rozwiązywania podobnych zagadnień niż o gotowca.

Mianowicie posiadam wykres funkcji pewnej wielkości fizycznej zmierzonej przetwornikiem ADC. Jest to kilkadziesiąt punktów, które jak widać "słabo" dopasowują się do funkcji liniowej. Teraz to co chciałbym zrobić to wyliczać wartość "Y" dla dowolnej wartości "X" (odczyt z ADC).
Nie bardzo wiem jak się za to zabrać. Domyślam się, że dane, które już posiadam (punkty z wykresu) wrzucam sobie do tablicy. Tylko teraz nie wiem jak obliczać wartości, wypadające pomiędzy tymi punktami.



Obrazek

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 08:42 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

Wrzuć te dane do excela, aproksymuj wielomianem, później otrzymany wzór przepisz na język C tylko tak żeby nie używać floatów i już.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 08:49 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Już tak próbowałem robić i nawet to przynosi spodziewane efekty ale tak się chyba nie robi, a poza tym docelowo chciałbym aby cała taka procedura odbywała się w locie, tzn: urządzenie na etapie - nazwijmy to - kalibracji zbiera takich kilkadziesiąt punktów, zapisuje je sobie. Od tego momentu zaczyna działać normalnie czyli wykonuje pomiar i odczytaną wartość ma przeliczyć zgodnie z taka funkcją. Chodzi o to, że to nie wiadomo z góry jakie to będą przebiegi czyli odpada przeliczanie tego na piechotę i kompilacja z gotowym wzorem. Oczywiście do testów dokładnie tak to robiłem :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 09:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

No inaczej (chyba ) tego nie zrobisz.
Tzn tak, jeśli chcesz szybko i niedokładnie to robisz f.liniową
Jeśli chcesz w miarę szybko i w miarę dokładnie to aproksymujesz i lecisz f.kwadratową.
Jeśli chcesz wolno i dokładnie to lecisz wielomianem wyższego rzędu.
Inaczej się nie da ;-)

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

Ewentualnie możesz sobie podzielić tę funkcję na kilkanaście przedziałów.
Np co 1000
od 2k do 3k
od 3k do 4k
...
do 6k do 7k

I w każdym z tych przedziałów sotosować inny wzór f.liniowej (to znacznie uprości)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 09:09 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

1. Kalibracja, zbieranie wyników do tablicy
2. Chcesz z wartości X wyliczać Y. Twoja funkcja jest stablicowana czyli jest dyskretna a nie ciągła.
3. Powiedzmy że chcesz mieć wartość Y dla X który nie był stablicowany
4. Patrzysz w jakim przedziale jest Twój X, przedział aproksymujesz funkcją liniową, i wyliczasz swój Y.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 09:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Dokładnie tak jak napisał Nefarious19, który mnie ubiegł.
Zakładasz, że funkcja jest liniowa (lub inna jak chcesz komplikować obliczenia) między dostępnymi punktami które wyszły z pomiaru. Czyli masz funkcję skwantowaną na odcinki łamane:
1: x0 - x1
2: x1 - x2
...
n: xn-1 - xn
I na podstawie potrzebnego Ci xp i dostępnego opisu funkcji (masz dane najbliższych punktów (xp-1, yp-1) (xp+1, yp+1), więc masz wzór funkcji) wyliczysz yp.
Tylko pamiętaj stosuj / przechowuj dane jako wielokrotność np. 1000, dzięki czemu będziesz miał liczby całkowite a przy okazji zachowasz dokładność przy wyliczaniu.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 11:27 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

Dokładnie tak myślałem jak Nefarious19 i rskup pisali wyżej. Tylko muszę pomyśleć jak badać pomiędzy którymi dwoma punktami leży moja zmierzona wartość. Punkty każdej funkcji są równo rozłożone więc obliczenia będą troszeczkę prostsze.
Czyli mogę się wziąć za kod :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 12:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak będziesz miał próbki x co 4, 8 , 16, ... to będzie ci bardzo łatwo.
Jak na przykład zrobisz próbki co 8 to wystarczy:
Kod:
xp >> 3
i masz wskazany index próbki :)

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 15:43 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 113
Pomógł: 1

No niestety próbki to różnie mogą wyglądać. Np co 20, 50, 200 itp. Ale ułożą się w kolejności od najmniejszej do największej i tak będą zapisane do tablicy więc będę operował na elementach tablicy.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak masz losowe odstępy to już zostaje przeszukiwanie tablicy. Przy małej ilości wartości x w tablicy możesz lecieć po kolei od pierwszego o ostatniego i sprawdzać czy akurat nie trafiłeś na przekraczanie mniejszej na większą wartość w porównaniu z twoją próbką. Ale przy dużej tablicy to zrób raczej "inteligentne" wyszukiwanie, np. metodą połówkową (dzielisz tablicę na pół i sprawdzasz czy środkowy element jest w większy czy mniejszy (w górnej czy dolnej połowie) od twojej wartości, następnie dzielisz wybraną połowę na pół i znowu sprawdzasz, itd ..).

--
Pozdrawiam,
Robert



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: 10 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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