您的第一个问题在于您如何缩放数字。GetMaxAmplitude
返回一个介于 0 和 32767 之间的值。您希望将此数字缩放为介于 0 和 1 之间的值。为此,您需要除以 32767 而不是 2700(该数字是从哪里来的?)。
double maxAmplScaled = mRecorder.getMaxAmplitude/32767.0;
现在您的数据已正确缩放,您可以转换为 dB。这将为您提供一个介于负无穷大和零之间的分贝数。
double db = 20*log10(maxAmplScaled);
// 20*log10(0) == -inf
// 20*log10(1) == 0
从这一点来看,您关于“值宽度”的问题有点误解了分贝(对数)刻度。以分贝计算时,每 -6 dB 代表音量减半。或者每 -20 dB 表示除以 10。
// dividing by 2s
20*log10(1) == 0
20*log10(0.5) == -6.0205
20*log10(0.25) == -12.041
20*log10(0.125) == -18.062
// or dividing by 10s
20*log10(1) == 0
20*log10(0.1) == -20
20*log10(0.01) == -40
20*log10(0.001) == -60
在像 dB 这样的对数刻度中,您可以轻松区分数字,但您可以通过使用加法/减法而不是除法/乘法来区分这些数字。
在线性比例中,如果您想确定是否amplitude A
少于一半,amplitude B
您将使用除法。 if (amplitudeB < amplitudeA/2)...
而在 dB 标度中,您将使用减法:if (dbB < dbA-6.0205)...
。