平滑数组中的值

Smoothing values across an array

我正在使用 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

我已经玩了一个小时了,我看不出这里发生了什么。

有什么想法吗?

您只是在每次通过内部循环时减去相同的 smoothing 偏移量,而不是访问数组周围的所有元素。您需要从 i - smoothing 迭代 indexi + 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>