Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Javascript 将int16数组转换为浮点型_Javascript_Arrays_Filtering_Uint16_Uint8array - Fatal编程技术网

Javascript 将int16数组转换为浮点型

Javascript 将int16数组转换为浮点型,javascript,arrays,filtering,uint16,uint8array,Javascript,Arrays,Filtering,Uint16,Uint8array,我有一个音频文件的字节数组,我想把它转换成数据,我可以处理它来过滤音频信号。 我有这样一个数组: [239,246,96,247.....]; 每个元素都是一个uint8字节 每2个字节(16位)代表一个样本,因此我将此数组转换为一个int16元素数组 然后如何将该数组转换为值在[-1,1]范围内的信号?x是数组的一个元素。 x应该是uint16,而不是int16 下一个foreach x,您必须执行(x-maxUInt16/2)/maxUInt16/2 所以=>y=(x-(2^15-1))/(

我有一个音频文件的字节数组,我想把它转换成数据,我可以处理它来过滤音频信号。 我有这样一个数组: [239,246,96,247.....]; 每个元素都是一个uint8字节

每2个字节(16位)代表一个样本,因此我将此数组转换为一个int16元素数组


然后如何将该数组转换为值在[-1,1]范围内的信号?

x是数组的一个元素。 x应该是
uint16
,而不是
int16

下一个foreach 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);
let init=new Uint8Array(22);
for(设i=0;i<16;i++){
init[i]=Math.trunc(Math.random()*255)%255;
}
/*感兴趣的测试用例*/
init[16]=0;
init[17]=0;//应该返回-1
init[18]=255;
init[19]=255;//应该返回1
init[20]=127;
init[21]=255;//应该返回0
让样本=新UINT16阵列(11);
for(设i=0;i<11;i++){

sample[i]=(init[i*2]您已经有了带符号的int16,所以您只需除以该符号对应的最小和最大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
let buffer=new Int16Array([0x0001,0x7fff,0x000,0xffff,0x8000]);
// [1, 32767, 0, -1, -32768]
让结果=新的Float32Array(buffer.length);
for(设i=0;i=0?32767:32768);
log(结果[0]、结果[1]、结果[2]、结果[3]、结果[4]);
// 0.000030518509447574615 1 0 -0.000030517578125 -1

是否可以执行反向功能?从浮点值数组获得uint8数组?@user7597554-通过乘以min/ax Int16值,从Float32到Int16,然后通过位移位和掩蔽从Int16到uint8。u8buffer[0]=buffer[0]&0xff;u8buffer[1]=(buffer[0]>>8)&0xff;