如何比较 Android 和 iOS 的振幅

How to compare amplitude from Android with iOS

所以我阅读了各种关于如何从 Android 上的麦克风获取振幅的帖子和博客。多个帖子建议使用此实现:

 minSize = AudioRecord.getMinBufferSize(
            44100,
        AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.ENCODING_PCM_16BIT
    );
    audioRecord = AudioRecord(
        MediaRecorder.AudioSource.MIC,
            44100,
        AudioFormat.CHANNEL_IN_MONO,
        AudioFormat.ENCODING_PCM_16BIT,
        minSize
    );
 val buffer = ShortArray(minSize)
    audioRecord.read(buffer, 0, minSize)
    var max = 0
    for (s in buffer) {
        if (abs(s.toInt()) > max) {
            max = abs(s.toInt())
        }
    }
    return max.toDouble()//This being the amplitude

第一个问题:我得到的返回值的测量值是多少?该值的示例通常可以是 381,带有“常规噪声”,例如毫伏 (mV)?

在 iOS 上,您可以从 AudioRecorder 获得 averagePower 和 peakPower,returns dbFS 中的平均或最大振幅。

第二个问题: 是否可以在 iOS 上执行与 Android 相同的实现?

第三个问题:是否可以在Android上执行与iOS相同的实现?

提供一些背景信息;作为研究项目的一部分,我们正在寻找可能 link 用户对特定环境的不同声音模式,为了在更大范围内这样做,我们需要能够比较来自 Android 和 iOS.

第四个问题:不管上面提到的实现方式如何,有没有更好的方法来比较iOS和Android设备的麦克风发出的声波?

在 Android 上获得最大振幅的最简单方法是减少代码量。只需调用 MediaRecorder.getMaxAmplitude()。它 returns 自上次调用以来的最大振幅。我不确定你从哪里得到使用你所做的调用的建议,这似乎很难。

未指定单位。它应该对应于麦克风拾取的压力量,但由于每个型号都有不同的麦克风、放大器、DAC 等,它不会在所有设备上都相同。你所能得到的只是它会在 0 和 (2^x)-1 之间,其中 x 是你选择的每个样本的位数。我不确定为什么您认为它会以毫伏为单位,这不是电气测量。声音通常以 dB 或帕斯卡为单位进行测量。

比较 iOS 和 Android 并尝试匹配 - 你想做什么?您拥有的代码只是找到最大值。这有点无趣,除非你所做的只是一个掌声计。如果您真的想比较声波,那么在频域中进行傅立叶变换不是更好吗?时域真的很乱。