将Float32Array转换为Int16Array

Nir*_*kku 6 javascript typed-arrays

我正在寻找将Float32Array转换为Int16Array.

这就是我所拥有的(我没有提供data).

  var data = ...; /*new Float32Array();*/
  var dataAsInt16Array = new Int16Array(data.length);
  for(var i=0; i<data.length; i++){
    dataAsInt16Array[i] = parseInt(data[i]*32767,10);
  }
Run Code Online (Sandbox Code Playgroud)

我不相信我正确地做到了并且正在寻找一些方向.

Pau*_* S. 7

您可以直接从ArrayBuffer执行此操作

var dataAsInt16Array = new Int16Array(data.buffer);
Run Code Online (Sandbox Code Playgroud)
var f32 = new Float32Array(4);
f32[0] = 0.1, f32[1] = 0.2, f32[2] = 0.3, f32[3] = 0.4;
// [0.10000000149011612, 0.20000000298023224, 0.30000001192092896, 0.4000000059604645]

var i16 = new Int16Array(f32.buffer);
// [-13107, 15820, -13107, 15948, -26214, 16025, -13107, 16076]

// and back again
new Float32Array(i16.buffer);
// [0.10000000149011612, 0.20000000298023224, 0.30000001192092896, 0.4000000059604645]
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您要转换原始基础数据,则可以使用Paul S.在其答案中描述的方法。

但是请注意,在Float32的情况下,您得到的数字将与处理该数字的 32位IEEE 754表示形式不同。当使用新视图(例如Int16)时,您正在查看的是二进制表示形式,而不是原始数字。

如果您要输入数字,则必须手动进行转换,只需将代码修改为:

var data = ...; /*new Float32Array();*/
var len = data.length, i = 0;
var dataAsInt16Array = new Int16Array(len);

while(i < len)
  dataAsInt16Array[i] = convert(data[i++]);

function convert(n) {
   var v = n < 0 ? n * 32768 : n * 32767;       // convert in range [-32768, 32767]
   return Math.max(-32768, Math.min(32768, v)); // clamp
}
Run Code Online (Sandbox Code Playgroud)