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?
Die Rechnerei allein nutzt Dir vermutlich nichts, wenn Du den internen ADC nehmen willst. 10 Bit entsprechen etwa 60dB.
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
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
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
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
Ein 8 bit Prozessor wird sich auf jeden fall riesig über die ganze Fließkomma-arithmetik freuen.
>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?
Hi je nach Auflösung des ADC (bzw. wirklich benötigter Auflösung) und verfügbarem Programmspeichers kann sich eine Lookup-Tabelle lohnen. Matthias
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
"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
>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
Sicher ist das tricky, aber durch solche Ideen (und einiges andere mehr) zeichnet sich eben ein guter Entwickler aus. Dieter
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.