如何将16位PCM音频字节数组转换为double或float数组?

时间:2012-04-25 21:51:30

标签: java android fft

我正在尝试在.3gpp音频文件上执行快速傅立叶变换。该文件包含来自手机麦克风的44100kHz的小型5秒录音。

我能找到的每个Java FFT算法只需要double [],float []或Complex []输入,原因很明显,但是我在一个字节数组中读取音频文件,所以我有点像对于我从这里离开的地方感到困惑。我唯一能找到的就是上一个问题的答案:

Android audio FFT to retrieve specific frequency magnitude using audiorecord

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

2 个答案:

答案 0 :(得分:13)

别无选择。您必须运行循环并分别转换数组的每个元素。

对于我作为花车的短裤我做同样的事情:

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

基于评论的编辑4/26/2012

如果你真的有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));

除非你正在使用一个奇怪且设计糟糕的类,它首先给你字节数组,否则该类的设计者应该打包字节以与Java转换字节的方式一致(每次2个字节)短裤。

答案 1 :(得分:-3)

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