我一直在阅读另一篇关于从 Mediaplayer 实时计算振幅的帖子,但我不清楚如何获得对我有用的值。我需要的是在 0-100 之间归一化的线性幅度值,但正如我在另一篇文章中看到的那样,他们正在执行一个没有多大意义的 db 计算,因为它们没有归一化为最大 0dB 值(来自如何计算实时音频幅度(android)):
double amplitude = 0;
for (int i = 0; i < audioData.length/2; i++) {
double y = (audioData[i*2] | audioData[i*2+1] << 8) / 32768.0
// depending on your endianness:
// double y = (audioData[i*2]<<8 | audioData[i*2+1]) / 32768.0
amplitude += Math.abs(y);
}
amplitude = amplitude / audioData.length / 2;
我已经看过计算de dB,我应该按照以下方式进行(来自如何从媒体播放器计算振幅的分贝(dB)? )
double sum=0;
for (int i = 0; i < audioData.length/2; i++) {
double y = (audioData[i*2] | audioData[i*2+1] << 8) / 32768.0;
sum += y * y;
}
double rms = Math.sqrt(sum / audioData.length/2);
dbAmp = 20.0*Math.log10(rms);
我已经尝试过该解决方案,但实时值接近 0,但有时超过 0,我的意思是,介于 -Inifinit(无声音)到 1.2(如果我避免 20.0* 相乘)或其他任何东西之间. 无论如何,我想获得一个标准化值 [0-100],而不是一个 dB 值。