Lautstärkeauswertung in C#

Status
Für weitere Antworten geschlossen.

dgoersch

Benutzer
Hallo zusammen,

meine Frage hat zwar nicht direkt mit Radio zu tun, aber da hier viel Know-how im Bereich der Akkustik vorhanden ist, hoffe ich es sei mir gestattet sie trotzdem zu stellen. Es geht bei der ganzen Angelegenheit nicht um ein präzises Werkzeug zum Aussteuern, sondern lediglich um die Ansteuerung von Digitalen LED-Stripes (also nur Eyecandy - Sound2Light).

Aktuell arbeite ich daran die Lautstärke auf einem Windows-System auszuwerten. Für Windows Vista und 7 gibt es in der NAudio-Lib eine recht einfache Variante direkt vom Mixer die Werte zu beziehen. Das Funktion gibt einen Wert (float) zwischen 0 und 1 zurück. Ich Multipliziere diesen Wert mit 30 und steuer damit 30 Pixel (LEDs) des Stripes an (jede Dezimalstelle für einen Pixel). Das Ganze klappt grundsätzlich, aber das Verhalten dieses "VU-Meters" ist irgendwie total unnatürlich. Im oberen Bereich ist überhaupt keine Dynamik, ab einer gewissen Lautstärke "klebt" es einfach oben fest. Es scheint so, dass das Problem hier bei Windows selber zu suchen ist, die Pegel-Anzeige im Mixer zeigt nämlich das selbe Verhalten.

Nun habe ich überlegt alternativ direkt den PCM-Datenstrom auszuwerten. NAudio liefert hierfür alle 100ms ein Array mit (Samplerate/10) * 2 Bytes zurück. Jeweils zwei Bytes zusammen gesetzt ergeben einen 16bit-Frame.
Nach einer FFT habe ich Zugriff auf belibige Frequenzen und kann deren Pegel auswerten. Nun ist aber die Frage, wie ich daraus die Lautstärke aggregiere. Welche Bänder sollte ich mit welcher Gewichtung verwenden? Gibts da ein übliches Verfahren?

Ich weiss, dass man auch einfach alle gesetzten Bits in einem PCM-Frame auswerten kann, aber auch das wirkt irgendwie nicht natürlich, hier fehlt im unteren Bereich jegliche Dynamik.

Da wir ja nicht alle Frequenzen gleichstark wahrnehmen, denk ich mir, dass die unterschiedliche Gewichtung der Bänder hier mehr hergeben könnte.

Hoffe ich hab mich verständlich ausgedrückt und ihr habt ein paar Tipps für mich.
Gruß Dominique Görsch

PS: Bei Bedarf versuche ich gerne ein Video des aktuellen Verhaltens zu erstellen.
 
AW: Lautstärkeauswertung in C#

Ich Multipliziere diesen Wert mit 30 und steuer damit 30 Pixel (LEDs) des Stripes an (jede Dezimalstelle für einen Pixel). Das Ganze klappt grundsätzlich, aber das Verhalten dieses "VU-Meters" ist irgendwie total unnatürlich. Im oberen Bereich ist überhaupt keine Dynamik, ab einer gewissen Lautstärke "klebt" es einfach oben fest.

Durch das einfache Multiplizieren verwendest du eine lineare Skala. Gängige Pegelanzeigen haben allerdings eine logarithmische Skala. Schon deshalb wird dir die Anzeige "unnatürlich" vorkommen.

Weiterhin musst du eine bestimmte Trägheit sowie Rücklaufzeit berücksichtigen, um das Verhalten eines echten Peakmeters zu simulieren.
 
AW: Lautstärkeauswertung in C#

Das ist mir schon klar, aber wenn die Anzeige ohnehin oben "klebt" würde eine trägerer Rücklauf diesen Effekt nur vertärken. Wenn du dir mal im Mixer von Windows Vista oder Windows 7 die Pegelanzeige anschaust, wirst du sehen was ich meine. Da ich mit der einfachen Variante genau daher meine Daten beziehe, hab ich schon total schlechte Datenbasis.

