平滑数组中的值

时间:2015-04-03 23:49:31

标签: javascript arrays algorithm web-audio

我正在使用WebAudio API和Analyzer节点来显示音频文件中的FFT数据。

你可以在这里看到它的演示: http://vagrantsophist.com/effects/audio.html (注意:目前仅适用于Chrome,根据您的互联网连接,音频文件需要几秒钟才能完成。)

我的问题:

右侧的滑块应该确定可视化的平滑值。 这是我正在使用的javascript代码:

 function smoothArray(array, smoothing) {
    var newArray = [];

    for (i = 0; i < array.length; i++) {
        var sum = 0;

        for (index = 0; index < (smoothing*2)+1; index++) {
            var thisVal = i - smoothing;
            if (thisVal < 0) {
                thisVal += array.length;
            };
            if (thisVal > array.length) {
                thisVal -= array.length;
            }
            sum += array[thisVal];
        }
        newArray[i] = sum/((smoothing*2)+1);
        index = 0;
    }

    return newArray;
}

var clippedArray = dataArray.subarray(0, 180);

var smoothedArray = smoothArray(clippedArray, document.getElementById("smoothing").value);

理论上,这应该是添加前面的值,当前值和以下值并提取总和的平均值。

出于某种原因,它将数字偏移smoothing

我已经玩了一个小时了,我无法看到这里发生了什么。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

每次通过内循环只是减去相同的smoothing偏移量,你不会访问数组的所有周围元素。您需要将indexi - smoothing迭代到i + smoothing,然后对这些数组元素进行平均。

function smoothArray(array, smoothing) {
    var newArray = [];
    for (i = 0; i < array.length; i++) {
        var sum = 0;

        for (index = i - smoothing; index <= i + smoothing; index++) {
            var thisIndex = index < 0 ? index + array.length : index % array.length;
            sum += array[thisIndex];
        }
        newArray[i] = sum/((smoothing*2)+1);
    }

    return newArray;
}

var clippedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
var smoothedArray = smoothArray(clippedArray, 2);
document.getElementById('result').textContent = JSON.stringify(smoothedArray);
<div id="result"></div>