从AndroidRecoreder.MaxAmplitude()获得更多的分贝值范围

时间:2015-09-06 03:00:50

标签: android audio decibel

我试图使用AndroidRecorder获取maxAmplitude()并将其转换为分贝。

这是我使用的公式 - Double powerDb = 20 * log10((mRecorder.getMaxAmplitude()/ 2700.0));

但是当我看到我的powerDB日志时,我看到的值从负15到21.8(正)。

我在麦克风面前喊出多少不超过21.8,有时通常会说它达到21.8。

如何在值中获得更多宽度,以便我可以实际区分低音和高音,我打算在一些响亮的声音的基础上触发我的应用。

1 个答案:

答案 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)...