Forum: Mikrocontroller und Digitale Elektronik AVR 8Bit-Werte mit Faktor 0-1 multiplizieren (Synth)


von Chris (Gast)


Lesenswert?

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

von Jochen M. (taschenbuch)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

Vielen Dank!
Hat mir sehr geholfen :-)

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.