10

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

由于显而易见的原因,我能找到的每个 Java FFT 算法都只需要 double[]、float[] 或 Complex[] 输入,但我正在以字节数组的形式读取音频文件,所以我有点困惑我从这里去哪里。我唯一能找到的是上一个问题的答案:

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

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

4

2 回答 2

14

没有替代。您必须运行一个循环并分别转换数组的每个元素。

我对作为浮动的短裤做同样的事情:

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

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

于 2012-04-25T23:39:05.460 回答
-5
byte[] yourInitialData;
double[] yourOutputData = ByteBuffer.wrap(bytes).getDouble()
于 2012-04-25T23:40:04.697 回答