Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中与声音相关的分贝_Java_Decibel - Fatal编程技术网

Java中与声音相关的分贝

Java中与声音相关的分贝,java,decibel,Java,Decibel,我有一个函数,它使用变量vol在Java中播放声音,如下面的代码所示。此变量vol是介于0和1之间的十进制数。当我播放0时,声音基本上是尽可能低的音量,当我用1播放时,声音尽可能大。我怎么知道程序的声音是什么?我想知道给定的vol的小数位数 public static final AudioFormat DEFAULTAUDIOFORMAT = new AudioFormat(44100, 16, 2, true, true); private void generateTone() {

我有一个函数,它使用变量
vol
在Java中播放声音,如下面的代码所示。此变量
vol
是介于0和1之间的十进制数。当我播放
0
时,声音基本上是尽可能低的音量,当我用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;
         }
    }
public static final AudioFormat DEFAULTAUDIOFORMAT=新的AudioFormat(44100,16,2,true,true);
私有void generateTone(){
int channels=DEFAULTAUDIOFORMAT.getChannels();
int-sampleSizeInBytes=DEFAULTAUDIOFORMAT.GetSampleSizeInByts()/8;
float sampleRate=DEFAULTAUDIOFORMAT.getSampleRate();
int timedSample=(int)(采样率*毫秒/1000f);
int len=时间采样*通道*采样字节;
int shapeLen=(int)(.05*timedSample);
buf=新字节[len];
双尺度;
对于(int i=0,j=0;i>>8);
buf[j++]=(字节)波;
buf[j++]=(字节)(波形>>>8);
buf[j++]=(字节)波;
}
}

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

步骤1:查找声压计。如果你有任何类型的生产或实验室操作,安全员应该有一个或知道谁有。如果没有,你可以下班后在停车场闲逛,看看谁有一辆音响声音愚蠢的车,然后问他们

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

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

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

第5步:在类似于你的盒子的地方解释一下用于测量的参考环境

第6步:在你的产品上放一个巨大的免责声明,声音输出值只是参考估计值,不能证明输出水平符合任何职业安全指南

实际上与java无关,但是:

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

对于声音系统来说,它不是一个绝对的量,比如电压或功耗。说“这是一个90分贝的声压级信号”是没有意义的。供参考的声明必须更像:

“这是一个90分贝的声压级信号,在距离扬声器2米的地方测量,在一个3米见方的消声工作室中。”


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

将一个仪表放在扬声器前面?Java无法知道在生成信号后应用了多少放大,v1和v2的单位是什么。在我的例子中,v2是0,你不能除以0,所以要确定一个任意的初始音量,即人们能听到的最低声音。@codegay,这里的单位是功率。如果只有电压电平,则倍增器为20而不是10。