如何比较 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 并尝试匹配 - 你想做什么?您拥有的代码只是找到最大值。这有点无趣,除非你所做的只是一个掌声计。如果您真的想比较声波,那么在频域中进行傅立叶变换不是更好吗?时域真的很乱。
所以我阅读了各种关于如何从 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 并尝试匹配 - 你想做什么?您拥有的代码只是找到最大值。这有点无趣,除非你所做的只是一个掌声计。如果您真的想比较声波,那么在频域中进行傅立叶变换不是更好吗?时域真的很乱。