Android 计算音频文件的声级会导致低dB值
所以我用智能手机麦克风录制了PCM 16位格式的音频文件,1个通道,采样频率44100 Hz 我将此文件读取为字节数组:Android 计算音频文件的声级会导致低dB值,android,audio,kotlin,signal-processing,Android,Audio,Kotlin,Signal Processing,所以我用智能手机麦克风录制了PCM 16位格式的音频文件,1个通道,采样频率44100 Hz 我将此文件读取为字节数组: fun readFileAsByteArray(file: File = audioFile): ByteArray{ val inputStream = FileInputStream(file) val dataStream = DataInputStream(inputStream) val byt
fun readFileAsByteArray(file: File = audioFile): ByteArray{
val inputStream = FileInputStream(file)
val dataStream = DataInputStream(inputStream)
val byteArray = ByteArray(file.length().toInt())
dataStream.read(x)
dataStream.close()
inputStream.close()
return byteArray
}
然后我想计算这个文件的声级,单位是dB。
我使用readFileAsByteArray以字节数组的形式获取数据
然后我将byte[]转换为short[]再转换为double[]
var sbuf = ByteBuffer.wrap(data).asShortBuffer()
var audioShorts = ShortArray(sbuf.capacity())
sbuf.get(audioShorts)
var audioDoubles = DoubleArray(audioShorts.size)
for (i in audioShorts.indices) {
audioDoubles[i] = java.lang.Short.reverseBytes(audioShorts[i]).toDouble() / 0x8000
}
然后我计算样本分块数组的RMS值:
val batchArray = audioDoubles.asSequence().chunked(size = 1792)
val rmsScore = arrayListOf<Double>()
for (batch in batchArray){
val sum: Double = batch.sumByDouble { it * it }
val rms = Math.sqrt(sum/batch.size)
rmsScore.add(rms)
}
然后我计算dB
val minrms = 2.2414737665141438E-4
val dbArray = arrayListOf<Double>()
rmsScore.forEach { sample -> dbArray.add(20*Math.log10(sample/minrms)) }
我使用minrms作为参考值,我记录了一些静默,minrms是注册的最低值
问题是我得到的最大分贝水平是70左右。
我知道智能手机中的麦克风限制在100分贝左右。
在Google Play Store中可以找到能够注册更高值的应用程序
我只是看不到我的代码中限制此dB值的问题。问题必须与参考电压有关。 我不知道您使用的是实际电压还是有符号的2字节ADC值。如果您使用的是ADC值,您是否可以遵循列出的技术 您可以使用1作为参考,而不是0 dB作为峰值。32767将是0到90.3分贝范围内的峰值pcm值,接近智能手机话筒的报价值