繁体   English   中英

将Float32Array转换为Int16Array

[英]Convert Float32Array to Int16Array

我正在寻找将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);
  }

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

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

var dataAsInt16Array = new Int16Array(data.buffer);

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]

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

但要注意的,当你正在处理在浮点32的情况下,数量的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
}
    var floatbuffer = audioProcEvent.inputBuffer.getChannelData(0);
    var int16Buffer = new Int16Array(floatbuffer.length);

    for (var i = 0, len = floatbuffer.length; i < len; i++) {
        if (floatbuffer[i] < 0) {
            int16Buffer[i] = 0x8000 * floatbuffer[i];
        } else {
            int16Buffer[i] = 0x7FFF * floatbuffer[i];
        }
    }

ECMAScript 2015及其TypedArray.from版本具有TypedArray.from ,它将任何类型化数组(实际上是任何可迭代数组)转换为指定的类型化数组格式。

因此,将Float32Array转换为Uint8Array现在就像以下一样简单:

const floatArray = new Float32Array()
const intArray = Int16Array.from(floatArray)

...虽然有截断。

您似乎不仅要尝试转换数据格式,还要处理原始数据并以不同格式存储它。

Float32Array转换为Int16Array的直接方法很简单

var a = new Int16Array(myFloat32Array);

对于处理数据,您可以使用您在问题中提供的方法。 我不确定是否需要调用parseInt

结合robjtede和StuS的答案,可以将Float32Array的转换和缩放转换为Int16Array。 在Float32Array中,缩放范围为1到-1,在Int16Array中变为32767和-32768:

myF32Array=Float32Array.from([1,0.5,0.75,-0.5,-1])
myI16Array=Int16Array.from(myF32Array.map(x => (x>0 ? x*0x7FFF : x*0x8000)))
myNewF32Array=Float32Array.from(Float32Array.from(myI16Array).map(x=>x/0x8000))
console.log(myF32Array)
console.log(myI16Array)
console.log(myNewF32Array)

//output
> Float32Array [1, 0.5, 0.75, -0.5, -1]
> Int16Array [32767, 16383, 24575, -16384, -32768]
> Float32Array [0.999969482421875, 0.499969482421875, 0.749969482421875, -0.5, -1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM