我正在尝试在.3gpp音频文件上执行快速傅里叶变换.该文件包含来自手机麦克风的44100kHz的小型5秒录音.
我可以找到的每个Java FFT算法只需要double [],float []或Complex []输入,原因很明显,但我在一个字节数组中读取音频文件,所以我有点困惑于我从哪里离开我唯一能找到的是前一个问题的答案:
Android audio FFT to retrieve specific frequency magnitude using audiorecord
但我不确定是否这是正确的程序.任何有见识的人?
解决方法
没有替代.您必须运行循环并分别转换数组的每个元素.
对于我作为花车的短裤我做同样的事情:
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个)转换为short的方式一致.