J'essaie de mettre en œuvre un compteur de volume pour aider les utilisateurs à sélectionner leur microphone en utilisant NAudio. Je dois faire de mon mieux pour éliminer les appareils qui ont juste du bruit de fond et m'assurer de montrer quelque chose quand ils parlent.Comment calculer dB à partir de StreamVolumeEventArgs.MaxSampleValues de NAudio?
Nous utilisons actuellement la version 1.7.3 dans une application Unity3D donc aucune des approches liées MMDevice
n'est disponible en cas de panne.
J'utilise un WaveInEvent
que j'alimente dans un WaveInProvider
que j'alimente par la suite à un SampleChannel
. Je nourris le SampleChannel
dans un MeteringSampleProvider
auquel j'ai souscrit à l'événement StreamVolume
.
Dans mon gestionnaire d'événements OnPostVolumeMeter
lorsque je reçois le StreamVolumeEventArgs
(j'ai nommé le paramètre e
) Je me demande comment calculer les décibels. J'ai vu beaucoup d'exemples qui pêchent le volume de pointe (ou parfois il semble être appelé une amplitude) de e.MaxSampleValues[0]
. Quelques exemples vérifient s'il s'agit d'un signal stéréo et saisiront le maximum entre e.MaxSampleValues[0]
ou e.MaxSampleValues[1]
.
Quoi qu'il en soit, quelles sont les valeurs de ce nombre? Est-ce un pourcentage? Ce sont des décimales relativement petites (10^-3 ou 10^-4) quand je débloque hillbilly à la console.
Le calcul est quelque chose comme,
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);
ou dois-je diviser par pic 32768,0? Comme dans
var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f);
Cette approche est totalement incorrecte et je dois recueillir un tampon d'échantillons que je fais un tri efficace de calcul où je calcule la racine carrée de la somme des moyennes divisée par le nombre d'échantillons tout divisé par 32768 et nourrir dans le Log10?
J'ai vu plusieurs références à regarder la AudioPlaybackPanel du NAudioDemo et définit l'amplitude volumeMeter être les valeurs de e.MaxSampleValues[0]
et e.MaxSampleValues[1]
Je regardais aussi cet article [1] Wikipedia et maintenant je me demande est la valeur que j'obtiens dans e.MaxSampleValues [] un "ratio d'amplitude"? [1] https://en.wikipedia.org/wiki/Decibel#Absolute_measurements – Scott