Atmega 8535 - Logarithmus berechnen

Gast #2937272
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
#2937297
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
#2937512
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.

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