因此,我正在尝试测试一些分析某些PCM数据量的代码。我得到了一些奇怪的体积测量结果,这些数据对于我从Audacity获得的数据没有意义。看来我的测量值到处都是。
我不确定我的错误是因为我正在读取WAV数据,还是由于我正在计算体积。
所以这里是我以字节为单位读取数据并转换为短裤的地方,因为它是PCM 16位。
InputStream pcmStream = this.getClass().getClassLoader().getResourceAsStream("Test-16Bit-PCM.wav");
ArrayList<Byte> bytes = new ArrayList<>();
int b = pcmStream.read();
while(b != -1)
{
bytes.add((byte)b);
b = pcmStream.read();
}
// First 44 bytes of WAV file are file info, we already know PCM properties since we recorded test audio
byte [] bytesArray = new byte[bytes.size()-44];
for(int i = 44; i < bytes.size(); i++)
{
bytesArray[i-44] = bytes.get(i);
}
bytes = null;
pcmStream = null;
short [] pcm = new short[bytesArray.length/2];
ByteBuffer bb = ByteBuffer.wrap(bytesArray).asShortBuffer().get(pcm);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asShortBuffer().get(pcm);
bytesArray = null;
然后将short []
直接传递到我的分析仪,然后将数据分为0.1秒的时间步长,并平均每个时间步长的音量。
在这里我计算RMS和dB
double sumOfSamples = 0;
double numOfSamples = settings.shortsPerTimeStep();
for(int i = start; i < start+settings.shortsPerTimeStep(); i++)
{
sumOfSamples = originalPcm[i]*originalPcm[i];
}
double rms = Math.sqrt(sumOfSamples/numOfSamples);
// Convert to decibels
calculatedVolume = 20*Math.log10(rms/20);
我正在读取的音频以44100 MONO录制,并以大胆的方式另存为WAV 16 Signed PCM。不知道我在做什么错。
任何帮助将不胜感激!谢谢
编辑:发现我在读取WAV数据时出错。我通过增加一点点耐力来解决它。但是,我仍然对如何计算音量感到困惑。这些值比较好,但仍然很难破译,而且我不确定RMS的单位和参考值的单位。
答案 0 :(得分:1)
您的计算有误-sumOfSamples = originalPcm[i]*originalPcm[i];
应该乘sumOfSamples += originalPcm[i]*originalPcm[i];
,这样您才可以累加值。
至于参考值-为什么要使用20?通常,您使用尽可能低的值(在这种情况下为1),或者可以使用最大值(为sqrt(32768)),并且所有值都将低于该值,因此您将获得负dB值