我研究了使用高斯函数对数据进行窗口化的方法,针对的是一维情况,即我的数组,但我在实现时遇到了麻烦。这个帖子似乎完全解决了我需要的问题,但我不明白用户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的算法,以下是结果: 无平滑处理
![](https://i.imgur.com/0HQpG0o.png)
![](https://i.imgur.com/uwMpXcU.png)
![](https://i.imgur.com/IkCbh5j.png)
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);