PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umrechnung in dB Werten



heikilo
08.06.2007, 10:54
Hallo, ich hätte da mal ne Frage,
weiß irgendjemand hier, wie man aus Werten die ich vom A/D Wandler bekomm, diese in dB umrechnen kann? Die normale Formel lautet (Uout/Uin = 20*log). Nur wenn ich eine Funktion mit log programmier, kennt die lib math.h nur log mit ner Basis 10! Hat zufällig jemand schon ein Programm mit einer entsprechenden Funktion?! Ich steh total auf em Schlauch und versteh nur noch Bahnhof!
bin für jede Antwort dankbar!

mfg heikilo

Jaecko
08.06.2007, 11:44
Man kann doch mit 2 Log-Befehlen (beliebige Basis) den Log zu jeder anderen beliebigen Basis ziehen...
Wenn nur der Log10 vorhanden ist und man will den Log von 8.5 zur Basis 2, dann kann man ja einfach x = Log(8.5)/Log(2) = Log(Zahl)/Log(Basis) berechnen.

Manf
08.06.2007, 11:52
Ich hoffe Du erwartest bei der dB Rechung keine andere Basis als 10.

http://www.uwe-siart.de/lehre/dezibel.pdf

heikilo
08.06.2007, 12:19
doch eigentlich schon, so hab ich es mal probiert, funktioniert aber nicht wirklich:


double logarithmus (double, double);

// Funktion logarithmus()

void main ()

{

double l, n, b ; // Deklaration von Variablen
b = 20; // Definition der Basis
n = 5; // Definition des Numerus

// Aufruf der Funktion und
l = logarithmus ( b, n ); // Definition von l

}

// logarithmus()
// Definition der Funktion
// Berechnet den Logarithmus des Numerus zu einer beliebigen
// Basis


double logarithmus (double bas, double num)
{
return (log10(num)/log10(bas));

}

kann sich das jemand mal anschauen.
Und wie kann ich, um zu überprüfen ob es funktioniert, weiter vorgehen. Kann ich den berechneten Wert einfach einem PORT zuweisen und dann im I/O Register schauen ob es stimmt??

Manf
08.06.2007, 12:59
http://en.wikipedia.org/wiki/Decibel:

When referring to measurements of amplitude it is usual to consider the ratio of the squares of X (measured amplitude) and X0 (reference amplitude). This is because in most applications power is proportional to the square of amplitude. Thus the following definition is used:


http://upload.wikimedia.org/math/c/b/7/cb75b4e26ac642700419cf2b14b97adf.png http://upload.wikimedia.org/math/4/7/3/47307bc4dae37e0258b4b1eb77151710.png

http://upload.wikimedia.org/math/e/f/b/efb03f964ad4d8d1265d7023f57b36ec.png

Similarly, in electrical circuits, dissipated power is typically proportional to the square of voltage or current when the impedance is held constant. Taking voltage as an example, this leads to the equation:


http://upload.wikimedia.org/math/f/1/a/f1ab4e2e955a950f55fe03e50edc6cc8.png

askazo
08.06.2007, 13:02
Ähm, Du weißt aber schon, dass zur Berechnung von dB der Logarithmus zur Basis 10 benutzt wird, oder? ;)

Was Manf wohl auch gerade sagen wollte...

wkrug
08.06.2007, 20:46
Ein Atmel Controller hat 10Bit Auflösung also 1024 mögliche Werte.
Lass doch EXCEL die Berechnung machen und schreib in den Controller eine Tabelle rein.
Die Auswertung ist rasend schnell, weil ja nichts berechnet werden muss.
Mit A/D Wandler Wert auf den entsprechenden Speicherplatz in der Tabelle gucken und den Wert der dort steht ausgeben fettich.
Ich glaub eine log Routine wird auch nicht viel sehr weniger Platz brauchen und math.h brauchst Du dann auch nicht.

heikilo
09.06.2007, 09:55
Hä, meinst du ich soll in Excel ne Tabelle mit den Berechnungen erstellen und diese dann im Programmcode einbinden?! Ich hab ehrlich gesagt keine Ahnung wie das gehn soll! Aber trotzdem danke für den Vorschlag.

