如何将16位PCMaudio字节数组转换为双精度浮点数组?

我正试图对.3gppaudio文件执行快速傅立叶变换。 该文件包含从手机麦克风44100kHz的小5秒录音。

我能find的每个Java FFTalgorithm都只需要double [],float []或Complex []input,原因很明显,但我正在以字节数组的forms读取audio文件,所以我有点困惑我从哪里去。 我能find的唯一的东西就是对上一个问题的回答:

AndroidaudioFFT使用audiorecord检索特定的频率大小

但我不确定这是否是正确的程序。 任何有见识的人?

Solutions Collecting From Web of "如何将16位PCMaudio字节数组转换为双精度浮点数组?"

没有替代。 你必须运行一个循环,分别转换arrays的每个元素。

我做同样的事情,作为漂浮的短裤:

public static float[] floatMe(short[] pcms) { float[] floaters = new float[pcms.length]; for (int i = 0; i < pcms.length; i++) { floaters[i] = pcms[i]; } return floaters; } 

编辑2012年4月26日根据意见

如果你真的有16位的PCM,但它有一个字节[],那么你可以这样做:

 public static short[] shortMe(byte[] bytes) { short[] out = new short[bytes.length / 2]; // will drop last byte if odd number ByteBuffer bb = ByteBuffer.wrap(bytes); for (int i = 0; i < out.length; i++) { out[i] = bb.getShort(); } return out; } 

然后

 float[] pcmAsFloats = floatMe(shortMe(bytes)); 

除非你正在使用一个奇怪而且devise不好的类,这个类首先给了你一个字节数组,那么这个类的devise者应该把这些字节打包,以便与Java转换字节(一次2个)的方式一致。

 byte[] yourInitialData; double[] yourOutputData = ByteBuffer.wrap(bytes).getDouble()