I'm not sure if this is the fastest code I can get, but it looks like it looks like this:
DEMA[data_, alpha_, gamma_] := Module[{st = First[data], bt = data[[2]] - data[[1]], btnew, stnew}, Reap[ Sow[st]; Do[ stnew = alpha y + (1 - alpha) (st + bt); btnew = gamma (stnew - st) + (1 - gamma) bt; Sow[stnew]; st = stnew; bt = btnew; , {y, Rest@data }]][[-1, 1] ]]
This is almost straight from the page you linked to. You can change the initial condition for b in the source code. Setting bt to zero initially restores a single exponential smoothing.
In[81]:= DEMA[{a, b, c, d}, alpha, gamma] Out[81]= {a, (1 - alpha) b + alpha b, alpha c + (1 - alpha) ((1 - alpha) b + alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + alpha b) gamma), alpha d + (1 - alpha) (alpha c + (1 - gamma) ((-a + b) (1 - gamma) + (-a + (1 - alpha) b + alpha b) gamma) + (1 - alpha) ((1 - alpha) b + alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + alpha b) gamma) + gamma (-(1 - alpha) b - alpha b + alpha c + (1 - alpha) ((1 - alpha) b + alpha b + (-a + b) (1 - gamma) + (-a + (1 - alpha) b + alpha b) gamma)))}
Sasha
source share