数据类型间的转换(Float32Array;Float64Array...)

2,168 阅读2分钟

数据类型间的转换

Float32Array;Float64Array

Int8Array;Int16Array;Int32Array

Uint8Array;Uint16Array

ArrayBuffer 转 Float32Array

var convertBlock(buffer) { // incoming data is an ArrayBuffer
    var incomingData = new Uint8Array(buffer); // create a uint8 view on the ArrayBuffer
    var i, l = incomingData.length; // length, we need this for the loop
    var outputData = new Float32Array(incomingData.length); // create the Float32Array for output
    for (i = 0; i < l; i++) {
        outputData[i] = (incomingData[i] - 128) / 128.0; // convert audio to float
    }
    return outputData; // return the Float32Array
}

Float32Array 转 Int16Array

function Float32Array2Int16Array(float32Array) {
    var data = 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
    }
    return dataAsInt16Array
}

Int16Array 转 Float32Array

function Int16Array2Float32Array(int16Array){
    var data = int16Array;
    var len = data.length, i = 0;
    var dataAsFloat32Array = new Float32Array(len);

    while(i < len){
        dataAsFloat32Array[i] = convert(data[i++]);
    }
    function convert(n) {
        var v = n < 0 ? n / 32768 : n / 32767;       // convert in range [-32768, 32767]
        return Math.max(-1, Math.min(1, v)); // clamp
    }
    return dataAsFloat32Array
}

Float32Array 转 Uint16Array

function Float32Array2Uint16Array(float32Array) {
    var data = float32Array;
    var len = data.length, i = 0;
    var dataAsUint16Array = new Int16Array(len);

    while(i < len){
        dataAsUint16Array[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
    }
    return dataAsUint16Array
}

Uint16Array 转 Float32Array

function Uint16Array2Float32Array(uint16Array){
    var data = uint16Array;
    var len = data.length, i = 0;
    var dataAsFloat32Array = new Float32Array(len);

    while(i < len){
        dataAsFloat32Array[i] = convert(data[i++]);
    }
    function convert(n) {
        var v = n < 0 ? n / 32768 : n / 32767;       // convert in range [-32768, 32767]
        return Math.max(-1, Math.min(1, v)); // clamp
    }
    return dataAsFloat32Array
}

Float32Array 转 Uint8Array

function float32Array2Uint8Array(float32Array) {
    const len = float32Array.length
    var output = new Uint8Array(len)

    for (var i = 0; i < len; i++) {
        var tmp = Math.max(-1, Math.min(1, float32Array[i]))
        tmp = tmp < 0 ? tmp * 0x8000 : tmp * 0x7fff
        tmp = tmp / 256
        output[i] = tmp + 128
    }

    return output
}

Uint8Array 转 Float32Array

function uint8Array2Float32Array(uint8Array) {
    var i
    var l = uint8Array.length
    var outputData = new Float32Array(uint8Array.length)
    for (i = 0; i < l; i++) {
        outputData[i] = (uint8Array[i] - 128) / 128.0
    }
    return outputData
}

Float32Array 转 Int8Array

function float32Array2Int8Array(float32Array) {
    const len = float32Array.length
    var output = new Int8Array(len)

    for (var i = 0; i < len; i++) {
        var tmp = Math.max(-1, Math.min(1, float32Array[i]))
        tmp = tmp < 0 ? tmp * 0x8000 : tmp * 0x7fff
        tmp = tmp / 256
        output[i] = tmp + 128
    }

    return output
}

Int8Array 转 Float32Array

function Int8Array2Float32Array(int8Array) {
    var i
    var l = int8Array.length
    var outputData = new Float32Array(int8Array.length)
    for (i = 0; i < l; i++) {
        outputData[i] = (int8Array[i] - 128) / 128.0
    }
    return outputData
}