1

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

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

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

我在不超过 21.8 的麦克风前喊了多少,有时通常会达到 21.8。

如何获得更大的值宽度,以便实际区分低音和高音,我计划根据一些响亮的声音触发我的应用程序。

4

1 回答 1

2

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

于 2015-09-06T10:20:17.527 回答