2016-08-09 9 views
1

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]

+0

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

Antwort

0

am Tag Ihrer Post suchen, dies ist wahrscheinlich ein gelöstes Problem für Sie aber von den Vorteilen anderer hier geht.

Audiosignale schwingen zwischen negativen und positiven Werten in einer Welle. Die Frequenz des Schwungs und die Amplitude oder Höhe des Schwungs bewirken, was Sie hören.

Sie haben richtig gesagt, dass Sie nach der Amplitude suchen, um zu sehen, ob Audio vorhanden ist.

Bei einem Meter, da die Abtastrate viel höher ist als die Bildwiederholfrequenz eines Messgeräts, das Sie wahrscheinlich anzeigen, müssen Sie entweder den Spitzenwert mit math.max aufzeichnen oder einen Durchschnittswert über mehrere Abtastwerte ziehen. In Ihrem Fall würde beides funktionieren. Wenn Sie nicht versuchen, einen genauen Zähler in bdFS anzuzeigen, wird die db-Berechnung nicht benötigt.

In Apps, in denen ich auf der Suche nach Audio-Auslösern oder fehlenden Audiosignalen gesucht habe. Normalerweise konvertiere ich die Samples in einen Float, das gibt dir einen Bereich zwischen 0 und 1 und wähle dann einen Schwellenwert von 0.2 und sage, ob ein Sample darüber ist, dass wir Audio haben.

ein Schwimmer bietet auch eine schöne Anzeige für die Anzeige.Hinweis: Wenn Ihre App für eine Pro-Audio-Anwendung gedacht war und Sie nach genauen Messungen gefragt haben, wäre meine Antwort völlig anders.

Verwandte Themen