本文介紹了讀取WAV文件并計算RMS的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
所以我正在嘗試測試一些分析一些PCM數據量的代碼。我得到了一些奇怪的音量測量數據,這與我從Audity獲得的數據毫無意義。我的尺碼好像到處都是。
我不確定我的錯誤是在讀取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秒的時間步長,并對每個時間步長的音量進行平均。
這里是我計算均方根和分貝的地方
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單聲道錄制的,并在Audacity中保存為WAV16簽名的PCM。不確定我做錯了什么。
任何幫助我們都將不勝感激!謝謝
編輯:發現我讀錯了wav數據。我通過添加末尾小字符順序修復了它。然而,我仍然對如何計算體積感到困惑。數值更好了,但仍然很難破譯,我不確定我的RMS使用什么單位,以及參考值應該使用什么單位。
推薦答案
您的計算中有一個錯誤–sumOfSamples = originalPcm[i]*originalPcm[i];
應該是sumOfSamples += originalPcm[i]*originalPcm[i];
,因此您將累加值。
至于參考值–為什么要用20?通常,您使用可能的最小值(在本例中為1),也可以使用最大值(SQRT(32768)),所有的值都將低于該值,因此您將得到負的dB值。
這篇關于讀取WAV文件并計算RMS的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,