JavaScript:插值一个数字数组

6
几个月前,我在寻找一种使用HTML5下采样从麦克风捕获的音频数据的方法。如果输入是12000Hz的倍数(即48000Hz),那么我需要输出速率为12000Hz,对于其他速率(如44100Hz)似乎很复杂。
在这些情况下,直接下采样(仅保留4个中的1个)不起作用,因此我想到了插值,但当时stackoverflow上没有解决方案。所以我自己来回答这个问题。
1个回答

20

我的解决方案的来源

演示版

插值数组的代码。

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

使用示例:

var originalArry = [1,5,3];
var newArry = interpolateArray([1,5,3],5);

这太棒了,我一直在寻找JavaScript中这样的方法。只是出于好奇,这能稍微调整一下以获得“样条”插值,还是需要进行大量复制? - SGhaleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接