2016-08-09 2 views
1

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]

+0

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

Répondre

0

recherche à la date de votre message c'est probablement un problème résolu pour vous, mais du bénéfice des autres va ici.

Les signaux audio oscillent entre les valeurs négatives et positives dans une onde. La fréquence du swing et l'amplitude ou la hauteur de l'effet de swing que vous entendez.

Vous avez raison de dire que vous cherchez l'amplitude pour voir si l'audio est présent. Pour un compteur car la fréquence d'échantillonnage est beaucoup plus élevée que la fréquence de rafraîchissement de tout compteur que vous êtes susceptible d'afficher, vous devrez soit enregistrer le pic en utilisant math.max, soit faire une moyenne sur un certain nombre d'échantillons. Dans votre cas, cela fonctionnerait, sauf si vous essayez d'afficher un compteur précis dans bdFS, le calcul db ne serait pas nécessaire.

Dans les applications où j'ai cherché à déclencher des choses basées sur la présence de l'audio ou de leur manque de. Normalement, je convertis les samples en un float, cela vous donnera une plage entre 0 et 1, puis choisissez un seuil dit 0.2 et dites si un échantillon est au-dessus de ce que nous avons audio.

Un flotteur fournit également un bon indicateur pour l'affichage.Notez que si votre application était destinée à une application audio professionnelle et que vous posiez des questions sur une mesure précise, ma réponse serait totalement différente.