Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮点[]16位到字节[]_Java_Android - Fatal编程技术网

Java 浮点[]16位到字节[]

Java 浮点[]16位到字节[],java,android,Java,Android,我已使用以下方式将字节[]转换为浮点[]: public voidcheckingActivity(byte[] data, int numbytes) { size_data_proc = data.length / 2; float[] data_proc = new float[size_data_proc]; for (int i = 0; i < data.length; i += 2) { data_proc[i / 2] = data[

我已使用以下方式将
字节[]
转换为
浮点[]

public voidcheckingActivity(byte[] data, int numbytes) {
    size_data_proc = data.length / 2;
    float[] data_proc = new float[size_data_proc];
    for (int i = 0; i < data.length; i += 2) {
        data_proc[i / 2] = data[i] | (data[i + 1] << 8);
    }
}
public voidcheckingActivity(字节[]数据,整数字节){
size\u data\u proc=data.length/2;
float[]data_proc=新的float[size_data_proc];
对于(int i=0;idata_proc[i/2]=data[i]|(data[i+1]您可以使用
java.nio.ByteBuffer
class:

public static byte[] float2ByteArray(final float[] value) {
    ByteBuffer buffer = ByteBuffer.allocate(4 * value.length);// a float has 4 bytes
    for (float f : value) {
        buffer.putFloat(f);
    }
    return buffer.array();
}

Android中的音频数据通常是小端16位有符号PCM。我想你可能已经颠倒了字节顺序(但已经有一段时间了)。此外,如果你不屏蔽最低有效字节,你会因为自动符号扩展而得到虚假的音频伪影

通过对这些问题的修复,您的代码应该如下所示:

public void checkingActivity(byte[] data {
    float[] data_proc = new float[size_data_proc];

    for (int i = 0; i < data.length; i += 2) {
        data_proc[i / 2] = (int) (data[i] << 8) | (int) (data[i+1] & 0x00ff);
    }
}


如果使用浮点值,您可能希望将音频标准化到-1.0f到+1.0f的范围。

我试图理解您的代码,但没有用。例如,什么是
size\u data\u proc
float
在java中使用32位
byte
8,这样您就可以将4个
byte
s组合到1
float
主要思想是,在数据中,我有200毫秒的16位音频样本,然后我需要组合2个字节(一个真实的样本),其中包含浮点数组的元素。最后,当我处理这个浮点[]时,我需要在字节[]中重新转换,所以我需要在字节[]的两个元素中组合数组的每个元素我尝试了这个解决方案,但似乎这是正确的解决方案,谢谢
public byte[] floatArrayToBytes(float[] data {
    byte[] bytes = new byte[data.length * 2];
    float  scale = 1.0f;
    int    ix    = 0;

    for (float sample: data) {
        int value = sample * scale;
        bytes[ix++] = (byte) ((value >> 8) & 0x00ff);
        bytes[ix++] = (byte) (value & 0x00ff);
    }

 return bytes;