我有一个使用变量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;
}
}
答案 0 :(得分:1)
步骤1:找到SPL表。如果你有任何制造或实验室操作,安全人员应该有一个或知道谁做。如果没有,你可以在下班后在停车场闲逛,看看谁有一辆带有愚蠢响亮立体声的汽车并问他们。
步骤2:建立对用户有意义的参考。手机铃声?也许在距离设备一米远的露天进行测量。 (也许还在一条牛仔裤的口袋里...... :)。)汽车设备?在从设备到驾驶员座位的共同距离处测量汽车内部。制造业?在操作员所在的公共距离处测量整个地板。你明白了。
步骤3:设置仪表并进行参考测量。因为它只是一个猜测,我可能会从最小到最大读取大约十个读数,然后只是插入点之间的直线。如果你是一个数学极客,你可以适应曲线。
步骤4:在您的软件中放置一个查找表,使用您之前的数据,根据Vol级别找到reference-SPL。
步骤5:在某个地方解释用于测量的参考环境。
步骤6:在您的产品上放置一个巨大的免责声明,声音输出值仅为参考估计值,并且不保证输出水平符合任何职业安全准则。
与java无关,但是:
声压级的分贝是特定地点空气中产生的压力与正常人听到的静音之比。
关于电压或功耗等声音系统,您所说的并不是绝对数量。说“这是一个90 dB-SPL信号”是没有意义的。供参考的陈述必须更像:
“这是一个90dB-SPL信号,距离扬声器2米处,在轴上,在3mx3m的隔音工作室中测量。”
您需要在受控环境中测量整个系统,然后您就可以开发一个经验模型来预测源代码中的控制信号与系统输出压力的关系。
答案 1 :(得分:0)
分贝定义为10 * Math.log10(v1/v2)
,其中v1
是当前音量的值,v2
是参考最低音量。