关于音频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
		}
	}





  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值