Forum: Mikrocontroller und Digitale Elektronik mit AVR90 oder Mega logarithmus rechnen


von Emppu (Gast)


Lesenswert?

Ich möchte gerne ein Pegelmessgerät basteln und um das zu machen muss
ich den Wert aus dem ADC in einen Log Wert umwandeln und dann in
Dezibel ausgeben - hat wer ein Unterprgramm das LOG10 rechnen kann?

von Gerd Laschinski (Gast)


Lesenswert?

In welcher Sprache auf welchem Prozessor?

Gerd

von Michael (Gast)


Lesenswert?

Die Rechnerei allein nutzt Dir vermutlich nichts, wenn Du den internen
ADC nehmen willst. 10 Bit entsprechen etwa 60dB.

von Gerd Laschinski (Gast)


Lesenswert?

Oh, Prozessor übersehen.
Ich habe vor langer Zeit mal ein Basic-Programm geschrieben, das den
Logarithmus berechnet. Ich habe den Kommentar dazu rauskopiert:

' Ln(x) berechnet den natürlichen Logarithmus nach:
' ln(1-y) = -(y + y^2/2 + y^3/3 + ... + y^n/n + ...)  mit  y = 1 - x
'
' Der Logarithmus ln(x) wird in
' ln(x) = ln(x'*2^m) = ln(x') + m*ln(2)  mit  1.5>=x'>=0.5, m
ganzz.
' umgeformt, um eine schnelle Konvergenz der Reihe zu gewährleisten.
'
Damit geht das eigentlich recht einfach.

Gruß
Gerd

von Barti (Gast)


Lesenswert?

Wenn man C nutzt, dann kann man auch die math.h einbinden. Allerdings
sei vorher gesagt, dass die Berechnung des Logarithmus viel Speicher
und Rechenzeit in Anspruch nimmt. Je nachdem wie genau man das
berechnet. Hab mal was mit ner Exponentialfunktion auf nem 2313
berechnen wollen. Naja der Speicher war danach fast voll(Programm in C
geschrieben).

MfG Barti

von Peter Dannegger (Gast)


Lesenswert?

Wenns nicht supergenau sein muß, dann kann man den dualen Logarithmus
ganz schnell durch Rechtsschieben und Mitzählen bis <2 ermitteln
(Vorkommastelle).
Die Nachkommastelle ist dann der 8Bit Rest.
Bzw. etwas genauer, den Rest als Zeiger auf eine Tabelle (256 Byte) mit
der Nachkommastelle nehmen.

Dann noch eine Multiplikation und schon hat man den dekadischen
Logarithmus.


Peter

von Guenter Bittner (Gast)


Lesenswert?

Hallo Emppu,

eine einfache Programm-Lösung zur Berechnung von "log10"
wäre die Verwendung des Tschebyscheff-Polynoms. Die von
dir gesuchte C-Funktion würde in der Praxis dann so aus-
sehen:


double log10(double x)
{
  double y, q, quad;
  int i;

  if (x <= 0.0) return(0.); /* Error! */
  i = 0;
  while (x < 1.0 ) {
    x *= 10.0;
    i--;
  }
  while (x > 10.0) {
    x *= 0.1;
    i++;
  }
  q = (x - 3.16227766) / (x + 3.16227766); quad = q * q;
  y = ((((.191337714 * quad
        + .094376476) * quad
        + .177522071) * quad
        + .289335524) * quad
        + .868591718) * q + .5;
  y += (double) i;
  return(y);
}

Viele Grüße und viel Erfolg

  Günter

von Marius Schmidt (Gast)


Lesenswert?

Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
Fließkomma-arithmetik freuen.

von Santa Klaus (Gast)


Lesenswert?

>Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
>Fließkomma-arithmetik freuen.

Das ist wohl wahr, aber kennst Du eine bessere Alternative?

von Matthias (Gast)


Lesenswert?

Hi

je nach Auflösung des ADC (bzw. wirklich benötigter Auflösung) und
verfügbarem Programmspeichers kann sich eine Lookup-Tabelle lohnen.

Matthias

von Arno H. (Gast)


Lesenswert?

Warum nicht die Pegelerfassung gleich mit einem logarithmischen
Gleichrichter durchführen. Bei AD gibt es welche von Gleichstrom bis
fast 3GHz. Am Ausgang steht eine dB- lineare Gleichspannung an.
Ansonsten geht nämlich wirklich die Dynamik in de Keller. Wie oben
schon geschrieben sind 10 Bit ca 60 dB Dynamikbereich und pro Bit gehts
6dB rauf und runter.
Arno

von Peter D. (peda)


Lesenswert?

"Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze
Fließkomma-arithmetik freuen."


Na und ?

Für den Menschen sind Ausgaben >5Hz (200ms) Unsinn (nicht ablesbar) und
ein AVR schafft das bischen float in 200ms doch spielend und legt sich
obendrein noch ein Weilchen schlafen.

Oder den float in long umwandeln und dann meine Methode nehmen, dann
ist der AVR fast nur noch am schlafen.


Man muß immer nur so schnell rechnen können, wie nötig !


Übrigens kann man sehr wohl mit einem 10Bit-ADC eine Bereich von 10^6
überstreichen, wozu hat der denn 8 Eingänge.

Ich hab einfach mehrere OPVs davorgeschaltet (Verstärkung 1, 10, 100
und 1000) und bei Übersteuerung wird einfach auf den nächsten Eingang
umgeschaltet.


Peter

von Santa Klaus (Gast)


Lesenswert?

>Oder den float in long umwandeln und dann meine Methode nehmen,

Daran dachte ich auch schon.  Die (wohlbekannte) Idee, long als
*Fest*kommazahl zu "mißbrauchen", könnte auch hier in der Tat
interessant sein.

>Übrigens kann man sehr wohl mit einem 10Bit-ADC eine Bereich von 10^6
>überstreichen, wozu hat der denn 8 Eingänge.
>Ich hab einfach mehrere OPVs davorgeschaltet (Verstärkung 1, 10, 100
>und 1000) und bei Übersteuerung wird einfach auf den nächsten Eingang
>umgeschaltet.

Da mußt Du aber zugeben, daß das schon verflucht tricky ist! g

von dds5 (Gast)


Lesenswert?

Sicher ist das tricky, aber durch solche Ideen (und einiges andere mehr)
zeichnet sich eben ein guter Entwickler aus.

Dieter

von Arno H. (Gast)


Lesenswert?

@peter danegger
Das dürfte aber Frequenzprobleme bei den höheren Verstärkungen ergeben
und Du vergrößerst zwar den Eingangsbereich spannungsmäßig aber die
relative Auflösung bleibt trotzdem die gleiche, denn sobald einer der
Verstärker in die Sättigung geht ist dessen Auflösung weg.
Arno

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.