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

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

但是,当我看到powerDB的日志时,看到的值介于15到21.8(正)之间。

我在麦克风前大喊不超过21.8,有时通常说到21.8。

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

最佳答案

您的第一个问题在于如何缩放数字。 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)...

关于android - 从AndroidRecoreder.MaxAmplitude()获取更多分贝值范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32419602/

10-10 01:11