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
Wow. Ich verstehe nur das "res+=V1;" nach der for()-Schleife nicht (C-Version).
:
Bearbeitet durch User
Joe F. schrieb: > Wow. > > Ich verstehe nur das "res+=V1;" nach der for()-Schleife nicht > (C-Version). Was ist daran "Wow"?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.