【问题标题】:Sound meter to measure Sound Pressure Level声压计测量声压级
【发布时间】:2015-07-04 11:21:55
【问题描述】:

我正在使用MediaRecorder 尝试创建一个返回声压级的声级计(我相信大多数人在提到以分贝为单位的日常音量时的意思)。

目前,我正在使用此实现来获取以分贝为单位的值:

return 20.0 * Math.log10(Math.abs(mMediaRecorder.getMaxAmplitude()) / 32768)

我不确定这是否正确。坐在一个除了风扇之外没有噪音的房间里,它返回的值介于 -30 和 -20 之间。如果我在麦克风附近讲话,它会跳到接近 -0.5 左右的值。

阅读本网站上的许多答案后,在没有校准设备的情况下测量 SPL 似乎很困难且很大程度上不可靠。但是,我不需要高度准确的结果,只需要适用于日常好奇心和非极端情况的结果。

有诸如Sensor Box for Android 之类的应用程序,它们似乎返回了不错的结果,无需校准即可启动。在同一个房间使用它,它返回的结果在 40-60dB 之间,当我说话时,它会跳到 80-90dB 的范围内。

如何复制这些结果?谢谢!

【问题讨论】:

  • 你说你不需要准确的结果,但有多准确?一个无意义的数字会以什么方式告诉你的好奇心?您的演示应用程序的结果似乎也很差。例如,在此处查看低 dBSPL 值:en.wikipedia.org/wiki/Sound_pressure#Examples_of_sound_pressure 您的示例应用程序需要注意的是,它们仅声明有关“强度变化”的信息,为此,校准并不重要,我猜他们只报告“dB”而不是“dBSPL”。
  • 我想我不需要高度准确的结果的意思是我希望该应用程序的性能类似于人们以 10-15 美元在商店购买的任何简单的声级计。没有什么高端和高精度,但也不是随机的。
  • 顺便说一句,在传感器框中返回“体面”的结果-快速查找说 80-90 对语音来说太高了。 80-90 是长期听力损伤范围,相当于交通繁忙的道路。请记住,偏离 1 dB 是对数,所以这并不意味着稍微多一点,而是意味着噪声增加一个数量级。 en.wikipedia.org/wiki/Sound_pressure#Examples_of_sound_pressure
  • 仅使用手机的标准麦克风尽可能准确。我只是说不如音频专业人士可能使用的昂贵的声级计准确。
  • 我认为你们都对 Sensor Box 应用程序的不准确性是正确的,因为当我在电话附近以正常的声音说话时,它始终返回约 80-90 dB 的测量值。

标签: android audio


【解决方案1】:

您的第一个问题是分贝不是一个精确的测量值 - 它是一个信噪比。您需要进行基本测量,并且需要测量信号幅度与基线噪声的比率。光是幅度是没有意义的。

你的第二个问题 - 你从哪里得到 32768?公式应该是20.0 * Math.log10(Math.abs(signal/baseline))

【讨论】:

  • 我使用 32,768 是因为阅读了许多其他问题,似乎 getMaxAmplitude() 返回无符号 16 位整数值,并且在许多答案中建议除以 32,767 或 32,768 以标准化返回值。我不确定这是否正确,开发人员指南也不清楚。你用什么baseline?一些答案提到,产生一些基线音并用它来测量/消除环境噪声可能更合适,但我不知道该怎么做。我链接的 Sensor Box 应用也无需校准即可启动。
  • 我不知道一些随机应用程序在做什么,但如果它声称读取分贝而不是校准,它只是在编造数字。您无法在没有基线的情况下测量分贝——这在物理学上是不可能的。如果他们使用硬编码的基线值,那么在大多数设备上都是非常错误的。
  • 至于基线应该是什么——静默时房间里的 getMaxAmplitude 的值会很好。
  • 事先捕获基线并在以后使用它是我最好的建议。
  • "自上次调用后测得的最大绝对幅度,第一次调用时为0"第一次总是返回0。这样会使得除法的结果无穷大。改为从二读开始。
猜你喜欢
  • 2014-07-29
  • 2017-02-23
  • 2012-01-30
  • 2012-12-17
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多