关于音频PCM数据2字节(16位)byte与64位double之间的转换

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





阅读更多
版权声明:墨眉无锋,似攻非攻。 https://blog.csdn.net/songyuc/article/details/50986033
文章标签: 音频编码 Java
个人分类: 音频编码
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