Filter a time-series, possibly recursively
oceFilter(x, a = 1, b, zero.phase = FALSE)
a vector of numeric values, to be filtered as a time series.
a vector of numeric values, giving the
a vector of numeric values, giving the
boolean, set to TRUE
to run the filter forwards,
and then backwards, thus removing any phase shifts associated with the
filter.
A numeric vector of the filtered results,
The filter is defined as e.g. a
and b
are too small, and terms are dropped at the start of
the time series where the index on x
would be less than 1.
By contrast with the filter
function of R, oce.filter
lacks the option to do a circular filter. As a consequence,
oce.filter
introduces a phase lag. One way to remove this lag is to
run the filter forwards and then backwards, as in the “Examples”.
However, the result is still problematic, in the sense that applying it in
the reverse order would yield a different result. (Matlab's filtfilt
shares this problem.)
# NOT RUN {
library(oce)
par(mar=c(4, 4, 1, 1))
b <- rep(1, 5)/5
a <- 1
x <- seq(0, 10)
y <- ifelse(x == 5, 1, 0)
f1 <- oce.filter(y, a, b)
plot(x, y, ylim=c(-0, 1.5), pch="o", type='b')
points(x, f1, pch="x", col="red")
# remove the phase lag
f2 <- oce.filter(y, a, b, TRUE)
points(x, f2, pch="+", col="blue")
legend("topleft", col=c("black","red","blue"), pch=c("o","x","+"),
legend=c("data","normal filter", "zero-phase filter"))
mtext("note that normal filter rolls off at end")
# }
Run the code above in your browser using DataLab