将 int16 数组转换为 float
Convert int16 array to float
我有一个来自音频文件的字节数组,我想将它转换成我可以处理以过滤音频信号的数据。
我有一个这样的数组:
[239,246,96,247.......];每个元素都是一个 uint8 byte
每2个字节(16位)代表一个样本,所以我把这个数组转换成一个int16元素数组。
然后如何将此数组转换为值在 [-1,1] 范围内的信号?
x 是我数组的一个元素。
x 应该是 uint16
而不是 int16
。
接下来对于每个 x,你必须做 (x - maxUInt16/2) / maxUInt16/2
所以 => y = (x - (2^15 - 1)) / (2^15 - 1)
maxUint16 受损,因此您必须处理可能的溢出
代码:
let init = new Uint8Array(22);
for (let i = 0; i < 16; i++) {
init[i] = Math.trunc(Math.random() * 255) % 255;
}
/* Interested test case */
init[16] = 0;
init[17] = 0; // Should return -1
init[18] = 255;
init[19] = 255; // Should return 1
init[20] = 127;
init[21] = 255; // Should return 0
let sample = new Uint16Array(11);
for (let i = 0; i < 11; i++) {
sample[i] = (init[i*2] << 8) | init[i*2+1];
}
let ranged = [];
for (let i = 0; i < 11; i++) {
ranged.push(Math.min(( Number(sample[i]) - 32767) / 32767 , 1));
}
console.log(init);
console.log(sample);
console.log(ranged);
您已经有了带符号的 16 位整数,因此只需除以符号对应的最小和最大 int16 值即可。
let buffer = new Int16Array([0x0001, 0x7fff, 0x000, 0xffff, 0x8000]);
// [1, 32767, 0, -1, -32768]
let result = new Float32Array(buffer.length);
for(let i=0; i<buffer.length; i++) result[i] = buffer[i] / (buffer[i] >= 0 ? 32767 : 32768);
console.log(result[0], result[1], result[2], result[3], result[4]);
// 0.000030518509447574615 1 0 -0.000030517578125 -1
我有一个来自音频文件的字节数组,我想将它转换成我可以处理以过滤音频信号的数据。 我有一个这样的数组: [239,246,96,247.......];每个元素都是一个 uint8 byte
每2个字节(16位)代表一个样本,所以我把这个数组转换成一个int16元素数组。
然后如何将此数组转换为值在 [-1,1] 范围内的信号?
x 是我数组的一个元素。
x 应该是 uint16
而不是 int16
。
接下来对于每个 x,你必须做 (x - maxUInt16/2) / maxUInt16/2
所以 => y = (x - (2^15 - 1)) / (2^15 - 1)
maxUint16 受损,因此您必须处理可能的溢出
代码:
let init = new Uint8Array(22);
for (let i = 0; i < 16; i++) {
init[i] = Math.trunc(Math.random() * 255) % 255;
}
/* Interested test case */
init[16] = 0;
init[17] = 0; // Should return -1
init[18] = 255;
init[19] = 255; // Should return 1
init[20] = 127;
init[21] = 255; // Should return 0
let sample = new Uint16Array(11);
for (let i = 0; i < 11; i++) {
sample[i] = (init[i*2] << 8) | init[i*2+1];
}
let ranged = [];
for (let i = 0; i < 11; i++) {
ranged.push(Math.min(( Number(sample[i]) - 32767) / 32767 , 1));
}
console.log(init);
console.log(sample);
console.log(ranged);
您已经有了带符号的 16 位整数,因此只需除以符号对应的最小和最大 int16 值即可。
let buffer = new Int16Array([0x0001, 0x7fff, 0x000, 0xffff, 0x8000]);
// [1, 32767, 0, -1, -32768]
let result = new Float32Array(buffer.length);
for(let i=0; i<buffer.length; i++) result[i] = buffer[i] / (buffer[i] >= 0 ? 32767 : 32768);
console.log(result[0], result[1], result[2], result[3], result[4]);
// 0.000030518509447574615 1 0 -0.000030517578125 -1