mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das dokument...
in r16,PINB ; Read pin values
ldi r17,$B0 ; Load -0.625 into r17
fmuls r16,r17 ; r1:r0 = r17 * r16
movw r17:r16,r1:r0 ; Move the result to the r17:r16 register pair

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
in r16,PINB ; Read pin values
ldi r17,$B0 ; Load 0.6875 into r17
mul r16,r17 ; r1:r0 = r17 * r16
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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!
Hat mir sehr geholfen :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.