我试图使用AndroidRecorder获取maxAmplitude()并将其转换为分贝。
这是我使用的公式 - Double powerDb = 20 * log10((mRecorder.getMaxAmplitude()/ 2700.0));
但是当我看到我的powerDB日志时,我看到的值从负15到21.8(正)。
我在麦克风面前喊出多少不超过21.8,有时通常会说它达到21.8。
如何在值中获得更多宽度,以便我可以实际区分低音和高音,我打算在一些响亮的声音的基础上触发我的应用。
答案 0 :(得分:1)
您的第一个问题在于如何缩放数字。 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)...
。