【问题标题】:Convert int16 array to float将 int16 数组转换为浮点数
【发布时间】:2018-02-20 23:52:19
【问题描述】:

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

每2个字节(16位)代表一个样本,所以我把这个数组转换成一个int16元素数组。

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

【问题讨论】:

    标签: javascript arrays filtering uint16 uint8array


    【解决方案1】:

    您已经有了已签名的 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
    

    【讨论】:

    • 是否可以执行反向功能?从一个浮点值数组中得到一个uint8数组?
    • @user7597554 - 你可以通过乘以 min/ax int16 值从 Float32 到 Int16,然后通过位移和掩码从 int16 到 uint8。 u8buffer[0] = 缓冲区[0] & 0xff; u8buffer[1] = (buffer[0] >> 8) & 0xff;
    【解决方案2】:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多