如何比较两个捕获以查看哪个更响亮?

时间:2010-10-30 21:02:01

标签: c# algorithm audio windows-phone-7

鉴于从麦克风捕获的两个字节数据阵列,我如何确定哪个数据的噪声更多?我假设有一个算法我可以应用于数据,但我不知道从哪里开始。

归结起来,我需要能够确定婴儿何时哭泣,以及房间内的环境噪音。

如果有帮助,我使用Microsoft.Xna.Framework.Audio.Microphone类来捕获声音。

4 个答案:

答案 0 :(得分:4)

您可以通过应用公式将每个样本(标准化范围为1.0到-1.0)转换为分贝评级

dB = 20 * log-base-10(样本值)

老实说,只要你不介意偶尔的假阳性,并且你的麦克风设置好了,你应该没有问题,告诉婴儿哭闹和环境背景噪音之间的区别,而不必经历麻烦进行FFT。

我建议您查看一个噪声门的源代码,它可以完成你所追求的,可配置的攻击时间和时间。阈值。

答案 1 :(得分:2)

首先使用快速傅里叶变换将信号转换为频域。 然后检查典型“哭频”中的信号是否明显高于其他振幅。

speex编解码器的预处理器支持噪声与信号检测,但我不知道你是否可以使用XNA。

或者,如果您真的想要某种响度,请计算您感兴趣的频率(例如50-20000Hz)的幅度平方和,以及过去30秒内的平均值是否显着高于过去10分钟或超过一定绝对阈值的平均值发出警报。

答案 2 :(得分:0)

大声点什么?信号的平均幅度会告诉你哪一个平均平均,但这是一种愚蠢,蛮力的方式。它虽然可能对你有用。

  

归结起来,我需要能够确定婴儿何时哭泣,以及房间内的环境噪音。

好的,所以,我只是在这里抛出想法;我绝不是音频处理方面的专家。

如果你知道你的输入,即婴儿哭(相对较大的高音)与环境噪音(相对安静),你应该能够根据音高(频率)和幅度(响度)分析信号。当然,如果他在录制期间有人将一些锅碗瓢盆放到厨房地板上,那将很难辨别。

作为第一遍,我将简单地遍历信号,保持音高和幅度的标准偏差,然后在这些偏差超过某个您必须定义的阈值时设置一个标志。当他们回来时你可以安全地认为你抓住了婴儿的哭声。

再一次,在这里给你一个想法。您必须看到它在实践中如何与实际数据一起使用。

答案 3 :(得分:0)

我同意@Ed Swangren,很多资源的数据样本需要花费很多时间。对我来说,听起来好像是限制或希望消除误报。我对婴儿的体验是,他们比环境更响亮地哭泣。因此,跟踪正常环境的平均测量值(频率/安培/ ??),然后分类变化与哭泣婴儿的特征相匹配的程度,这些特征从孩子到孩子都会发生变化,因此您可能需要一个系统“学习”。祝你好运。

更新:您可能会发现此库有用http://naudio.codeplex.com/