Forum: Mikrocontroller und Digitale Elektronik Lineare Interpolation in 30 Bytes auf attiny


von TinyBear (Gast)


Angehängte Dateien:

Lesenswert?

Moin!

Taucht irgendwie immer mal wieder als Frage auf:
Lineares interpolieren...

Hier hatte ich eine Idee und konnte auf einem Attiny viel Code 
einsparen.

Mein "mix888" braucht nur 15 Instruktionen = 30 Bytes und interpoliert 
zwei 8 Bit Werte mit einem 8 Bit Gewicht und liefert ein 16 Bit 
Ergebnis.
Wer die Nachkommastellen nicht braucht, ignoriert eben das Byte...

Meine Lösung habe ich so nirgendwo gefunden, und da ich hier (und auf 
avrfreaks) gerne mitlese kann ich das ja mal posten. Die Mathematik 
dahinter ist auch nicht AVR Spezifisch: Sie lohnt sich dann, wenn keine 
HW Multiplikation vorhanden ist, denn sie benötigt nur Addition und 
Shift.

Alle Details und Erklärungen sind im ASM file.

Da die Routine auch das "normale" Multiplizieren ersetzen kann und nur 
unwesentlich langsamer ist, hilft sie beim Code-Sparen nochmal.

Vielleicht hat jemand eine Idee wie man noch Instruktionen rauswerfen 
kann?
Das wäre cool. Mein AVR Assembler Wissen ist noch ziemlich frisch.

Grüße,
  TinyBear

von Joe F. (easylife)


Lesenswert?

Wow.

Ich verstehe nur das "res+=V1;" nach der for()-Schleife nicht 
(C-Version).

: Bearbeitet durch User
von Bürth (Gast)


Lesenswert?

Joe F. schrieb:
> Wow.
>
> Ich verstehe nur das "res+=V1;" nach der for()-Schleife nicht
> (C-Version).

Was ist daran "Wow"?

von TinyBear (Gast)


Lesenswert?

Moin!

Das +V1 ist notwendig damit das Ergebnis stimmt. Siehe Umrechnung: Steht 
ja auch dort drin:
res = (V2*f + V1*(max-1-f) + V1)/max

Tatsächlich kann man sich das auch sparen, wenn das Ergebnis nur "in 
etwa" stimmen muss, weil man am Ende sowieso rundet oder so.

Es gibt ja (mind.) zwei Varianten, wie man die Interpolation schreiben 
kann.
Ich habe sie beide aufgelistet: Gewichtet (eigentlich 2 Mult) oder eher 
als Geraden-Gleichung mit Steigung, also mit Differenz, aber eben nur 
eine Multiplikation:
Nur bei der Variante habe ich nicht wirklich entdeckt, wie ich die Zahl 
der Instruktionen gedrückt bekomme, da ich (und dann nur hier) ein 
Signed Mult. brauchte.
Beim Blick in die Multiplikation selbst kam dann die Idee, wie man 
(recht ungenau je nach Werten) alles nur mit 8Bit rechnen könnte (Die 
Faktoren Schieben die dann addieren, ohne also ohne Nachkomma im 
Ergebnis)
Beim rumspielen kam dann die Variante die eben wieder perfekt genau ist 
und (deshalb) mult8 ersetzen kann, plus Optimieren.

Ciao,
  TinyBear

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.