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

标签 java android fft

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

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

Android audio FFT to retrieve specific frequency magnitude using audiorecord

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

最佳答案

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

我对短裤做同样的事情,我 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;
}

根据评论编辑 4/26/2012

如果您确实有 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 个)短裤。

关于java - 如何将 16 位 PCM 音频字节数组转换为 double 或 float 组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324355/

相关文章:

java - 在 JAVA 中如何连接并等待端口完成 TIME_WAIT

java - locationManager.getLastKnownLocation 请求后返回 null

java - 空指针异常 - 事件和监听器

java - 如何在 MAT Eclipse 中的 OQL 中使用 "AND operator (&&)"

java - 我如何知道一个类是否有很多责任以及如何消除这个问题

java - 重构包名破坏了整个应用程序

android - 无法构建 cordova 项目,PATH 错误

matlab图像处理错误

algorithm - DFT 和 FFT 之间的区别是什么使得 FFT 如此之快?

matlab - 我使用fft在matlab中创建了音频回声信号:这是真的 “echo?”