Forum: Mikrocontroller und Digitale Elektronik log von 16 bit Wert


von Armin Z. (arze)


Lesenswert?

ich moechte den Ausgang eines 16 bit ADC auf eine Ausgabe in dB mappen, 
mittels logarithmus. Kann man dies irgendwie mit ganzzahligen Werten 
machen? Habe schon einige Loesungen mit double gefunden. Geht es auch 
irgendwie anders?

von veloist (Gast)


Lesenswert?


von Gerd (Gast)


Lesenswert?

Hallo Armin,

ich weiss ja nicht, wie gut deine mathematischen Fähigkeiten sind. Eine 
Potenzreihenentwicklung in Ganzzahlarithmetik wäre möglich. Schau mal 
hier
http://de.wikipedia.org/wiki/Logarithmus
dort steht alles Notwendige drin. Ich würde mittels Basisumrechnung den 
Logarithmus zur Basis 2 berechnen. Über das Produktgesetz musst du 
eigentlich nur den Logarithmus für Zahlen zwischen 0..2 berechnen, und 
das geht recht gut mit der Potenzreihe.
Ich habe das Vorgehen nur knapp angedeutet, aber wenn es dich 
interessiert, kann ich es genauer erklären.

Gruß
Gerd

von antworter (Gast)


Lesenswert?

Approximation mittels Taylorreihenentwicklung:

http://www.math.tu-dresden.de/~ganter/inf2005/folien/Taylor2.pdf

Taylor & Verfahren von Briggs

http://www.mathematik.ch/anwendungenmath/logarithmen/

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Für PICs gibts hier ein Assembler-Programm:
http://www.dattalo.com/technical/software/pic/piclog.html
Allgemeineres hat derselbe Autor hier:
http://www.dattalo.com/technical/theory/logs.html

von Luigi Rossi (Gast)


Lesenswert?

Hallo, Armin
Wenn Dir eine Auflösung von 16 Werten genügt, schlage ich folgendes vor:
Der 2-er Logarithmus einer 16 Bit Zahl ist ein Wert zwischen 0 und 15, 
nämlich genau die Position des linkesten 1-Bits.
Das sollte auch in Assembler recht einfach sein.

z.B. 10000000 00000000 -> ld=15
     00000000 00111000 -> ld=5


lg
Luigi

von Armin Z. (arze)


Lesenswert?

Hallo!

Vielen Dank fuer die Antworten.
Ich moechte insgesamt 70 Stufen haben, mal sehen, wie sich das am Besten 
machen laesst.

Nochmals Danke
Armin

von Falk (Gast)


Lesenswert?

@Armin Zeitler

>Ich moechte insgesamt 70 Stufen haben, mal sehen, wie sich das am Besten
>machen laesst.

Eine Mischung aus Luigi Rossis Ansatz und der Decodierung der 
verbleibenden Mantisse. Sprich, nachdem du die erste '1' gefunden hast 
und die Position in eine 4 Bit Zahl gewandelt hast (Exponent), nimmst du 
die nächsten 2 Bit als Mantisse. Dein LD ist dann Mantisse + 4x 
Exponent. Eigentlich nur Bitschieben. Zu unverständlich? Zwei Beispiele.

1.)

0x00101100xxxxxxxx
    |^^
    |Mantisse = 1
    |
    erste '1' an Position 13

LD = 1+ 13x4 = 53

2.)
0x00011100xxxxxxxx
     |^^
     |Mantisse = 3
     |
     erste '1' an Position 12

LD = 3 + 12 x 4 = 51

Ist quasi eine INT to FLOAT Konverierung. Schau dir mal die A-Law 
Kodierung von Tefephondaten an.

http://en.wikipedia.org/wiki/A-law

Die Beschriebung ist ein wenig kryptisch, aber als Ausgangspunkt 
brauchbar.

MfG
Falk

von Armin (Gast)


Lesenswert?

Hallo Falk!

Danke fuer Deine Antwort.

Mir ist nicht ganz klar, wie ich dabei die Genauigkeit eventuell noch 
erhoehen kann. Muss ich den Exponenten dann mit einem anderen Faktor als 
4 gewichten?
Danke schon mal im Voraus,

von Falk (Gast)


Lesenswert?

@Armin

>Mir ist nicht ganz klar, wie ich dabei die Genauigkeit eventuell noch
>erhoehen kann. Muss ich den Exponenten dann mit einem anderen Faktor als
>4 gewichten?

Ja. Du kannst den Exponenten mit 8 wichten und 3 Bit Mantisse verwenden, 
oder mit 16 und 4 Bit Mantisse, oder . . . etc.

MfG
Falk


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.