【问题标题】:Making a decibel meter (first android app), problems converting Amplitude to Decibels制作分贝计(第一个 android 应用程序),将振幅转换为分贝时出现问题
【发布时间】:2015-07-29 23:52:27
【问题描述】:

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

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

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

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

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

有人知道我应该使用哪个参考幅度来获得仪表上的正确分贝读数吗?我正在测试的手机是 Google Nexus 5。现在,如果它只是在这台手机上的一个非常准确的值,如果有任何帮助就足够了。

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

public void onTick(long ms) {

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

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

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

提前致谢! :)

【问题讨论】:

    标签: android decibel


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2019-04-03
      • 2011-09-20
      • 2011-05-08
      相关资源
      最近更新 更多