Exponential smoothing for non-constant time steps

I played around with moving averages, but for an iterative algorithm and low memory requirements (storing a lot of values), exponential smoothing seems the way to go.

To calculate the smoothed value over time I came up with this monster:

smooth(t,x,w) = getindex.(
  accumulate(
    (a,b)->(b[1],(a[2]*exp(-a[1]/w)+(1-exp(-a[1]/w))*b[2])),
    Iterators.zip(vcat(diff(t),0),x)
  ),2)

Is there a package that does something like this nicer / faster?

Here is an example:

t = rand(500)
t[170:200] .*=20
t = cumsum(t)
x = rand(500)
x[200:250] .*=10
x = cumsum(x)

using GLMakie
plot(t,x)
w = 20
plot!(t.-w,smooth(t,x,w))

julia> using BenchmarkTools
julia> @benchmark smooth(t,x,w)
@benchmark smooth(t,x,w)
BenchmarkTools.Trial: 10000 samples with 1 evaluation.
 Range (min … max):  13.840 μs … 97.470 μs  ┊ GC (min … max): 0.00% … 0.00%
 Time  (median):     19.480 μs              ┊ GC (median):    0.00%
 Time  (mean ± σ):   20.006 μs ±  2.835 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%

                                   ▅█▆▂                        
  ▂▂▂▂▂▁▂▁▁▂▂▂▂▂▂▂▁▁▂▂▂▂▁▁▂▁▂▂▂▂▂▂▄████▇▅▇▆▆▄▃▃▃▂▄▅▅▄▃▃▃▃▃▃▂▂ ▃
  13.8 μs         Histogram: frequency by time        22.9 μs <

 Memory estimate: 20.12 KiB, allocs estimate: 4.


Check this post.

I don’t see the option to use time values in the discussed cases.

OK, but maybe it’s worth trying with linear interpolation on a constant time step?

Another package:
Moving Averages · MarketTechnicals.jl (juliahub.com)