Guten Abend, ich habe gerade einen Knobelaufgabe, bei der ich gerade nicht weiter weiss. Ich habe zwei Variablen a und b (beide 64 Bit signed Integer), deren Differenz jederzeit klein genug ist, daß sie problemlos in eine 16-Bit-Integer-Variable passt, also auch problemlos in eine 32 Bit float-Variable. Sie wird auch als float weiterverarbeitet. Allerdings will ich vor der Differenzbildung den Zweig a mit einem IIR 1. Ordnung leicht filtern. Das Filter ist als float implementiert. Zweig b darf keinesfalls gefiltert werden. Durch die Filterung wird die Differenz der beiden Variablen tendenziell eher kleiner - zur Mantissengröße im 32-Bit-float habe ich weiterhin mehr als genügend Sicherheitsabstand. Das Ganze will ich möglichst effizient für einem ARM Cortex M4 implementieren. Die Variablen a und b passen zwar jeweils in die 52-Bit-Mantisse einer double-Variable, aber das wäre sozusagen die letzte Lösung. Mein Gefühl sagt mir, daß es eine relativ einfache Möglichkeit geben muss, den gefilterten und den ungefilterten Zweig in einen großen Integer- und einen kleinen Float-Teil aufzuspalten. Wer hilf mir, den gordischen Knoten zu zerschlagen? Viele Grüße W.T.
Was hindert Dich, die (Ziel-) Formeln hinzuschreiben? Mit Grenzen etwaiger Parameter und Eingangswerte. So rate ich rum, was ein Faktor k zwischen 0 und 1 wohl bedeuten mag, für Auslösung und Genauigkeit...
Das Blockdiagramm ausgeschrieben sieht so aus:
mit
Da K und omega float-Variablen sind, sind also fast alle Terme gemischte Multiplikationen aus 64-Bit-Integer und 32-Bit-Float.
Anstelle a - b < 2^23 in der Handskizze soll es natürlich heißen:
Es ist aber schon klar, dass float in diesem Kontext nichts bringt... bleib bei 64 bit integern und mach allenfalls fixedpoint, dh manuell das komma festhalten. Eine Signalverarbeitungsaufgabe ? Welcher Sensor, welches Stellglied bringt mehr als zB 24 bit ?
:
Bearbeitet durch User
Sabberalot W. schrieb: > Welcher Sensor, [...] bringt mehr als zB 24 bit ? Jeder Zähler, wenn er nur lange genug zählen muss.
Walter Tarpan schrieb: > Das Ganze will ich möglichst effizient für einem ARM Cortex M4 > implementieren. Die Variablen a und b passen zwar jeweils in die > 52-Bit-Mantisse einer double-Variable, aber das wäre sozusagen die > letzte Lösung. Effizient bezüglich des Platzes oder der Rechenzeit? Irgendwo gibt es hier Ausführungszeiten für double Grundrechenarten, die auf einem STM32F4.. mit 168 MHz jeweils um 1 µs (div) oder deutlich darunter liegen (add, sub, mul). Deine 'letzte Lösung' könnte vielleicht völlig ausreichen. Der Vorteil ist, im Gegensatz zu einem Skalierungsmonster die Formel direkt und nachvollziehbar formulieren zu können. Probiere es einfach aus!
m.n. schrieb: > Deine 'letzte Lösung' könnte vielleicht > völlig ausreichen. Der Vorteil ist, im Gegensatz zu einem > Skalierungsmonster die Formel direkt und nachvollziehbar formulieren zu > können. > Probiere es einfach aus! Mein Vorbehalt gegen die double-Implementierung (die ich selbstverständlich schon gemacht habe - schließlich ist sie der einfachste Weg, jede andere Lösung testen zu können) liegen an einer ganz anderen Stelle: Ich handele mir damit eine neue Limitierung der Zähler ein. An allen anderen Stellen arbeite ich nur mit Differenzen. Momentan laufe ich damit noch in keine Probleme. Das kann sich aber mit der nächsten Änderung der Anforderungen schnell ändern.
Walter T. schrieb: > Momentan laufe ich > damit noch in keine Probleme. Das kann sich aber mit der nächsten > Änderung der Anforderungen schnell ändern. Dann warte es doch einfach ab.
Walter T. schrieb: > m.n. schrieb: >> Dann warte es doch einfach ab. > > Nö. Die Frage interessiert mich. Dann mußt Du abwarten, bis sich jemand mit der passenden Lösung meldet ;-)
Beitrag #5219850 wurde vom Autor gelöscht.
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.