如何转换16位PCM音频字节数组两倍或浮点数组?(How to convert 16-bit PCM

2019-06-23 23:25发布

我试图执行一个.3GPP音频文件快速傅立叶变换。 该文件包含从手机麦克风44100kHz小5第二记录。

每个Java FFT算法我只能找到需要双[],漂浮[]或复[]输入,出于显而易见的原因,但我在一个字节数组的音频文件读取,所以我好心的困惑在这里我从这里走。 我能找到的唯一的事情就是回答前一个问题:

Android的音频FFT使用audiorecord检索特定的频率幅度

但我不确定到用是否这是正确的步骤。 任何人只要有任何见解?

Answer 1:

没有替代。 你必须单独运行一个循环,并投了阵列中的每个元素。

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

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,但它作为一个byte [],那么你可以这样做:

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在同一时间)的方式来短裤一致。



Answer 2:

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


文章来源: How to convert 16-bit PCM audio byte-array to double or float array?
标签: java android fft