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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.