Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:插入一个数字数组_Javascript_Arrays_Interpolation - Fatal编程技术网

javascript:插入一个数字数组

javascript:插入一个数字数组,javascript,arrays,interpolation,Javascript,Arrays,Interpolation,几个月前,我一直在寻找一种方法来降低使用HTML5从麦克风捕获的音频数据的采样。我需要输出速率为12000Hz,如果输入是该速率的直接乘法(即48000Hz),我没有问题,但对于其他速率(例如44100Hz),它似乎很复杂 在这些场景中,直接向下采样(每4个只保留1个)不起作用,所以我想到了插值,但stackoverflow当时没有解决方案。所以我自己回答。我的解决方案 这个 用于插值数组的代码 function interpolateArray(data, fitCount) { v

几个月前,我一直在寻找一种方法来降低使用HTML5从麦克风捕获的音频数据的采样。我需要输出速率为12000Hz,如果输入是该速率的直接乘法(即48000Hz),我没有问题,但对于其他速率(例如44100Hz),它似乎很复杂

在这些场景中,直接向下采样(每4个只保留1个)不起作用,所以我想到了插值,但stackoverflow当时没有解决方案。所以我自己回答。

我的解决方案

这个

用于插值数组的代码

function interpolateArray(data, fitCount) {

    var linearInterpolate = function (before, after, atPoint) {
        return before + (after - before) * atPoint;
    };

    var newData = new Array();
    var springFactor = new Number((data.length - 1) / (fitCount - 1));
    newData[0] = data[0]; // for new allocation
    for ( var i = 1; i < fitCount - 1; i++) {
        var tmp = i * springFactor;
        var before = new Number(Math.floor(tmp)).toFixed();
        var after = new Number(Math.ceil(tmp)).toFixed();
        var atPoint = tmp - before;
        newData[i] = linearInterpolate(data[before], data[after], atPoint);
    }
    newData[fitCount - 1] = data[data.length - 1]; // for new allocation
    return newData;
};

这太棒了,我一直在为JavaScript寻找这样的方法。出于好奇,可以稍微调整一下以获得“样条曲线”插值,还是需要大量复制?
var originalArry = [1,5,3];
var newArry = interpolateArray([1,5,3],5);