Javascript:从Int16转换为Float32

时间:2016-02-05 22:21:37

标签: javascript html5-audio audiobuffer

我正在尝试将一个WAV文件放在AudioBuffer中,以便我可以操作它。我以前从AudioBuffer创建了WAV文件,并且需要将Float32Array转换为包含Int16值的DataView。我使用了这个方便的功能:

function floatTo16BitPCM(output, offset, input){
    for (var i = 0; i < input.length; i++, offset+=2){
        var s = Math.max(-1, Math.min(1, input[i]));
        output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
    }
}

好吧,我现在需要做的就是反转这个(WAV文件是从服务器加载的,所以我不再拥有原始数据了)。我无法弄清楚该函数实际发生了什么或数据是如何转换的。

2 个答案:

答案 0 :(得分:2)

这似乎有用。我在响应类型为“arraybuffer”的ajax调用中加载数据。否则,响应最终成为一个字符串,这是一个混乱的工作。然后我转换为16位数组。然后我以与WAV编码一起使用的方式将其转换为Float32数组。我还需要丢弃WAV的标题,并在结尾处丢弃一些元数据。

public function new_user()
{
    $this->_set_validation_rules();

    if($this->form_validation->run())
    {
        if($user_id = $this->User_model->insert($this->_prepare_new_user_array()))
        {
            $this->common_functions->_send_message("New User created successfully. | user_id: " . $user_id);
        }
        else {
            $this->common_functions->_send_message("Unable to create new User record.");
        }
    }
}

答案 1 :(得分:0)

数组输入的每个实数据都减少到区间[-1,1]

  • Math.min(1,x)给出x,如果x <= 1,则否则为
  • 如果y> = - 1,则Math.max(-1,y)给出y,否则为

然后将-1和1之间的实数转换为带符号的16位整数。

无论是正数还是负数乘以32767或-32768,它都只保留一个整数部分。这相当于在二进制表示中只保留小数点后的16个有效位。

16位整数存储在缓冲区中的两个字节的小端字节中,一个接一个地存储(根据将二进制转换为两个的偏移量)

对于反向操作,只需在int16中放置两个连续的字节。将其转换为符号后面的真实区分两种情况并除以32768或32767.但操作将在数据丢失的情况下完成。