【发布时间】:2018-07-12 01:23:52
【问题描述】:
所以我使用智能手机麦克风以 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() 将data 作为字节数组获取
然后我将 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 是注册的最低值)。
问题是我得到的最大 dB 水平约为 70。 我知道智能手机中的麦克风有 ~ 100 dB 的限制。 在 Google Play 商店中可以找到能够注册更高值的应用程序。
我只是在我的代码中看不到限制这个 dB 值的问题。
【问题讨论】:
标签: android audio kotlin signal-processing