1 致谢
感谢kimmking网友提供的资料
原文链接如下:http://blog.csdn.net/kimmking/article/details/8752737
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
}
}