0

我有一个使用变量在 Java 中播放声音的函数,vol如下面的代码所示。这个变量vol是 0 和 1 之间的小数。当我播放 a0时,声音基本上是可能的最低音量,而当我用 1 播放时,它尽可能响亮。我怎么知道程序的声音是什么分贝?我想知道给定的分位数vol

public static final AudioFormat DEFAULTAUDIOFORMAT = new AudioFormat(44100, 16, 2, true, true);

private void generateTone() {
        int channels = DEFAULTAUDIOFORMAT.getChannels();
        int sampleSizeInBytes = DEFAULTAUDIOFORMAT.getSampleSizeInBits() /8;
        float sampleRate = DEFAULTAUDIOFORMAT.getSampleRate();
        int timedSample = (int) (sampleRate * msecs / 1000f);
        int len = timedSample * channels * sampleSizeInBytes;
        int shapeLen = (int) (.05 * timedSample);
        buf = new byte[len];
        double scale;
        for ( int i = 0, j = 0; i < timedSample; ++i )
        {
            int wave = (int)(vol * 32767.0 * Math.sin(2.0 * Math.PI * hz * i / sampleRate));
            scale = 1.0;
            if (i <= shapeLen) {
                scale = i/(double)shapeLen;
            }
            else if (i >= timedSample - shapeLen) {
                scale = 1.0-((i- timedSample + shapeLen)/(double)(shapeLen-1));
            }
            wave = (int)(scale * wave);
            buf[j++] = (byte)(wave >>> 8);
            buf[j++] = (byte) wave;
            buf[j++] = (byte)(wave >>> 8);
            buf[j++] = (byte) wave;
         }
    }
4

2 回答 2

1

第 1 步:找到一个 SPL 仪表。如果您有任何类型的制造或实验室操作,安全人员应该有一个或知道谁做。如果没有,你可以下班后在停车场闲逛,看看谁有一辆音响声音很大的汽车,然后问他们。

第 2 步:建立对用户有意义的参考。手机铃声?也许在距离设备一米的露天测量。(也许也在一条牛仔裤的口袋里...... :) 。)汽车设备?在车内测量从设备到驾驶员座椅的公共距离。制造业?在操作员坐的公共距离处测量水泥地板。你明白了。

第 3 步:设置仪表并进行参考测量。由于这只是一个猜测,我可能会从最小值到最大值读取大约十个读数,然后在点之间插入直线。如果你是一个数学极客,你可以拟合曲线。

第 4 步:在您的软件中放置一个查找表,使用您之前的数据根据​​音量级别查找参考 SPL。

第 5 步:在您的关于框之类的某处解释用于测量的参考环境。

第 6 步:在您的产品上放置一个巨大的免责声明,即声音输出值仅为参考估计值,并不证明输出水平符合任何职业安全指南。

与java无关,但是:

声压级的分贝是在特定位置的空气中产生的压力与正常人能听到的最安静的声音的比率。

它不是一个绝对量,你可以说一个声音系统,如电压或功耗。说“这是一个 90 dB-SPL 信号”是没有意义的。供参考的声明必须更像:

“这是一个 90dB-SPL 信号,在距离扬声器 2 米处测量,在轴上,在一个 3mx3m 的隔音工作室中。”

您需要在受控环境中测量整个系统,然后您将能够开发一个经验模型来预测源代码中的控制信号与系统输出压力的关系。

于 2012-11-15T21:00:05.633 回答
0

分贝定义为10 * Math.log10(v1/v2),其中v1是当前音量的值,v2是参考最低声级。

于 2012-11-15T19:44:37.580 回答