Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从NAudio的StreamVolumeEventArgs.MaxSampleValue计算dB?_C#_Naudio - Fatal编程技术网

C# 如何从NAudio的StreamVolumeEventArgs.MaxSampleValue计算dB?

C# 如何从NAudio的StreamVolumeEventArgs.MaxSampleValue计算dB?,c#,naudio,C#,Naudio,我正在尝试实现一个音量计,以帮助用户选择他们的麦克风使用。我需要尽我最大的努力清除那些只有背景噪音的设备,并确保在它们说话时我会显示一些东西 我们目前在Unity3D应用程序中使用的是1.7.3版,因此没有与MMDevice相关的方法在崩溃时可用 我使用的是一个WaveInEvent,我将其馈送到WaveInProvider,然后将其馈送到SampleChannel。我将SampleChannel馈送到已订阅StreamVolume事件的MeteringSampleProvider 在我的OnP

我正在尝试实现一个音量计,以帮助用户选择他们的麦克风使用。我需要尽我最大的努力清除那些只有背景噪音的设备,并确保在它们说话时我会显示一些东西

我们目前在Unity3D应用程序中使用的是1.7.3版,因此没有与
MMDevice
相关的方法在崩溃时可用

我使用的是一个
WaveInEvent
,我将其馈送到
WaveInProvider
,然后将其馈送到
SampleChannel
。我将
SampleChannel
馈送到已订阅
StreamVolume
事件的
MeteringSampleProvider

在我的
OnPostVolumeMeter
事件处理程序中,当我收到
StreamVolumeEventArgs
(我将参数命名为
e
)时,我想知道如何计算分贝。我已经看到很多例子,从
e.MaxSampleValues[0]
中找出峰值体积(或者有时它似乎被称为振幅)。一些示例检查它是否为立体声信号,并将获取
e.MaxSampleValues[0]
e.MaxSampleValues[1]
之间的最大值

不管怎样,这个数字的值是多少?是百分比吗?当我乡下人调试到控制台时,它们是相对较小的小数(10^-3或10^-4)

计算结果是这样的吗

 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);
还是需要将峰值除以32768.0?如:

var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f);
这种方法完全不正确吗?我需要收集一个样本缓冲区,我进行RMS计算,计算平均值之和除以样本数的平方根,所有样本数除以32768,然后输入Log10


我已经看到了一些参考资料来查看NAudioDemo的AudioPlaybackPanel,它将音量计振幅设置为
e.MaxSampleValues[0]
e.MaxSampleValues[1]

的值查看您的发布日期这可能是一个对您来说已解决的问题,但其他人的好处就在这里

音频信号在波形中在负值和正值之间摆动。摆动的频率和摆动的幅度或高度会影响你听到的声音

你说的是正确的,你正在寻找振幅,看看音频是否存在

对于仪表,由于采样率远高于可能显示的任何仪表的刷新率,因此您需要使用math.max记录峰值,或者对多个采样进行平均。在您的情况下,这两种方法都可以工作,除非您试图以BDF显示精确的仪表,否则不需要进行db计算

在应用程序中,我一直在寻找根据音频的存在或缺少音频触发事件。我通常会将样本转换为浮点,这会给你一个介于0和1之间的范围,然后选择一个阈值,比如说0.2,如果有任何样本高于我们的音频


浮子还提供了一个很好的指示仪表用于显示。注意:如果你的应用程序是用于专业音频应用程序的,而你问的是准确的计量,我的答案将完全不同

看看你的发帖日期,这对你来说可能是一个已解决的问题,但从其他人的利益来看

音频信号在波形中在负值和正值之间摆动。摆动的频率和摆动的幅度或高度会影响你听到的声音

你说的是正确的,你正在寻找振幅,看看音频是否存在

对于仪表,由于采样率远高于可能显示的任何仪表的刷新率,因此您需要使用math.max记录峰值,或者对多个采样进行平均。在您的情况下,这两种方法都可以工作,除非您试图以BDF显示精确的仪表,否则不需要进行db计算

在应用程序中,我一直在寻找根据音频的存在或缺少音频触发事件。我通常会将样本转换为浮点,这会给你一个介于0和1之间的范围,然后选择一个阈值,比如说0.2,如果有任何样本高于我们的音频


浮子还提供了一个很好的指示仪表用于显示。注意:如果你的应用程序是用于专业音频应用程序的,而你问的是准确的计量,我的答案将完全不同

我也在看这篇维基百科文章,现在我想知道我在e.MaxSampleValues[]中得到的值是“振幅比”吗?[1] 我也在看这篇维基百科文章,现在我想知道我在e.MaxSampleValues[]中得到的值是“振幅比”吗?[1]