【发布时间】:2015-12-23 16:17:51
【问题描述】:
如果我有一个数字数组,例如 [3, 5, 0, 8, 4, 2, 6],有没有办法“平滑”这些值,使它们彼此更接近并显示更少方差?
我已经研究了使用称为高斯函数的方法对数据进行窗口化处理,该函数是 1 维情况,这是我的数组,但在实现它时遇到了麻烦。 This thread 似乎正好解决了我需要的问题,但我不明白用户 naschilling(第二篇文章)是如何得出高斯矩阵值的。
上下文:我正在开发一个音乐波形发生器(借鉴 SoundCloud 的设计),它将歌曲在时间 t 的振幅映射到相应的条形高度。不幸的是,有很多噪音,当程序映射一个微小的幅度导致高度突然降低时,它看起来特别难看。我基本上想平滑条形高度,这样它们就不会那么变化了。
我使用的语言是 Javascript。
编辑:抱歉,让我更具体地说明“平滑”这些值。根据上面链接的线程,用户拿了一个数组
[10.00, 13.00, 7.00, 11.00, 12.00, 9.00, 6.00, 5.00]
并使用高斯函数将其映射到
[ 8.35, 9.35, 8.59, 8.98, 9.63, 7.94, 5.78, 7.32]
请注意这些数字彼此之间的距离如何。
编辑 2:成功了!感谢用户 Awal Garg 的算法,结果如下:
没有平滑 一些平滑 最大平滑
编辑 3:这是我在 JS 中的最终代码。我对其进行了调整,以便数组的第一个和最后一个元素能够通过 环绕 数组而不是调用自身来找到它的邻居。
var array = [10, 13, 7, 11, 12, 9, 6, 5];
function smooth(values, alpha) {
var weighted = average(values) * alpha;
var smoothed = [];
for (var i in values) {
var curr = values[i];
var prev = smoothed[i - 1] || values[values.length - 1];
var next = curr || values[0];
var improved = Number(this.average([weighted, prev, curr, next]).toFixed(2));
smoothed.push(improved);
}
return smoothed;
}
function average(data) {
var sum = data.reduce(function(sum, value) {
return sum + value;
}, 0);
var avg = sum / data.length;
return avg;
}
smooth(array, 0.85);
【问题讨论】:
-
我不确定我理解你的意思平滑值
标签: javascript arrays smoothing