当前位置: 首页 > 面试题库 >

如何将16位PCM音频字节数组转换为双精度或浮点型数组?

程振濂
2023-03-14
问题内容

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

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

Android音频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,但将其作为字节[],则可以执行以下操作:

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中的双精度数组。我知道迭代数组并创建一个新数组的明显方法。我希望Java在希望与double []一起工作的地方能够平稳地消化float [] …,但不能与此一起工作。进行这种转换的优雅,有效的方法是什么? 问题答案: 基本上 , 必须进行每个值的转换。两种数组类型之间没有隐式转换,因为在JITting之后用于处理它们的代码将有所不同- 它们具有

  • 我想用一个小数点和一个小数位的格式将任何双精度四舍五入为双精度,这样29575.347434将是2.3。 我试着用decimalFormat做这个,但当我试着我只得到了一个29575.3格式的字符串,带有一个,我不知道如何在保留值为双精度的同时去掉所有小数点。

  • 问题内容: 为了将字节数组转换为双精度型,我发现了这一点: 但是我找不到将双精度型转换为字节数组的任何东西。 问题答案: 甚至更简单

  • 我目前正在处理音频样本。我从AVAssetReader获得它们,并有一个,其内容如下: 如您所见,我找到的唯一用于转换[Int16]->[Float]的方法是,但这样做会增加我的处理时间。是否存在将Int16指针转换为Float指针的其他方法?

  • 问题内容: 我有一个必须解析的二进制文件,并且正在使用Python。有没有办法占用4个字节并将其转换为单个精度浮点数? 问题答案:

  • 我有音频数据记录从麦克风这样:(ndarray的浮动) 这是我的代码: 但当我播放音频时,它就坏了,只有噪音。。。如何将其转换为。wav音频文件?