我正在尝试实施音量表,以帮助用户使用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;
的值
答案 0 :(得分:0)
查看你的帖子的日期这对你来说可能是一个已经解决的问题,但这里的其他人的好处就是这样。
音频信号在波形中的负值和正值之间摆动。您可以听到挥杆的频率和挥杆的振幅或高度。
你说你正在寻找振幅以确定音频是否存在是正确的。
对于仪表,由于采样率远高于您可能显示的任何仪表的刷新率,您需要使用math.max记录峰值或对多个样本进行平均处理。在你的情况下,任何一个都可以工作,除非你试图在bdFS中显示精确的仪表,否则不需要db计算。
在我一直希望根据音频的存在触发事物或缺乏音频的应用中。我通常将样本转换为浮点数,这将给出0到1之间的范围,然后选择一个阈值0.2,并说明是否有任何样本高于我们的音频。
浮子还提供了一个很好的指示仪表用于显示。请注意,如果您的应用是专业音频应用程序,并且您询问准确计量,我的答案将完全不同。