Forum: Mikrocontroller und Digitale Elektronik Linear nach Logarithmisch


von Der T. (Gast)


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

von Xtension (Gast)


Lesenswert?

10*log10a=xdb

von rene (Gast)


Lesenswert?


von Michael A. (micha54)


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

von Der T. (Gast)


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..

von Matthias L. (Gast)


Lesenswert?

Vielleicht ist das ein geeigneter Ansatz, wie
Michael Appelt (micha54)

http://de.wikipedia.org/wiki/Logarithmus#Berechnung_einzelner_Bin.C3.A4rziffern

von yalu (Gast)


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.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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

von Michael A. (micha54)


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

von Bensch (Gast)


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.

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.