dB Levelmeter Programmieren



  • Hallo erstmal,

    ich habe vor mir solch Anzeige zu programmieren:

    http://img838.imageshack.us/img838/7968/dbanzeige.th.jpg

    Uploaded with ImageShack.us

    ich habe zwar die Programmiersprachen C, C++ (objektorientiert), Assembler, Java wärend des noch laufenden Studiums gehabt, nur konnte ich damit bislang praktisch nichts anfangen, warum? Weil ich keine Ahnung von diversen Schnittstellen hab (hatten wir so auch nicht)

    Also, was soll das Prog können:

    - Signalpegel am Ausgang der Soundkarte anzeigen
    - wahlweise die 0dB anzeige auf 1V bzw 0,775V

    Mehr muss das Prog nicht können, ich möchte nur wissen, welche Ausgangsspannung am Lappi anliegt, wenn ich Musi mache 🕶

    Natürlich bin auch brennend scharf drauf zu wissen wie man sowas programmiert (Soundkarte abfragen etc.)

    So, wo fang ich nun am besten an? Habt ihr vielleicht ein Grundgerüst (Muster) für solch kleine Tools?

    Grüße



  • Das erste Problem was du dabei haben wirst, ist, dass man nicht so ohne Weiteres an das Ausgangssignal der Soundkarte rankommt. Zumindest nicht unter Windows, es sei denn da hätte sich was zum Besseren geändert.

    Du kannst natürlich am Line-Out ein Y-Kabel anstecken, und mit einem der beiden Stecker zurück in den Line-In gehen. Dann bekommst du das Signal dort wieder rein, das kannst du dann auslesen.

    Dann musst du dir eine API aussuchen mit der du es auslesen kannst. Unter Windows sind IMO die guten alten "Waveform Functions" immer noch die, die am einfachsten zu verwenden sind:

    http://msdn.microsoft.com/en-us/library/dd743834(VS.85).aspx

    Mit der API bastelst du dir ein Programm das immer schön Audio-Daten einliest. Und dann suchst du dir einen Algorithmus aus, mit dem du den Pegel bestimmst. Die einfachste Variante ist, den Audio-Stream in Blöcke von z.B. 1/10 Sekunde zu unterteilen, und in jedem Block den Wert mit dem grössten Betrag (Absolutwert) zu suchen.

    Dann hast du die max. Amplitude in diesem Block. Das ist die Lautstärke, und zwar linear. Das musst du dann nur noch in dB umrechnen:

    dB = log10(Leistung) * 10

    Dein ermittelter Wert ist allerdings eine Spannung. Um an die Leistung zu kommen, musst du umrechnen:

    Leistung = Spannug * Strom

    und

    Strom = Spannung / Widerstand

    D.h.

    Leistung = Spannug * Spannung / Widerstand

    Den Widerstand (z.B. des Lautsprechers) kennst du nicht, aber der ist auch egal - du willst ja nur wissen wie weit von der maximalen Leistung du entfernt bist. D.h. der kürzt sich wieder raus, und es bleibt

    dB = log10(Spannug * Spannung) * 10

    bzw. einfacher

    dB = log10(Spannug) * 20

    Tadaa.

    ps: damit du Werte von 0 bis -∞ bekommst, musst du den ermittelten Wert erstmal normalisieren. D.h. du dividierst den ermittelten Wert durch en maximal möglichen Wert. Bei 16 Bit (signed) wäre der (1 << 15).



  • Hi,

    danke für die Antwort!

    Mit dem Kabel möcht ich nicht zurück in den Laptop gehen, nutze auch den Eingang zum Mitschnitt des Audiosets.

    Auf der MS Seite gibts folgende Methode:

    "waveOutGetVolume Function"

    Die könnte genau das machen wonach ich suche 😕

    Könntest du mir vllt das "Grundgerüst" der Datei(en) erstellen, hab nämlich keine Ahnung davon, wie so etwas überhaupt aufgebaut ist. Am Algorithmus versuch ich dann mein bestes, aber was du vorgeschlagen hast, schwebte mir auch so im Kopf...

    Danke !!



  • Dorfler1000 schrieb:

    Mit dem Kabel möcht ich nicht zurück in den Laptop gehen, nutze auch den Eingang zum Mitschnitt des Audiosets.

    Dann halt nicht.

    Auf der MS Seite gibts folgende Methode:

    "waveOutGetVolume Function"

    Die könnte genau das machen wonach ich suche 😕

    Nein

    Könntest du mir vllt das "Grundgerüst" der Datei(en) erstellen, hab nämlich keine Ahnung davon, wie so etwas überhaupt aufgebaut ist.

    ROFL. Nein, ganz sicher nicht.



  • Eine Pegelanzeige ist meiner Meinung nach definitiv kein Anfängerprojekt mehr.
    Du brauchst eigentlich zwingend Multithreading (Darstellung, Data Acquisition, Audiocallbacks).
    Dann kommen Parameter für die Einschwingzeit und Abklingverhalten dazu.
    Dann kommt die gar nicht mal so einfache graphische Darstellung mit verschiedenen Farben, Max Hold mit Zeitkonstante, Skalendarstellung.

    Ich würde mir z.B. als Einstieg das Audioframework www.portaudio.com mal anschauen. Damit ist die Datenaufnahme schon mal etwas vereinfacht.

    Einschwingzeit und Abklingverhalten dazuzubauen ist schon etwas schwieriger. Zuletzt bleiben im beliebigen Umfang die graphischen Spielereien (da wirst du keine fertigen Komponenten finden, unabhängig vom GUI Toolkit).

    Falls dich das jetzt eher abgeschreckt hat kannst ja auch was fertiges nehmen:
    http://www.darkwood.demon.co.uk/PC/meter.html


Anmelden zum Antworten