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;i data_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组合到1float
主要思想是,在数据中,我有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;