Android 计算音频文件的声级会导致低dB值

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

所以我用智能手机麦克风录制了PCM 16位格式的音频文件,1个通道,采样频率44100 Hz

我将此文件读取为字节数组:

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值,接近智能手机话筒的报价值