mit AVR90 oder Mega logarithmus rechnen

Gast #207707
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
Gast #207708
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
Gast #207709
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
Gast #207710
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
Gast #207714
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
#207715
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
Gast #207716
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
Gast #207718
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren