首页 > 解决方案 > 如何比较 Android 和 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,它返回 dbFS 中的平均或最大幅度。

第二个问题:是否有可能在 iOS 上做我们在 Android 上的相同实现?

第三个问题:是否可以在 Android 上做我们在 iOS 上的相同实现?

提供一些上下文;作为研究项目的一部分,我们正在寻找可能将用户链接到特定上下文的不同声音模式,为了在更大范围内这样做,我们需要能够比较 Android 和 iOS 的幅度。

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

标签: androidiosaudioscientific-computing

解决方案


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

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

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


推荐阅读