0

作为更大应用程序的一部分,我目前正在研究分贝计,该计采用 10 秒时间跨度的平均声级。

为了实现这一点,我制作了一个 10 000 毫秒的 CountDownTimer,每 100 毫秒滴答一次。

在每个 onTick 事件中,我都会更新显示剩余时间的文本字段,并且还会更新实时分贝值。

然而,我的问题是将最大幅度转换为分贝。我找到了“power_db = 20 * log10(amp / amp_ref);” StackOverflow 上的公式,我理解它是如何工作的,但我似乎总是以负分贝值结束。

我知道这是因为 amp_ref 值错误,但我完全不知道应该使用哪个。我在网上发现了很多不同的价值观,但似乎没有一个能奏效。

有谁知道我应该使用哪个参考幅度来在我的仪表上获得正确的分贝读数?我正在测试的手机是谷歌 Nexus 5。如果有帮助的话,如果它只是这个手机上的一个真正准确的值就足够了。

我在 onTick 事件中的代码如下(我暂时删除了公式,因为无论如何它似乎都是错误的):

public void onTick(long ms) {

                meetBtn.setText(String.valueOf((ms/1000)+1));
                amplitude = mRecorder.getMaxAmplitude();

                decibelView.setText(String.valueOf(amplitude));
            }

如果有人有任何提示或需要更多信息,请告诉我!

提前致谢!:)

4

1 回答 1

0

负分贝很好,因为无论如何它是一个相对量度。事实上,将可能的最大振幅作为参考点是一种常见的做法,因此分贝从 0 下降到负空间。当可能发生削波和声音失真时,专业系统通常将正分贝指示为过载。

因此,例如,如果您的幅度范围是 0 到 1(可接受的浮点 PCM 标准),那么您的 amp_ref 将为 1,并且您的分贝值将从某个负值开始,该负值取决于您的源的位分辨率(例如 -186dB 32 位,或 16 位源为 -90dB),最高 0dB。这个是正常的!

编辑:实际上,您的浮点 PCM 幅度范围是 -1 到 1,但分贝计算“丢弃”减号并为负幅度和正幅度提供相同的结果。

于 2015-07-29T15:21:40.923 回答