gpt4 book ai didi

java - float[] 16 位转 byte[]

转载 作者:行者123 更新时间:2023-12-02 05:35:26 24 4
gpt4 key购买 nike

我已转换byte[]进入float[]使用这种方式:

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);
}
}

因为我正在读取 16 位音频样本。

现在我需要逆过程:我有一个 float[]其中包含 16 位样本,我想转换为 byte[] .

所以,我想我必须创建一个 byte[]该尺寸为float*2但我怎样才能获得 byte 的值?

谢谢

编辑:

更准确地说,我捕获了 200 毫秒的 16 位音频 block 。为了处理这些 block ,我需要 float 形式的样本,因此我必须将 2 个字节的字节数组合并到 float 的一个元素中。这个过程的代码如下。

处理后,我需要以字节为单位重新转换浮点样本,因此我需要 float[] 的每个元素都位于 byte[] 的两个元素中

最佳答案

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);
}

}

逆运算如下所示:

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;

}

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

关于java - float[] 16 位转 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25013956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com