Naf*_*Kay 10 java math lowpass-filter
我基本上有一个这样的值数组:
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
Run Code Online (Sandbox Code Playgroud)
上面的数组过于简单,我在实际代码中每毫秒收集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;
}
Run Code Online (Sandbox Code Playgroud)
Don*_*ows 29
要计算指数移动平均值,您需要保持一些状态,并且需要调整参数.这需要一个小类(假设您使用的是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;
}
}
Run Code Online (Sandbox Code Playgroud)
使用您想要的衰减参数进行实例化(可以进行调整;应该在0和1之间)然后用于average(…)过滤.
在阅读有关数学重复的页面时,在将其转换为代码时,您真正需要知道的是数学家喜欢将索引编写到数组和带有下标的序列中.(他们还有一些其他符号,但没有帮助.)但是,EMA非常简单,因为你只需要记住一个旧值; 不需要复杂的状态数组.