我已经搜索了很长一段时间,但我一直无法找到一种方法来实际从 Android 上的麦克风获取 SPL/db 值。
我发现讨论它的少数线程和文章将其视为非常明显的事情,任何人都应该能够做到,并且更关心让他们的转换算法正确。
有谁知道如何做到这一点?
我已经搜索了很长一段时间,但我一直无法找到一种方法来实际从 Android 上的麦克风获取 SPL/db 值。
我发现讨论它的少数线程和文章将其视为非常明显的事情,任何人都应该能够做到,并且更关心让他们的转换算法正确。
有谁知道如何做到这一点?
在开发其他相关应用程序并进行研究时,我遇到了一些信息,这些信息对正在研究此类问题的任何人都有用。
您会看到,Android 手机上的麦克风将返回一个介于 0 和 +- 32,400 之间的值。在大多数情况下,任何超过 2,000 的声音都非常响亮,例如音乐会、俱乐部或机械噪音。“Relative Silence”大约是 30。但是,这些值的含义是相对的,并且会因手机而异。由于其中的麦克风,彼此相邻的几个设备将返回不同的值。这些值可能略有不同,也可能相差很多。
刚刚在我的办公室测试了几款不同的安卓手机,我发现在相同情况下,一些设备的返回值是其他设备的 10 倍。这就是为什么没有人说“是的,你可以获得分贝值,这里有一些示例代码:”因为实际上并没有真正可靠(且简单)的方法来做到这一点。
如果您将其上传到一台设备上,您可以获得 30 dB,但另一台设备会返回 300 dB。显然,如果没有大量的耳朵保护,没有人会处于 300 dB 的环境中。这些值必须作为相对值;它们是如何相互关联的。如果您想获得可以使用的值,“校准”,无论是动态的还是其他的,都是必须的。必须有一个既定的基线,不能来自你,它必须与你的价值进行比较。例如,如前所述,相对静音应该在 30 左右。
如果手机在相对安静的环境中返回 456,那么只需将您的 (30) 除以他们的 (456),您就有一个因素可以调整手机返回的值,使其与您期望看到的值相匹配,并且这些值可用于某种程度的可靠性。
这只是我在过去几个月中发现的,我希望它对某人有所帮助。
您必须首先禁用任何自动电平控制。我假设您要么知道,要么知道在哪里可以找到如何在没有 ALC 的情况下从麦克风录制样本。
从那时起,它基本上都是关于校准和对数幅度的。本质上,您将乘以与频率相关的校准或卷积,然后在所有或部分频率范围内取 10 * 对数幅度。
然后您必须进行一些校准测量,例如对实验室源的受控、已知 spl 进行频率扫描并记录产生的幅度与频率(如果您缓慢扫描,这与幅度与时间基本相同),或者您会用宽带伪脉冲(例如电火花、起动手枪等)击打它,你也在用良好的实验室设备在辐射对称位置进行跨频率测量,或者作为最后的手段,你使用一些已知的物理特性源来估计 SPL,并希望它在感兴趣的频率上足够平坦。
然后,您有两种选择如何应用修正。
一种选择是反转传递函数,计算时域脉冲响应,然后通过将其与输入信号进行卷积来应用频率平坦度校正,将其用作数字滤波器。然后,您可以取每单位时间结果的对数幅度来确定宽带 spl。
或者,您可以对输入数据进行 FFT 以生成频谱,然后将其乘以频率响应的倒数,然后取任何感兴趣的 bin(总和)的对数幅度。
不幸的是,几乎没有理由假设设备之间的粗略一致性,即使是同一型号。