Die vorgenannten Links helfen mir schon etwas weiter denke ich. Danke dafür.
Die Gewichtung der Frequenzen wird also über die RLB-Kurve gemacht.
Wozu dient aber noch der Pre-Filter?
Addiere ich die Ergebnisse der Gewichtung einfach und Teile durch die Anzahl?
Und reicht es, wenn ich das Spektrum beispielsweise in 10 Bänder aufsplitte, diese anhand der Kurve gewichte und dann das Ergebnis quadriere?

Wegen dem Logarithmus: Wende ich den vor oder nach dem Quadrieren an?
 
AW: Lautstärkeauswertung in C#

Im ersten Ansatz würde ich nichtmal so kompliziert rangehen. Frequenzgewichtung gibt es bei den Peakmetern z.B. nicht, die integrieren nur je nach Zeitkonstante (1 ms oder laut DIN 10 ms) und geben das dann auf die Anzeige, deren Skalierung halt festgelegt ist.

Schau Dir mal die Skalierung der üblichen Peakmeter an:



oder in Digitalien:



Ein brauchbares Software-Meter zum "Abgucken" der Skalierung wäre z.B. der Pinguin:




Wenn ich jetzt nicht grob Gedankenfehler habe, wäre ein erster Ansatz:

Werte die Samples alle einzeln aus, so wie sie reinkommen.

Richte die Samples gleich, so der von Windows gemeldete Wert das nicht schon in sich hat. falls der nur je nach Aussteuerung 0 bis 1 zurückgibt, dürfte das schon geschehen sein. "Echte" Samples müßtest Du entsprechend umrechnen (auf analoge "Mitte" bringen und dann den Betrag bilden).

Logarithmiere das Ergebnis so, daß es von den Werten her auf die Skalierung paßt, die Du auf den Fotos siehst. Also bei Eingangswerten von 0 bis 1 dann halt 20 * log (Eingangswert) = dBfs-Wert und den dann auf dieser Skala "verteilen". Bei 30 LEDs könnte ich mir da noch eine Tabelle vorstellen, die den LEDs Mindest-"Spannungs"werte zuweist und dann abgefragt wird. Dürfte einfacher sein, als eine Funktion zu finden, die wirklich genau paßt, ich bin aber kein Programmierer...

"Schieße" die Anzeige auch bei nur einem solchen Sample auf diesen Wert (Integrationszeit 0 ms, also trägheitslose Anzeige) und lasse ab dann einen "Kondensator-Entlade-Algorithmus" laufen, der den Sample-Wert vor der Logarithmierung langsam mit e-Funktion gegen Null bringt, so wie sich ein Kondensator über einen Widerstand entlädt. Dimensionierung etwa so, daß man in 1.5 Sekunden von Vollanzeige (0 dB) auf -20 dB kommt.

Solange die neu eintreffenden Samples unter dem momentanen "Kondensator-Wert" liegen, lass einfach nach der Kondensatorformel weiter entladen und ignoriere dieses Sample. Wenn das neue Sample über dem momentan gültigen "Kondensator-Wert" liegt, refreshe den Kondensator-Wert auf den Sample-Wert und starte die virtuelle Entladung neu von dieser Stelle aus.

Genau da ist eine Unsauberkeit im Vergleich zur Funktionsweise analoger Schaltungstechnik, sagt mir zumindest mein Bauch, ohne das jetzt durchgerechnet zu haben (lange her).

Vgl. auch http://de.wikipedia.org/wiki/Aussteuerungsmesser
 
AW: Lautstärkeauswertung in C#

Weiß eigentlich jemand, was das genau für eine Funktion ist, die der skala der digitalen Peakmeter (z.B. dem RTW mit dBfs-Skala nach DIN IEC 60268-18) zugrunde liegt?

Die scheint ja irgendwie logarithmisch zu sein - ganz rechts ist 0, ganz links geht es gegen minus unendlich. Es ist aber nicht einfach nur die Umkehrfunktion der dB-Funktion, sonst wäre -6dB (~ 0,5 Pegelwert) in der Mitte und nicht ca. -20dB.

Mathematiker vor!
 
AW: Lautstärkeauswertung in C#

Ohne mich weiter damit befasst zu haben, ein Hinweis, den mir der gute TSD einst gab, als ich eine VU-Anzeige in einem Soundcraftpult (20 oder 24 LEDs waren das, mit Komparatoren davor, deren Spannungsteiler für die Referenzwerte man hätte modifizieren können) hinsichtlich Ballistik und Skalierung einigermaßen an DIN (10 ms) anpassen wollte: denk einfach an den Rücklauf.

Mache Vollausschlag und schalte das Signal ab. Der Rücklauf dürfte eine Entladefunktion eines RC-Glieds sein, deren zeitlichen Verlauf kann man ja ausrechnen. Die Skalierung der Anzeige (erstmal: die Verteilung der Segmente) muß nun so erfolgen, daß die Anzeige gleichmäßig zurückläuft und nicht ruckelt, also in bestimmten Abschnitten schneller läuft und in anderen Abschnitten langsamer.

Das setzt die Werte der einzelnen "Lampen", erst danach schreibt man sich an die passende Stelle die glatten dB-Werte. Bei den hochauflösenden Gasplasmadisplays sieht man es nicht, aber bei den kurzen Anzeigen zur "Anwesenheitskontrolle" erkennt man es: die glatten dB-Werte sitzen nicht zwangsläufig dort, wo die Lampen sitzen. Ich finde dummerweise gerade kein Foto von diesen kleinen Anzeigen.
 
AW: Lautstärkeauswertung in C#

Das beantwortet meine Frage nicht.

Ich suche die Funktion f(x)=y, so dass x der Pegelwert in dB ist, und y die Breite/Höhe des angezeigten Balkens, meinetwegen in Prozent der Gesamthöhe/Breite.

Natürlich könnte ich jetzt mit dem Linear an meinem RTW nachmessen und eine Umrechnungstabelle erstellen. Wenn man sich eine LED-Kette baut, bei denen es nur ein paar diskrete "Messpunkte" gibt, mag das ein praktikabler Ansatz sein. Nicht aber, wenn man den Balken in einer Software darstellen möchte, und er dort noch beliebig skaliert werden soll.

Irgendwas muss sich doch RTW bei der nicht-linearen (weder in Bezug auf die dB-Wert noch auf die linearen Pegelwerte) Einteilung der Skala gedacht haben.
 
AW: Lautstärkeauswertung in C#

Irgendwas muss sich doch RTW bei der nicht-linearen (weder in Bezug auf die dB-Wert noch auf die linearen Pegelwerte) Einteilung der Skala gedacht haben.

Das müsste doch in der Norm DIN IEC 60268-10 (Nachfolger von DIN 45406) spezifiziert sein. Ich habe die leider nicht, weil ich dafür keine Euro 70.- hinblättern möchte.

Vielleicht hat jemand darauf Zugriff?

LG

Jean
 
AW: Lautstärkeauswertung in C#

Hallo


Also wenn -20dBFS bei etwa 50% landen sollen, dann könnte man...

y = a * b^x

mit

a = 100.03146 (evt. auch 100.0)
b = 1.0353487

x in dBFS (-144 bis 0)
y in Prozent der Balkenlänge

nehmen.

Auf jeden Fall ist damit der Bereich über -20dB gedehnt, da praktisch die Hälfte des Balkens noch zur Verfügung steht.

-0 -> 100
-3 -> 90
-6 -> 81
-9 -> 73
-12 -> 66
-15 -> 59
-18 -> 53
-21 -> 48

Das wird jetzt also "ganz schön" zappeln... ;)




Grüßle Zwerg#8
 
