1. 程式人生 > >關於音訊PCM資料2位元組(16位)byte與64位double之間的轉換

關於音訊PCM資料2位元組(16位)byte與64位double之間的轉換

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
		}
	}