wkrug
09.06.2007, 12:23
Hä, meinst du ich soll in Excel ne Tabelle mit den Berechnungen erstellen und diese dann im Programmcode einbinden?! Ich hab ehrlich gesagt keine Ahnung wie das gehn soll! Aber trotzdem danke für den Vorschlag.
Ja genau so mein ich das.
Du entwickelst also mit EXCEL eine Formel, die Dir für jeden möglichen A/D Wert einen dB Wert errechnet.
Die Spalte für den dB Wert (aus EXCEL heraus) kopierst Du dir in deine Anwendung (STRG-C, STRG-V) in eine Fix Variable in AVR-GCC.
In Code Vision geht das so:
flash signed int si_dbwerte[1024]={deine kopierten Werte mit , getrennt };

Als dB Werte würde ich das 10 oder 100 fache des reellen dB Wertes benutzen und die Kommas erst bei der Ausgabe einsetzen, somit kriegst du eine Auflösung von 0,1 bzw 0,01 dB und das Ganze passt auch noch in eine int Variable inklusive Vorzeichen.
Allerdings belegt eine int Variable 2 Byte, das bedeutet die Tabelle wird 2048Bytes brauchen. Wenn dir eine Auflösung von 1dB reicht gehen die Werte noch in einen Char, dann hat die Tabelle 1024 Byte.

Da der Controller die Werte dann nicht nach jedem neuen Messzyklus berechnen muß sollte diese Methode auch ziemlich schnell laufen und Du kommst ohne Gleitkommazahlen (float) aus, was deinem Controller auch gefallen dürfte - Das hatte ich aber schon mal geschrieben.

Ein bischen Arbeit dürftest Du nur noch bei der Formattierung der Tabelle kriegen, damit das im Programm sauber ausschaut.

heikilo
11.06.2007, 15:49
aha, danke. Was ich aber nicht ganz auf die Reihe bekomme, wie meinst du das mit dem 10 oder 100 fachen des reellen dB Wertes? Ich bekomm doch vom A/D nen Wert, den Teil ich durch die Referenzspannung, dann mal 20 log... Jetzt hab ich mein dB Wert. Aber wie kann ich nun sagen das der Controller nach nem passenden Wert schauen soll?

mfg

wkrug
11.06.2007, 19:44
Ich bekomm doch vom A/D nen Wert, den Teil ich durch die Referenzspannung, dann mal 20 log... Jetzt hab ich mein dB Wert. Aber wie kann ich nun sagen das der Controller nach nem passenden Wert schauen soll?
Du hast doch deine Tabelle in einer Variable abgelegt.
Nun nimmst Du einfach deinen A/D Wert und liest den dazgehörigen Wert aus der Variable aus.

db_wert=db_tabelle[A/DWandlerwert];

fertig.
Die Werte in der db_tabelle hast Du ja im Vorfeld für alle möglichen A/D Wandlerwerte berechnet (z.B. mit EXCEL).


aha, danke. Was ich aber nicht ganz auf die Reihe bekomme, wie meinst du das mit dem 10 oder 100 fachen des reellen dB Wertes?
In eine int Variable passen nur ganzzahlige Werte rein.
Es gibt in einer int Variable kein 1,5 sondern nur 1 oder 2 in diesem Fall.
Wenn ich aber die Tabellenwerte x10 Nehme steht im Speicher 15 und erst bei der Ausgabe wird das Komma nach der 1 eingefügt.
Nehm ich die Werte x100 steht in der Tabelle 150 und auch da füge ich bei der Ausgabe das Komma nach der 1 ein.

Der Grund für dieses Spielchen ist, das sich ein Controller mit int Zahlen wesentlich leichter tut und weniger Speicher verbrät als mit float.

Der Faktor x1 x10 oder x100 ist abhängig davon wie viele Stellen hinter dem Komma angezeigt werden sollen.

Ich bin der Meinung bei einer dB Anzeige sollte es mindestens eine Stelle nach dem Komma sein.