Hallo, AVR Atmega8: welche Tricks gibt es um möglichst schnell einen beleibigen 8Bit-Wert mit einem Faktor von 0 bis 1 zu multiplizieren? Für eine kleine Tabelle wäre bei mir Platz. Ich benötige das für die Hüllkurve (Lautstärkeänderung) eines Synthesizer. Bei 16Mhz und einer vernünftigen Sampling-Rate (mind. 22Khz) bleibt ja nicht viel an Rechenzeit pro Sample übrig. Wenn jemand schon Erfahrung mit Soft-Synths auf dem Atmega gemacht hat, würden ich mich auch über ein paar generelle Tips zu dem Thema freuen... Ciao Chris
Chris, Vielen Dank für das übliche Ratespiel. Zum Glück ist jeder hier Hellseher! Also: - in Assembler oder C,Bascom, Pascal, oder was? - Welche Auflösung hat der Faktor 0..1 (auch sowas wie 0,0234)? - Welche Genauigkeit muss das Ergebnis haben, auch wieder 8 Bit? Ansonsten gilt grundsätzlich als Möglichkeit: Den Faktor bis zu einer Ganzzahl hochmultiplizieren und das Ergebnis wieder entsprechend teilen. Eine Tabelle geht natürlioch auch, kommt aber auf die Anzahl der Werte und Faktoren an. Jochen Müller
Der AVR unterstüzt sogar Fractional Multiply, dabei wird ein Faktor als Wert zwischen -1 ... 1 interpretiert. das dauert dann zwei Takte. Ist bei den Aplication notes zum Hardwaremultiplizierer dabei
Hier das dokument...
1 | in r16,PINB ; Read pin values |
2 | ldi r17,$B0 ; Load -0.625 into r17 |
3 | fmuls r16,r17 ; r1:r0 = r17 * r16 |
4 | movw r17:r16,r1:r0 ; Move the result to the r17:r16 register pair |
Wobei für den Bereich 0-1 das ganz normale mul besser geeignet ist, da man eine höhere Auflösung hat, wenn man sich mit einem Bereich von 0-0.9961 (0-255/256) zufrieden gibt.
1 | in r16,PINB ; Read pin values |
2 | ldi r17,$B0 ; Load 0.6875 into r17 |
3 | mul r16,r17 ; r1:r0 = r17 * r16 |
4 | movw r16,r1 ; Move the result to the r16 register |
Oder auch mit mulsu falls der Wert vorzeichenbehaftet ist. Wenns die Auflösung besser sein soll, kann man das ganze auch auf 16bit erweitern. Dann geht der Wertebereich von 0-0.999985.
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.