如何从NAudio的StreamVolumeEventArgs.MaxSampleValues计算dB?

时间:2016-08-09 00:32:21

标签: c# naudio

我正在尝试实施音量表,以帮助用户使用NAudio选择他们的麦克风。我需要尽我所能来清除那些只有背景噪音的设备,并确保我们在谈话时展示一些东西。

我们目前在Unity3D应用程序中使用1.7.3版本,因此当MMDevice相关方法崩溃时,没有任何相关方法可用。

我正在使用WaveInEvent我将WaveInProvider输入SampleChannel,随后我将其SampleChannel提供给MeteringSampleProvider。我将StreamVolume提供给我已订阅OnPostVolumeMeter活动的StreamVolumeEventArgs

在我的e事件处理程序中,当我收到e.MaxSampleValues[0](我将参数命名为e.MaxSampleValues[0])时,我想知道如何计算分贝。我已经看到很多例子从e.MaxSampleValues[1]中剔除了峰值音量(有时似乎被称为幅度)。一些示例检查它是否是立体声信号,并且会在 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); var dB = Mathf.Max(20.0f*Mathf.Log10(peak/32768.0f), -96.0f); 之间获取最大值。

无论如何,这个数字的值是多少?这是百分比吗?当我进行乡巴佬调试到控制台时,它们是相对较小的小数(10 ^ -3或10 ^ -4)。

计算是否类似,

e.MaxSampleValues[0]

或者我需要将峰值除以32768.0吗?如,

e.MaxSampleValues[1]

这种方法是完全错误的吗?我需要收集一个样本缓冲区,我进行RMS计算,我计算平均值之和的平方根除以样本数除以32768并输入进入Log10?

我看过几个引用来查看NAudioDemo的AudioPlaybackPanel,它将volumeMeter Amplitude设置为var filtreditems = from games in App.ApiGamesList //(my observable collection) select games.api_detail_url; mydatagrid.ItemsSource = filtreditems; 的值

1 个答案:

答案 0 :(得分:0)

查看你的帖子的日期这对你来说可能是一个已经解决的问题,但这里的其他人的好处就是这样。

音频信号在波形中的负值和正值之间摆动。您可以听到挥杆的频率和挥杆的振幅或高度。

你说你正在寻找振幅以确定音频是否存在是正确的。

对于仪表,由于采样率远高于您可能显示的任何仪表的刷新率,您需要使用math.max记录峰值或对多个样本进行平均处理。在你的情况下,任何一个都可以工作,除非你试图在bdFS中显示精确的仪表,否则不需要db计算。

在我一直希望根据音频的存在触发事物或缺乏音频的应用中。我通常将样本转换为浮点数,这将给出0到1之间的范围,然后选择一个阈值0.2,并说明是否有任何样本高于我们的音频。

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