Ich versuche einen Lautstärkemesser zu implementieren, um Benutzern zu helfen, ihr Mikrofon mit NAudio auszuwählen. Ich muss mein Bestes tun, Geräte auszumerzen, die nur Hintergrundgeräusche haben und sicherstellen, dass ich etwas zeige, wenn sie sprechen.Wie berechnet man dB aus StreamVolumeEventArgs.MaxSampleValues von NAudio?
Wir verwenden derzeit Version 1.7.3 in einer Unity3D-Anwendung, so dass keine der verwandten Ansätze verfügbar sind, wenn sie abstürzen.
Ich verwende eine WaveInEvent
, die ich in eine WaveInProvider
füttere, die ich anschließend zu SampleChannel
füttere. Ich füttere die SampleChannel
in eine MeteringSampleProvider
, die ich unter dem StreamVolume
Ereignis abonniert habe.
In meiner OnPostVolumeMeter
Event-Handler, wenn ich die StreamVolumeEventArgs
(ich nannte den Parameter e
) Ich frage mich, wie Dezibel zu berechnen. Ich habe viele Beispiele gesehen, die das Spitzenvolumen (oder manchmal scheint es als eine Amplitude bezeichnet) aus e.MaxSampleValues[0]
herauszufischen. Einige Beispiele prüfen, ob es sich um ein Stereosignal handelt und greifen das Maximum zwischen e.MaxSampleValues[0]
oder e.MaxSampleValues[1]
.
Wie auch immer, was sind die Werte dieser Nummer? Ist es ein Prozentsatz? Sie sind relativ kleine Dezimalzahlen (10^-3 oder 10^-4), wenn ich Hillbilly auf die Konsole debugge.
Ist die Berechnung etwas wie
var peak = e.MaxSampleValues[0];
if (e.MaxSampleValues.Length > 1)
{
peak = Mathf.Max(e.MaxSampleValues[0], e.MaxSampleValues[1]);
}
var dB = Mathf.Max(20.0f*Mathf.Log10(peak), -96.0f);
oder muss ich Spitze von 32.768,0 teilen? Wie in,
var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f);
Ist dieser Ansatz völlig falsch und ich brauche einen Puffer von Proben zu sammeln, die ich eine RMS Art der Berechnung zu tun, wo ich die Quadratwurzel aus der Summe der Mittelwert durch die Anzahl der Proben geteilt berechnen alle geteilt durch 32768 und füttern das in das Log10?
Ich habe mehr Referenzen gesehen am AudioPlaybackPanel des NAudioDemo schauen und es setzt die volumeMeter Amplitude die Werte von e.MaxSampleValues[0]
und e.MaxSampleValues[1]
Ich schaute auch auf diesen [1] Wikipedia-Artikel und jetzt frage ich mich, ist der Wert, den ich in e.MaxSampleValues [] ein "Amplitudenverhältnis" bekomme? [1] https://en.wikipedia.org/wiki/Decibel#Absolute_measurements – Scott