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
#include <math.h> ... float X, dB; ... X = (float) Read_Analog(); dB = 20* log(X / 0.00002); Dürfte je nach Math-Bibliothek schnarchlangsam werden...
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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.