關於音訊PCM資料2位元組(16位)byte與64位double之間的轉換
阿新 • • 發佈:2019-01-30
1 致謝
2 問題描述
今天遇到一個問題 讀取了WAV檔案的PCM資料 PCM資料是以byte[]型別儲存的 而在一般的FFT變換庫函式中一般使用的是浮點型資料 (Youki此處使用的是double型別 後期會根據需要進行修改) 所以需要將byte[]轉換為double[] 此實驗是在Java中進行的3 演算法設計
首先我們會獲得一個byte[] 將兩個byte轉換為1個double 程式碼如下:byte bl = byteArray[2 * i];
byte bh = byteArray[2 * i + 1];
可以看到 這裡用的是“小端模式”
(具體為什麼是“小端模式” 還有待探究 這個留待以後繼續修改)
bh和bl中會分別存放浮點數的高8位和低8位 將這兩個數合併就好了
合併需要進行位操作 詳見後面的程式碼分析
之後需要除以16位的最大值 也就是2^15=32768
得到的就是所需的double值了
4 程式碼實現
static private void ByteArray2DoubleArray(double[] doubleArray, byte[] byteArray) { // TODO Auto-generated method stub for (int i = 0; i < doubleArray.length; i++) { byte bl = byteArray[2 * i]; byte bh = byteArray[2 * i + 1]; short s = (short) ((bh & 0x00FF) << 8 | bl & 0x00FF); /** * Java中short是2位元組 1位元組是8bit 這裡為什麼要加上“& 0x00FF”呢? 這是為了把複數前面的“很多個F”去掉 * 只取後8位的資料 防止相互影響 */ System.out.println("s_" + s); doubleArray[i] = s / 32768f; // 32768 = 2^15 } }