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
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
..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..
Vielleicht ist das ein geeigneter Ansatz, wie Michael Appelt (micha54) http://de.wikipedia.org/wiki/Logarithmus#Berechnung_einzelner_Bin.C3.A4rziffern
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.
einfacher wäre ein ADC mit µ-law oder A-law Codierung, die ist schon logarithmisch
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.