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