Java 将16位PCM波形数据转换为浮点的正确方法

Java 将16位PCM波形数据转换为浮点的正确方法,java,android,pcm,audio-processing,Java,Android,Pcm,Audio Processing,我有一个16位PCM格式的波形文件。我有一个byte[]中的原始数据和一个提取样本的方法,我需要它们是浮点格式,即float[]来进行傅里叶变换。这是我的密码,看起来对吗?我在安卓上工作,所以javax.sound.sampled等不可用 private static short getSample(byte[] buffer, int position) { return (short) (((buffer[position + 1] & 0xff) << 8) | (

我有一个16位PCM格式的波形文件。我有一个
byte[]
中的原始数据和一个提取样本的方法,我需要它们是浮点格式,即
float[]
来进行傅里叶变换。这是我的密码,看起来对吗?我在安卓上工作,所以javax.sound.sampled等不可用

private static short getSample(byte[] buffer, int position) {
  return (short) (((buffer[position + 1] & 0xff) << 8) | (buffer[position] & 0xff));
}

...

float[] samples = new float[samplesLength];
  for (int i = 0;i<input.length/2;i+=2){
    samples[i/2] = (float)getSample(input,i) / (float)Short.MAX_VALUE;
  }
private static short getSample(字节[]缓冲区,int位置){

return(short)(((buffer[position+1]&0xff)我有一个类似的解决方案,但我有点干净。不幸的是,据我所知,没有好的库方法:*这假设偶数字节是较低的字节

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] << 8);
    }
    return floats;
}
private static float[]bytestoflots(字节[]字节){
float[]floats=新的float[bytes.length/2];
对于(int i=0;ifloats[i/2]=bytes[i]|(bytes[i+1]您可以尝试使用ByteBuffer API。

()

如hertzsprung所示,答案为jk。仅适用于无符号PCM。在Android上,PCM16是大端有符号的,因此您需要考虑编码为的潜在负值。这意味着我们需要检查高位字节是否大于127,如果大于127,则首先从高位字节中减去256,然后再乘以256

private static float[] bytesToFloats(byte[] bytes) {
    float[] floats = new float[bytes.length / 2];
    for(int i=0; i < bytes.length; i+=2) {
        floats[i/2] = bytes[i] | (bytes[i+1] < 128 ? (bytes[i+1] << 8) : ((bytes[i+1] - 256) << 8));
    }
    return floats;
}
private static float[]bytestoflots(字节[]字节){
float[]floats=新的float[bytes.length/2];
对于(int i=0;i浮点[i/2]=字节[i]|(字节[i+1]<128?(字节[i+1])这只适用于无符号PCM,对吗?否则您需要从每对字节中的第二个屏蔽符号位。@hertzsprung:您能解释一下在有符号PCM的情况下该怎么做吗?另请参阅: