我基本上有一个像这样的值数组:
0.25, 0.24, 0.27, 0.26, 0.29, 0.34, 0.32, 0.36, 0.32, 0.28, 0.25, 0.24, 0.25
上面的数组过于简化,我在实际代码中每毫秒收集1个值,我需要使用编写的算法处理输出,以找到某个时间点之前最接近的峰值。我的逻辑失败了,因为在上面的示例中,
0.36
是真正的峰值,但是我的算法会向后看,并将最后一个数字0.25
视为峰值,因为0.24
之前有所减少。目标是获取这些值并对其应用一种算法,该算法将使它们“平滑”一些,以便获得更多的线性值。 (即:我希望自己的成绩是弯曲的,而不是参差不齐)
有人告诉我对我的值应用指数移动平均滤波器。我怎样才能做到这一点?我真的很难读数学方程式,我对代码的处理要好得多。
如何处理数组中的值,应用指数移动平均值计算使它们均匀?
float[] mydata = ...
mySmoothedData = exponentialMovingAverage(mydata, 0.5);
float[] exponentialMovingAverage(float[] input, float alpha) {
// what do I do here?
return result;
}
最佳答案
要计算exponential moving average,您需要保持一些状态,并且需要一个调整参数。这需要一个小类(假设您使用的是Java 5或更高版本):
class ExponentialMovingAverage {
private double alpha;
private Double oldValue;
public ExponentialMovingAverage(double alpha) {
this.alpha = alpha;
}
public double average(double value) {
if (oldValue == null) {
oldValue = value;
return value;
}
double newValue = oldValue + alpha * (value - oldValue);
oldValue = newValue;
return newValue;
}
}
用所需的衰减参数实例化(可能需要调整;应在0到1之间),然后使用
average(…)
进行过滤。在阅读有关某种数学递归的页面时,将其转换为代码时,您真正需要知道的只是数学家喜欢将索引写入带有下标的数组和序列中。 (它们还有其他一些表示法,这无济于事。)但是,EMA非常简单,因为您只需要记住一个旧值即可。不需要复杂的状态数组。