mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Linear nach Logarithmisch


Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat jemand eine Idee, wie ich möglichst einfach und schnell einen 
ADC-Wert (10Bit) von linear nach logarithmisch "umrechnen" kann?

(alternative wäre wohl eine Tabelle..)

Gruß,
Techniker

Autor: Xtension (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
10*log10a=xdb

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Dein Posting lässt einiges offen:
- Log zu welcher Basis
- Notwendige Genauigkeit

Nimmst Du nämlich den index des msb in Deinem 10-stelligen Wert, also 
bei 0x0001010000 wäre das 6, so ist dies der log2 mit einer Genauigkeit 
von 1 Stelle ;-)

Tabelle ist sicher am genausten, aber das sind dann wohl 2048 Byte

Standardlösung wäre:

#include <math.h>

y = log10(a);

Ob des wesentlich schmaleren Code erzeugt, weiss ich nicht, auf jeden 
Fall läuft es wesentlich länger.

Gruss,
Michael

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..sorry!

An die Basis hab i nicht gedacht.. ;-)

Das mit dem log ist natürlich das einfachste, frisst aber vielzuviel 
Ressourcen (Speicher und Rechenzeit) auf dem uC.

Ich muß ein log. Poti nachbilden für eine Audio-Anwendung..

Gibts da evtl. einen Trick? Als alternative fällt mir jetzt nur eine 
LookUp-Tabelle ein..

Gruß,
Techniker

PS: Genauigkeit: Es soll kein Float verwendet werden..

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist das ein geeigneter Ansatz, wie
Michael Appelt (micha54)

http://de.wikipedia.org/wiki/Logarithmus#Berechnun...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Logarithmis zur Basis 2 kannst du auch berechnen, indem du das
Argument zuerst normierst. Die Anzahl der für die Normierung
erforderlichen Schiebeschritte ist der ganzzahligen Anteil des
Ergebnisses. Der gebrochene Anteil wird aus einer Tabelle gelesen, wobei
des normierte Argument (ohne die führende 1) als Index genommen wird.
Die Anzahl der Tabellenelemente ist die Anzahl der Stufen, die du im
Bereich x..2*x auflösen möchtest.

Soll der Logarithmus zu einer beliebigen Basis b berechnet werden, muss
das Ergenis anschließend mit der Konstante 1 / log₂ b multipliziert
werden.

Aber bist du dir sicher, dass du den Logarithmus möchtest? Falls du aus
dem Drehwinkel des Potis den Widerstand ausrechnen möchtest, läuft die
Rechnung genau umgekehrt, du musst also exponentieren.

Hierzu kann der oben bechriebene Weg rückwärts beschritten werden: Das
Argument wird mit log₂ b multipliziert und das Ergebnis mit 2
exponentiert. Für die Exponentiation wird das Ergebnis für den
gebrochenen Anteil das Ergebnis aus einer Tabelle gelesen. Dieses wird
um soviele Bits nach links geschoben, wie es dem ganzzahligen Anteil
entspricht.

Auch hier hängt die Anzahl der Tabellenelemente von der gewünschten
Auflösung ab.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfacher wäre ein ADC mit µ-law oder A-law Codierung, die ist schon 
logarithmisch

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine alte Applikationsschrift "Easy Logarithms for COP400":
http://www.national.com/ms/CB/CB-2.pdf

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Techniker wrote:
>
> Ich muß ein log. Poti nachbilden für eine Audio-Anwendung..
>

Hallo,

die sind aber doch garnicht logarithmisch, sind reale Potis nicht 
vielmehr mit wenigen (1..3) Geraden logarithmiert ? Reicht dann hier 
evtl. auch eine derartige Annäherung ?

Gruss,
Michael

Autor: Bensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest die Tabelle verkleinern, indem du nur einige Stützstellen 
abspeicherst und dazwischen linear interpolierst. Schneller geht's, wenn 
du Stützstellen und Steigung zum nächsten Punkt speicherst.

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.