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)
我不相信我正确地做到了并且正在寻找一些方向.
您可以直接从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)
| 归档时间: |
|
| 查看次数: |
4847 次 |
| 最近记录: |