Forum: Mikrocontroller und Digitale Elektronik AVR Assembler Konstanten variabel machen


von Sebastian W. (code)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin momentan am verzweifeln.
Ich habe hier eine fft Routine in Assembler, welche ich aus C aufrufe.
Die Routine funktioniert einwandfrei.

In der Confing.h wird aber eine Konstante mit 256 definiert
#define FFT_N  256

Diese Konstante möchte ich zur Laufzeit ändern können 
(64,128,256,512,1024).

Ich bekomme es aber nicht hin das Assembler abzuändern, da ich von 
Assembler wenig Ahnung habe.

Im Assembler File wird durch die Konstante FFT_N noch weitere Konstanten 
definiert. Dadurch lässt sich FFT_N nicht einfach in eine externe 
variable umändern.

Ich hoffe jemand von euch kann sich das Assembler File mal anschauen und 
die Konstanten variabel machen. Ich wäre sehr dankbar dafür.

Mit freundlichen Grüßen
Sebastian

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Weidmann schrieb:
> Hallo zusammen,
>
> ich bin momentan am verzweifeln.

> Diese Konstante möchte ich zur Laufzeit ändern können
> (64,128,256,512,1024).
>
> Ich bekomme es aber nicht hin das Assembler abzuändern, da ich von
> Assembler wenig Ahnung habe.

Das geht auch nicht so einfach. Dazu wären massive Umbauten im Assembler 
Code notwendig.
Alleine schon das Zusammenführen der jeweiligen vordefinierten Tabellen 
für die jeweilige FFT Größe in eine gemeinsame Tabelle, zieht einen 
Rattenschwanz an Änderungen nach sich.
Möglich: ja. Aber nicht in 20 Minuten.

von Sebastian W. (code)


Lesenswert?

Ja das ist mir bewusst, dass es nicht in 20 Minuten erledigt ist.

Wenn mir jemand den Code lauffähig abändern kann, bin ich auch bereit 
etwas dafür zu bezahlen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Am einfachsten ist es wohl, 4 Varianten zu erzeugen: eine für jede 
Konstante.  Und dann abhängig vom Wert von die Ausprägung des 
Algorithmus' für das entsprechende FFT_N auszurufen.

Damit vereinfacht sich das ganze auf die Umbenennung von Labels, die 
Generierung und die Verzweigung, die man einfach in C implementieren 
kann.  Falls die Variante zur Compilezeit bekannt ist, kann der 
Vergleich dann wegoptimiert werden.

von Sebastian W. (code)


Lesenswert?

@Johann L.
Ja das habe ich mir auch schon überlegt. Das wäre wohl wirklich die 
einfachste Variante. Es gäbe dann halt 4-5 Varianten. Wahrscheinlich 
würden beim Umbau des Assemblers auch zahlreiche Fehler entstehen.

von Karl H. (kbuchegg)


Lesenswert?

Johann L. schrieb:
> Am einfachsten ist es wohl, 4 Varianten zu erzeugen


hab ich auch schon überlegt.

Eine andere Überlegung, wobei ich nicht weiß, ob das mathematisch 
zielführend ist.
Da eine FFT ja sowieso nur mit 2-er POtenzen funktioniert ...
... könnte man nicht einfach hergehen und grundsätzlich immer mit einer 
10 Bit FFT rechnen und dazu einfach die Eingangswerte entsprechend oft 
duplizeren?

Mir ist klar, dass man da natürlich Laufzeit verschenkt. Aber rein 
prinzipiell: würde die FFT da das richtige Ergebnis liefern?

Also anstelle einer 9 bit FFT mit den Eingangswerte
23, 56, 78, 98, ....
eine 10 Bit FFT anwerfen mit den Eingangswerten
23, 23, 56, 56, 78, 78, 98, 98, ....

von Sebastian W. (code)


Lesenswert?

@Karl Heinz
Hab ich schon versucht. Das Ergebnis war aber nicht so berauschend.
Warum kann ich mathematisch aber nicht erklären.
Kommt aber eh nicht in Frage, da die Laufzeit eine sehr große Rolle 
spielt.

Die 4-5 Varianten Lösung gefällt mir am besten und werde ich so jetzt 
umsetzen.

Vielen vielen Dank für eure schnelle Hilfe!!

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.