Zahlenräume, Audiosignale, dB Lautstärke // Bass.dll

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zahlenräume, Audiosignale, dB Lautstärke // Bass.dll

    Hi,

    mein Mp3-Player-Programm wird immer komplexer. Ich habe zur Erstellung die Bass.dll (un4seen.com) benutzt. Erst standen andere Dinge im Vordergrund (OpenFile,Play,Pause Steuerung über Serial Port mit Arduino etc.) jetzt komm ich an den Punkt an dem ich mich "echt" mit dem Thema Lautstärke beschäftigen muss.

    Nach vielen Stunden der Internetrecherche (Auffrischung meines nicht mehr vorhandenen Schul & Studium Wissens ;))

    Nur zur Erinnerung (kann überlesen werden):
    Spoiler anzeigen
    0 dB Schalldruck -> 20 µPa (Schalldruck ist der Referenzwert = 1 kHz Hörschwelle für gesundes menschliches Ohr) in Bezug auf diesen Wert kann dann errechnet werden:
    P0= Ref Wert 20 µPa
    P= gemessener Wert / zu bewertender Wert

    20*log10(P/P0)= Verhältnis in dB (z.B. P ist 6 dB lauter als P0)

    Das ganz Thema ist nicht trivial. Für Interessierte werden die Zusammenhänge meiner Meinung nach hier sengpielaudio.com/Rechner-schallleistung.htm ganz gut erklärt.

    Audiosignale werden bei der Digitalisierung quantisiert -> Ein analoges Signal wird in diskrete Werte übersetzt. Bei einer Abtastrate von 44,1 KHz wird also 44,1 tausendmal pro Sek. "geschaut" wie laut ist das analoge Signal und diese Werte/Pegel werden dann in der Genauigkeit 8 bit, 16 bit,24 bit ... abgespeichert.




    Beginn der eigentlichen Frage:

    Alle Audio Dateien egal Mp3, Ogg,.. werden alle in das RAW Format konvertiert bevor sie weiterverarbeitet werden (RAW Format bedeutet nichts weiter, als dass die Amplitudenwerte in dekomprimierter Form vorliegen)

    In der Anleitung zur Bass.dll steht folgendes:
    ---------
    Utils.LevelToDB Method (Double, Double)

    Converts any level value to its dB value.


    level
    Type: System.Double
    The level to convert, as a double value.

    maxLevel
    Type: System.Double
    The maximum value allowed as a double level value (e.g. use 32768.0 for 16-bit stream levels or use 1.0 for 32-bit floating streams).
    -----------

    Frage 1:
    Im VB.net Zahlenraum short = Int16 von -32.768 bis 32.767 würde das bedeuten 32.767 max positive Amplitude, -32.768 max neg. Amplitude und 0 = Stille.
    Jetzt könnte man das Verhältnis aktueller Zahlenwert des Audiostream z.B. 15823 zur max Amplitude bei Int16 berechnen.

    20*log10(15823/32767) = -6,3229 dB sprich der Wert des aktuellen Audiosignalssamplewerts ist 6 dB leiser als das Maximum.

    Ich nehme an, dass Bass.dll den Betrag zu der dB Berechnung nimmt also ist es egal ob pos. oder neg. Amplitude.

    Hört sich das stimmig an?


    Frage 2:
    Wie sieht das bei "single Float" Stream aus? Ich hab das so interpretiert, dass single fload in VB.net für single steht. Also der Wertebereich von -3.4028235E+38 bis -1.401298E-45 † for negative values;1.401298E-45 bis 3.4028235E+38 † for positive values geht.
    In Bass.dll steht weiter das die Werte zwischen -1.0 und 1.0 liegen. 0 ist dann wohl Stille und -1.0 neg. max Amplitude und 1.0 max pos. Amplitude des Audiosignals.

    Würde das bedeuten, dass vom Single-Zahlenraum nur folgende Werte genommen werden -1.0 E-44 bis 1.0 E-44 (im Gegensatz zu int16 wo der gesamte Zahlenraum benutzt wird)?

    Frage 3 (auch single float):
    Und weiter steht, dass auch mit Zahlen größer/kleiner als 1 / -1 weitergerechnet wird es also kein "clipping" gibt. Soundeffekte können so genauer berechnet werden.
    Was passiert den mit Werten die größer als 1 / -1 sind bei der Rückgabe an den D/A Wandler oder wo wird das abgearbeitet?


    Mein Ziel ist, dass ich im GUI des Mp3-Players Zahlenwerte zu dem abspielenden Mp3-Audiostream anzeigen kann (Lautstärke, Wirkung des EQs etc.).

    Ja das soll es dann erst mal gewesen sein. Da es ja doch sehr spezielle Fragen sind, haut einfach mal was raus was eventuell helfen könnte.

    *Topic verschoben*
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!