我正在使用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
。
我已经玩了一个小时了,我无法看到这里发生了什么。
有什么想法吗?
答案 0 :(得分:2)
每次通过内循环只是减去相同的smoothing
偏移量,你不会访问数组的所有周围元素。您需要将index
从i - 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>