PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie kann man wertetabellen interpolieren?



xxrider
19.06.2006, 21:53
es gibt in bascom ja die funktion lookup.
hier wird ein (x-)wert einem (y-) wert zugewiesen und ausgegeben.
meine frage:
wie kann ich zwischenwerte interpolieren?
d.h. ich möchte für einen (Mess)wert der zwischen 2 x-werten der lookup Tabelle liegt, einen interpolierten y-Wert ausgeben.
wie geht das am einfachsten in bascom?

gruß
holger

Dirk
20.06.2006, 09:03
Hallo Holger,

1. kann man die Distanz zwischen den Tabellenwerten als linear annehmen. In einer Schleife sucht man die beiden X-Tabellenwerte, zwischen denen der neue X-Wert liegt.
Betrachtet man die Distanz zwischen den beiden Tabellenwerten als 100%, dann kann man errechnen, um wieviel % der neue X-Wert z.B. oberhalb des unteren der beiden Tabellenwerte liegt. Nehmen wir an, dies sei 50%, damit liegt der neue Wert genau in der Mitte des Intervalls.
Um den zugehörigen Y-Wert zu bekommen, sucht man die Y-Werte heraus, die zu dem Intervall gehören. Der neue Y-Wert muss jetzt auch 50% oberhalb des unteren Grenzwerts liegen.

2. kann man versuchen, eine Formel für die Tabellenwerte zu finden. Wenn man Excel hat, geht das damit rel. einfach: Man erstellt eine Tabelle mit den X-/Y-Werten, macht daraus eine Grafik und läßt Excel dazu eine Formel errechnen. Hat bei mir z.B. bei IR-Distanzsensoren ganz gut geklappt.

Gruß Dirk

xxrider
20.06.2006, 21:07
hallo dirk,

zu 1:, das ist klar.
zu 2:, gute idee, aber eine kurve kann ich leider nicht drüberlegen, das hatte ich schon probiert. da passt einfach nichts - weder exponentiell noch logarithmisch usw.

gibt es denn in bascom keine möglichkeit, die interpolation für eine lookup tabelle automatisch durchführen zu lassen?

oder gibt es andere, geeignetere möglichkeiten anstelle von lookup?

holger

Dirk
21.06.2006, 00:43
Hallo Holger,


gibt es denn in bascom keine möglichkeit, die interpolation für eine lookup tabelle automatisch durchführen zu lassen?

... doch, das ist doch die Möglichkeit 1. aus meinem Post!

Hier 'mal ein bißchen Code als Beispiel:


Dim Temp As Byte
Dim Ausgabe As Word , Ausgabe2 As Word
Dim Volt As Single
Dim S As String * 16
Dim Summ As Word
Dim Index As Word , Index2 As Word

'50 ADC-Messungen der geglätteten PWM über 1 Zyklusdauer (max. 101ms):
Summ = 0
For Temp = 1 To 50
Ausgabe = Irdistanz_lv 'ADC0: PWM (DC)
Summ = Summ + Ausgabe
Waitms 2 'alle 2ms
Next Temp
Summ = Summ / 50 '50 Messungen
If Summ < 15 Then Summ = 15

'Anfang der Tabellensuchschleife:
Index = 1
Do
Ausgabe2 = Lookup(index , Adcdata)
If Summ < Ausgabe2 Then
Index2 = Index - 1
Ausgabe = Lookup(index2 , Adcdata)
Volt = Ausgabe2 - Ausgabe
Volt = Volt / 10
Exit Do
End If
Index = Index + 1
Loop Until Index > 36
If Index = 37 Then
Volt = 3599
Else
Ausgabe2 = Summ - Ausgabe
Volt = Volt * Ausgabe2
Ausgabe = Index2 * 10
Volt = Volt + Ausgabe
Volt = Volt * 10
End If
Ausgabe = Volt
Locate 4 , 1
S = Str(ausgabe)
S = Format(s , "000.0")
Lcd "Dpw: " ; S ; " Grad"
')
Waitms 500

Loop

'Programm Ende:

End

'ADC-Messwerte für 0..360 Grad Peilung in 10 Grad-Schritten:
Adcdata:
Data 15% , 30% , 44% , 57% , 71% , 84% , 98% , 110% , 123% , 135% , 147%
Data 158% , 168% , 179% , 190% , 200% , 209% , 219% , 228% , 237% , 246%
Data 255% , 264% , 272% , 280% , 288% , 297% , 305% , 312% , 319% , 327%
Data 334% , 341% , 348% , 355% , 362% , 370%


Da habe ich einen CMPS03 (I2C-Kompass-Modul) nach Glättung der PWM mit einem ADC ausgelesen. (Das ist im Prinzip völlig unnötig, da man ja den I2C-Wert hat! Ich wollte aber 'mal sehen, ob das geht.)
Die Meßwerte stehen in der Tabelle Adcdata:
Der Code findet auch die Zwischenwerte der Tabelle unter der Annahme, dass die Intervalle linear sind. Lass dich nicht durch merkwürdige Variablennamen irritieren, z.B. Volt (wird im Programm auch noch für eine Spannung verwendet).
Es geht um die Suchschleife, wobei ich zugebe, dass sie nicht unbedingt selbsterklärend oder elegant ist. Jedenfalls gibt das Prog abhängig vom ADC-Wert (in Summ, Werte 15..370) die Himmelsrichtung als 0..3599 (dargestellt als 000.0 .. 359.9) aus.
Vielleicht kannst du daraus ja eine eigene Routine für deine Anwendung basteln! Zum Testen der Routine (ohne ADC) kannst du z.B. den Teil mit der "Suchschleife" in eine for...next Schleife von 15 bis 370 (FOR Summ = 15 To 370) tun und dir die Ausgabe auf dem LCD ansehen.

Gruß Dirk

xxrider
21.06.2006, 21:04
danke, den code muss ich mir mal zu gemüte führen (bin bascom-anfänger!)
ich meld mich dann wieder!

gruß
holger

xxrider
23.06.2006, 23:50
also alles bestens, dein code hat mir sehr geholfen.
ich konnte nachvollziehen, wie du vorgegangen bist und habe den code für meine zwecke angepasst und es klappt!

holger