AW: Lautstärkeauswertung in C#

Nachtrag:

Ein besserer "Fit" mit den "gewünschten" Wertepaaren

-144 0%
-35 25%
-20 50%
-10 75%
-0 100%

ergibt sich über

y = (a+bx) / (1+cx+dx^2)

a = 99.948711
b = 0.7284301
c = -0.010247393
d = 0.00129207
(Im Programm würde ich dafür aber eine Lookuptable anlegen...)


0 99.9487
-3 93.7895
-6 86.2619
-10 75.2341
-20 49.5884
-35 25.3119
-40 20.3645
-60 8.97546
-70 6.08298
-80 4.13065
-96 2.161
 
Aussteuerungsmesser-Skala

Weiß eigentlich jemand, was das genau für eine Funktion ist, die der skala der digitalen Peakmeter (z.B. dem RTW mit dBfs-Skala nach DIN IEC 60268-18) zugrunde liegt?

Die scheint ja irgendwie logarithmisch zu sein .... Mathematiker vor!

Hallo @Yps, ich fürchte die Mathematiker können hier nur spekulieren und empirische Formeln entwickeln ...

Soweit ich mich erinnern kann wurde das Skalen-"Layout" einfach von den ersten Lichtzeiger-Instrumenten übernommen.

attachment.php


Weder in der der alten DIN 45406 noch in der IEC 268-10(I) ist sie genau definiert worden. Man findet lediglich:

DIN 45406 schrieb:
"Um einen großen Pegelbereich überwachen zu können, ist die dB- (oder Np-) Skale des Anzeigeinstrumentes annähernd linear. (..)

Anzeigebereich -50 dB bis +5 dB (analog)​
"

oder "to be specified". :cool:
 

Anhänge

  • S&H-Lichtzeiger-Instrument_Skala.jpg
    S&H-Lichtzeiger-Instrument_Skala.jpg
    14,9 KB · Aufrufe: 107
AW: Aussteuerungsmesser-Skala

Hallo!

Hallo @Yps, ich fürchte die Mathematiker können hier nur spekulieren und empirische Formeln entwickeln ...

Einspruch! ;) Ich bin zwar kein Mathematiker, melde mich aber trotzdem zu Wort. Oben habe ich ja schon eine Formel in der Form

y = a * b^x

geliefert.

Ich habe dabei aber leider einen kleinen Fehler gemacht. Der genaue Wert für b lautet

b = 1.0352649

a ist beliebig, dient nur zur Skalierung.

Da ist die Exponentialfunktion (Kondendator) schon drin versteckt. Wer unbedingt ein "e" in der Formel sehen will. Bitteschön:

y = a * e^(b*x)

a ist beliebig, dient nur zur Skalierung.
b = 0.034657359


Grundlage dieser beiden Formeln sind die "ganzen" Wertepaare:

-60 dBFS -> 0.125
-40 dBFS -> 0.25
-20 dBFS -> 0.50
0 dBFS -> 1.0

Die Annahme, daß -35dBFS bei 25% liegen soll (wie im Foto vom Waver oben zu sehen) war also falsch! Auch -10dB können nie und nimmer bei 75% landen.

Wenn man in den Formeln oben für x die Zahl "-10" einsetzt, kommt für y

0.707105781

raus. Diese Ziffernfolge ist lustigerweise nix anderes als der Sinus von 45°...


Der OP hat ganz zu Anfang gesagt, daß er Samplewerte von 0,0 bis 1,0 geliefert bekommt. In Fachkreisen nennt man das "Normalized Samplevalues".

Unsere Wertetabelle sieht jetzt (ohne dB und auf 1 normalisiert) also folgendermaßen aus:

0.001 -> 0.125
0.01 -> 0.25
0.1 -> 0.50
1.0 -> 1.0

Die passende Formel lautet

y = x^b

b = 0.30103

b ist nix anderes als log(2).


Grüßle Zwerg#8
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben