Forum: Mikrocontroller und Digitale Elektronik Atmega 8535 - Logarithmus berechnen


von Lars W. (Gast)


Lesenswert?

Hallo

ich habe folgendes Anliegen,
ein Mikrofon liefert meinem A/D-Wandler ca 5mV/Pa
nun möchte ich ausrechnen wieviel Pa ich zu bestimmten zeitpunkten 
habe...
bis hier ist es ja nicht so schwer=) einfach die SPannung die ankommt 
duch diese 5mV teilen. schon weiß ich wieviel Pa ich am Mikrofon habe.

Jetzt mein Problem.
Ich will den dB Wert berechnen dies würde ich so lösen:

definierte Hörschwelle = 0,00002 Pa
Wert vom Mikrofon = X Pa

Rechnung: 20log( X Pa / 0,00002 Pa)

nur wie bringe ich jetzt meinem Mikrocontroller in C das Logarithmische 
rechnen bei???

vielen dank schonmal für die hilfe

von Bernhard S. (b_spitzer)


Lesenswert?

#include <math.h>
...
float X, dB;
...
X = (float) Read_Analog();
dB = 20* log(X / 0.00002);


Dürfte je nach Math-Bibliothek schnarchlangsam werden...

von Stefan W. (dl6dx)


Lesenswert?

Lars W. schrieb:
> nur wie bringe ich jetzt meinem Mikrocontroller in C das Logarithmische
> rechnen bei?

Möglichkeit 1: Du schreibst eine log()-Funktion nach einem der 
existierenden mathematischen Verfahren zur numerischen Berechnung.

Möglichkeit 2: Du schaust, ob dein Entwicklungssystem eine Bibliothek 
mit mathematischen Funktionen enthält. (Meist existiert dazu eine 
Headerdatei math.h.) Dann musst du aber mit floats rechnen.

Möglichkeit 3: Du berechnest für alle vorkommenden Werte den Logarithmus 
und legst ihn in einer Tabelle ab. (Es reichen die Werte für eine 
Dekade, alles weitere kann man über eine Zerlegung des Eingangswerts und 
Anwendung der Logarithmengesetze erledigen.) Du arbeitest mit 
Festkommaarithmetik und schlägst den Wert in der Tabelle nach.

Nr. 1 (selbst bauen) ist in der Regel nicht notwendig.

Zwischen Nr. 2 und Nr. 3 solltest du gut abwägen.
1
val_db = 20.0 * log10(u_mic Pa / 0.00002); //float u_mic, val_db
sieht zwar sehr einfach aus, dahinter versteckt sich aber viel 
Rechenarbeit für deinen µC und eine umfangreiche Bibliothek (-> 
Codegröße!).

Nr. 3 wäre mein Mittel der Wahl. Aus dem ADC kommt sowieso ein 
Festkommawert.
Du skalierst das passend und zerlegst es in eine Produktdarstellung aus 
Zehnerpotenzen und einem Rest < 10. (Logarithmengesetz: log(a*b*c) = 
log(a) + log(b) + log(c).) Für die Zehnerpotenzen liegt der Wert des 
dekadische Logarithmus "auf der Hand". Für den Rest schlägst du in der 
Tabelle nach.

Ok?

Grüße

Stefan

von Stefan W. (dl6dx)


Lesenswert?

Stefan Wagner schrieb:
> Möglichkeit 3: Du berechnest für alle vorkommenden Werte den Logarithmus
> und legst ihn in einer Tabelle ab.

Ach ja: Das klingt schlimmer, als es ist. Man könnte das z.B. mit einer 
kleinen Excel-Tabelle machen.

Grüße

Stefan

von KernelPanik (Gast)


Lesenswert?

Wenn es nicht auf die Performatnz ankommt und / oder genau sein muss:
1
#include <math.h>
2
3
...
4
5
  double schalldruck=20*log10( druck / HOERSCHWELLE);
6
7
...

http://de.wikipedia.org/wiki/Math.h

von .. (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Stefan Wagner schrieb:

> Nr. 3 wäre mein Mittel der Wahl. Aus dem ADC kommt sowieso ein
> Festkommawert.

Wäre auch meine Wahl.
Der Mega8535 hat 8K Flash. Seine Anwendung klingt nicht danach, als ob 
er die komplett aufbrauchen würde. Da kann man 1K für eine 1024-er 
Tabelle schon erübrigen.
Und wenn nicht, dann macht man eben die Umkehrung: Für alle DB Werte von 
0 bis 120 die ADC Werte am PC ausrechnen, eine Tabelle aufbauen und in 
der dann binär suchen.

von Peter D. (peda)


Lesenswert?

Bernhard Spitzer schrieb:
> Dürfte je nach Math-Bibliothek schnarchlangsam werden...

Wen interessierts, der Mensch kann nur viel langsamer ablesen.

Für Ein-, Ausgaben kann eine Berechnung aus CPU-Sicht beliebig lange 
dauern, der Mensch merkt das nicht. Er sieht das Ergebnis gefühlt 
sofort.

Man sollte nur da optimieren, wo es auch einen Effekt hat.


Peter

von Markus W. (dl8mby)


Lesenswert?

Hallo Lars,

Möglichkeit #4 wäre, vor dem ADC und dem MIC-Amp einen
Hardware Logarithmierer zu setzen, so dass dein ADC bereits
einen log. Wert bekommt.

z.B.

LOG102AID - AMP LOG,SMD SOIC14,102

Gruß
Markus
DL8MBY

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.