Zahlenreihe und Formel

Gast #2396036
Lesenswert?

Hi,

habe diese Zahlenreihe:

index    wert
(pwm)    (Helligkeit in klx)
0  2,1
16  2,3
32  2,7
48  3,1
64  3,6
80  4,3
96  5,1
112  6,2
128  7,6
144  9,5
160  11,9
176  14,9
192  18,1
208  19,3
224  19,4
240  19,5
255  19,6

und suche dazu eine Formel zu linearisierung.

Wie bekomme ich das mit Ganzzahlen (kein Float/Kommazahl) möglichst 
gerade?

Habt Ihr einen Tip?

T.S.
Gast #2396165
Lesenswert?

..werde ich gleich mal testen.

ich habe das jetzt noch mal genau anders herum aufgezogen, die 
Helligkeiten linear eingestellt und die zugehörigen PWM Werte ermittelt:


%   Helligkeit Wert
10  2,1        0
15  3,15       42
20  4,2        73
25  5,25       95
30  6,3        111
35  7,35       123
40  8,4        130
45  9,45       139
50  10,5       145
55  11,55      152
60  12,6       158
65  13,65      166
70  14,7       171
75  15,75      174
80  16,8       178
85  17,85      183
90  18,9       188
95  19,95      195
100 21         255

Das ist gerade am Ende scheiße krumm!

T.
Angehängte Dateien:
Gast #2396230
Lesenswert?

T.S. schrieb:
> Das ist gerade am Ende scheiße krumm!

Und deswegen ist es Blödsinn im Quadrat das zu linearisieren.

Joe schrieb:
> Aus dem ersten Bild kann man entnehmen, dass eine! kubische Funktion zur
> Linearisierung ausreicht.

Klar, statt einfach ein Array von 256 Werten einmal zu füllen macht man 
eine kubische Gleichung, die auch noch in (8Bit!) für jeden Wert 
berechnet werden soll.

Leute schießt ihr eigentlich immer mit Terawattlaser auf Mücken?????
Persönliche Seite #2396233
Lesenswert?

Hallo,

Den oberen Bereich kannst Du ruhig ausblenden, weil sich in 55 PWM-Steps 
im Ergenbis (Helligkeit) praktisch nichts mehr tut.

Das Reduziert natuerlich Deine Gesamtaufloesung.

Natuerlich waere das Beste ein LUT ggf. mit Linearisierung der 
Zwischenwerte...ein Klacks fuer den geuebten Programmer.


Solltest Du wirklich rechnen wollen, so stimmt diese Formel auf <1% (bis 
eben PWM = 200):

Hellikeit = (0.0000241864 x^3  +  -0.00150436 x^2  +  0.237658x + 
20.3846)/10



Gruss

Michael
Gast #2396235
Lesenswert?

Kommt drauf an, was Du mit Linearisierung meinst.
Also, ich verstehe darunter einfach ein Polynom 1. Ordnung
Wenn Du annimmst, das Deine Wertepaare diesem Zusammenhang gehorchen, 
kannst Du die beiden Parameter
beispielsweise über einen Least-Squares-Schätzer-Ansatz aus den 
gemessenen Werten schätzen.

Für mehr Hintergrund zum LS_Schätzer bspw. das hier:
http://books.google.de/books?id=tYCJ4ZEGhsMC&printsec=frontcover&dq=kiencke&hl=de&ei=yUioTqGUHIfc4QSwtL3tDw&sa=X&oi=book_result&ct=result&resnum=5&ved=0CEUQ6AEwBA#v=onepage&q&f=false
(Seiten 18 und 19)
Gast #2396297
Lesenswert?

Hey,

ich habe jetzt mal das hier:

X         Y
10        0
15        42
20        73
25        95
30        111
35        123
40        130
45        139
50        145
55        152
60        158
65        166
70        171
75        174
80        178
85        183
90        188
95        195
100       255

Bei:

http://www.arndt-bruenner.de/mathe/scripts/kubspline.htm#rechner

eingegeben, und das ist seitenweise was dabei raus kommt, unmögliche 
Zahlen.

@Michael:

da hast du recht, ich könnte aber auch die Werte bis 95% linearisieren 
und von 96 bis 100 dann dran hängen.

Was ist in deiner Formel X?


Ich möchte im Controller eine %-Zahl zwischen 10 und 100 angeben und 
einen PWM Wert entsprechend oben stehender y Werte raus bekommen.

Habe auch diese Formel:

pwm = 102*klx/7 - 30 (genau)

von Captain Subtext getestet, allerdings wollte ich die Helligkeit im 
Controller nicht in klx sondern in % angeben :-). Aber so eine Gleichung 
in der Form ist das was am besten machbar wäre.

Vielen Dank für die zahlreichen Antworten bis hierher. Ich hoffe es 
findet sich eine gute Lösung.

Gruß,
T.
Gast #2396368
Lesenswert?

Lothar Miller schrieb:
> Ich würde (wie schon mal vorgeschlagen) eine 16 Punkte Tabelle machen
> und zwischen den Stützpunkten linear interpolieren. Das geht ganz ohne
> großartige Mathematik.

Hallo Lothar,
Ich habe so langsam den Eindruck, daß der Gute mit der interpolation 
zwischen 2 Punkten schon etwas überfordert ist:

T.S. schrieb:
>>>Alternativ machst du halt nur 8 oder 16 Stützstellen und dazwischen eine
>>>Gerade.
>
> Plan B.
> wie bekomme ich au Excel diese Formel raus?
> T.

Sorry, aber das kaue ich ihm nicht vor. Er soll einfach mal merken daß 
Mathe in der 8. Klasse doch nicht fürn Arsch war :-))
#2396383
Lesenswert?

T.S. schrieb:
> ...kenne ich, das ist ein ähnliches Problem, aber leider ist dort nicht
> zu sehen wie die Lösung ermittelt wurde...
>
> @Captain Subtext
> Wie kommt man denn mit der 2 Punkteform einer Geraden auf so eine
> annäherung?
>
> Irgendwas stimmt mit deiner Formel:
>
> 102*klx/7 - 30
>
> nicht, von wo nach wo rechnet sie denn um?
>
> Danke trotzdem,
> T.

Sie rechnet vom Startpunkt (2,1) zum _Endpunkt(19,6), allerdings habe 
ich die entstehenden Werte gerundet.

Eine Tabelle ist wohl die beste Lösung.
Gast #2396431
Lesenswert?

Hallo,

@UR Schmitt
immer locker bleiben, ich würde das lieber als Formel einsetzen wenn 
möglich. Deswegen konzentriere ich mich etwas mehr dahingehend. Die 
Interpolation wäre nicht das Problem. Spontan habe ich zwar keine Idee 
wie ich schnell den passenden Index ermittle. Würde mich ungern in einem 
if-else Grab verlieren.

1) den index der darunter und darüber liegenden Stützstelle ermitteln. 
Hier würde ich warscheinlich ohne zu teilen nicht zum Ziel kommen, mir 
schwebt immer die Modulo Funktion vor Augen...

2) linear interpolieren...Beispiel:

17%

Stützstelle bei 15% = 42, bei 20% = 73.

73-42=31

31/5*(17%-15%)=12,4

42+12,4=54,2

Aber wie gesagt lieber als kurze integer Formel.

Die 100% weg zu lassen ist eine gute Sache. Dennoch frage ich mich wie 
man auf die Formeln kommt.

@Captain Subtext

Ich habe die Formel mal auf meine Messwerte angewandt:
klx      Ergebnis
2,1      0,6
2,3      3,514285714
2,7      9,342857143
3,1      15,17142857
3,6      22,45714286
4,3      32,65714286
5,1      44,31428571
6,2      60,34285714
7,6      80,74285714
9,5      108,4285714
11,9     143,4
14,9     187,1142857
18,1     233,7428571
19,3     251,2285714
19,4     252,6857143
19,5     254,1428571
19,6     255,6

Das ist dann aber genauso krumm. Zumal ich ja von % nach PWM will:

Beitrag "Re: Zahlenreihe und Formel"

Kannst du mir sagen wie du auf diese Form

102*klx/7 - 30

kommst?

Gruß,
T.
Gast #2396467
Lesenswert?

T.S. schrieb:
> Hey,
>
> ich habe jetzt mal das hier:
>
> X         Y
> 10        0
> 15        42
> 20        73
> 25        95
> 30        111
> 35        123
> 40        130
> 45        139
> 50        145
> 55        152
> 60        158
> 65        166
> 70        171
> 75        174
> 80        178
> 85        183
> 90        188
> 95        195
> 100       255
>
> Bei:
>
> http://www.arndt-bruenner.de/mathe/scripts/kubspli...
>
> eingegeben, und das ist seitenweise was dabei raus kommt, unmögliche
> Zahlen.

Ich habe diese unmöglichen Zahlen mal in ein (Libre) Office Dokument 
eingefügt und berechnet.

Hab es auch mit Rechnen in C versucht, aber das braucht auf jeden Fall 
mehr Speicher als die 91 byte die Du für die Tabelle
(siehe Tabelle: c freundlich) benötigst.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2396482
Lesenswert?

T.S. schrieb:
> Spontan habe ich zwar keine Idee wie ich schnell den passenden Index
> ermittle. Würde mich ungern in einem if-else Grab verlieren.
Der wichtigste Trick dabei ist, die Tabelle äquidistant aufzubauen. Und 
zwar willst du eine Helligkeit und suchst einen PWM-Wert dafür. Du 
teilst also den Bereich zwischen zwischen min. und max. Helligkeit in 16 
lineare Stufen (du hast also 17 Tabellenwerte: das ist wie bei Zäunen 
mit den Pfählen. Du brauchst einen Pfahl mehr als du Zaunfelder hast) 
und suchst die passenden PWM-Werte dafür. Und jetzt nimmst du von einem 
8-Bit Wert für die gewünschte Helligkeit die oberen 4 Bit zur Auswahl 
des "Blocks" und die unteren 4 Bit für die Gewichtung zwischen den 
beiden Stützwerten. Und weil die Werte so geschickt gewählt wurden, ist 
nach Aufsummierung nur ein 4er-Shift und keine Division nötig.

Also, nehmen wir mal diese Werte:
1
// Stuetzpunkttabelle
2
uint8_t sp[17] = {7,23,45,56,78,89,100,115,145,167,179,182,200,210,220,230,255};
3

4
uint8_t h; // Helligkeit 0..255 
5
uint8_t p; // PWM-Wert
6
uint16_t tmp // Hilfvariable
Dann gibt das zusammen mit dieser Formel den passenden Wert:
1
        // Gewichtung sp "links"    + Gewichtung sp "rechts"
2
  tmp = ( sp[(h>>4)&0xf]*(16-h&0xf) + sp[((h>>4)&0xf)+1]*(h&0xf) );
3
  pwm <= tmp/16;
Gast #2396492
Lesenswert?

Danke für die Ausführung. Das bedeutet ich müsste diese Formeln die auch 
noch unendlich viele Floats enthalten alle in den Code einbauen!?

Ich habe hier nun durch Spielerei:

100/-X*12+X+110

am Start.

Liefert das (siehe Anhang).

Aber es ist noch nicht ganz perfekt, zumal durch negative Zahlen geteilt 
wird....

T.
Angehängte Dateien:
Gast #2396504
Lesenswert?

@Lothar Miller

danke für deine Ausführung. Ich habe schon vermutet dass du bei 16 
Abschnitten die oberen 4 Bit verwenden willst, aber wenn ich von 0-100% 
angeben will, müsste ich erst linear von 0-100 auf 0-255 umrechnen, das 
wäre in Kombination mit dem Trick die oberen 4 Bit zu nehmen, schon mal 
ein weiterer Trick um die if-else Geschichte zu umgehen.

Deine Formel muss ich erstmal in ruhe ansehen, vielen Dank dafür. Sieht 
auf jeden Fall nach recht wenig Code aus :-)

Gruß,
T.
Gast #2396645
Lesenswert?

..so gehe jetzt erstmal in Bett.

Ich habe die Formel:

Beitrag "Re: Zahlenreihe und Formel"

die etwas darunter lag genommen, da es sonst ab 80% wirklich fehlte.

Es ist nicht ganz linear, aber schon sehr gut zu sehen :-)

Die Formel ist erstmal so eingebracht:

return (  (100/((int16_t)percent*(-1))*12)  +percent+110);

Ich bin weiterhin für jeden Tip dankbar.

T.
Angehängte Dateien:
Persönliche Seite #2396719
Lesenswert?

Wenn dir das noch nicht reicht, dann nimm eines der Tools im Internet. 
Du brauchst allerdings einen, der dir verschiedene Grundfunktionen zur 
Auswahl anbietet und auch selbst optimiert. Also insbesondere die 
Wertepaare nicht fix an eine Stelle knallen will.

Stichworte wären: curve fitter online

Hier einer:
http://statpages.org/nonlin.html

Meinen Liebling finde ich auf die Schnelle gerade nicht. Hm, lange her. 
Ich glaube der ist es:
http://zunzun.com/

Ist etwas komisch in der Bedienung, aber extrem leistungsfähig.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren