| make.filter {oce} | R Documentation |
make a digital filter
make.filter(type=c("blackman-harris","rectangular", "hamming", "hann"), m)
type |
a string indicating the type of filter: "blackman-harris"
for the Blackman-Harris filter (a modified raised-cosine filter),
"rectangular" for a flat filter, "hamming" for a Hamming
filter (a raised-cosine that does not taper to zero at the ends), or
"hann" (a raised cosine that tapers to zero at the ends).
Many sources define these filters; see Harris (1978) for a comparison of
these and other filters. |
m |
length of filter. This should be an odd number, for any non-rectangular filter. |
The filter is suitable for use by filter or
convolve. Note that convolve should be
faster than filter, but it cannot be used if the time
series has missing values. For the Blackman-Harris filter,
the half-power frequency is possibly 1/m cycles per time unit
(see “Examples”). When using filter with these
filters, use circular=TRUE.
A list of filter coefficients, symmetric about the midpoint and
summing to 1. These may be used with filter, which
should be provided with argument circular=TRUE to avoid phase offsets.
Dan Kelley
F. J. Harris, 1978. On the use of windows for harmonic analysis with the discrete Fourier Transform. Proceedings of the IEEE, 66(1), 51-83 (http://web.mit.edu/xiphmont/Public/windows.pdf.)
library(oce)
x <- c(rep(0,30),rep(1,30),rep(0,30))
plot.ts(x)
x1 <- filter(x, make.filter("blackman-harris", 5))
lines(x1, col='red')
x2 <- filter(x, make.filter("blackman-harris", 10))
lines(x2, col='blue')
legend("topright", lwd=1, col=c("red", "blue"), legend=c("m=5", "m=10"))
# Spectral representation
r <- rnorm(1e4)
r.spec <- spectrum(r, spans=c(21,5,3), plot=FALSE)
length <- 10
f <- make.filter("blackman-harris", length)
r.lowpass <- filter(r, f, circular=TRUE)
r.lowpass.spec <- spectrum(r.lowpass, spans=c(21,5,3), plot=FALSE)
plot(r.spec$freq, r.spec$spec, ylim=c(0.01, 2), log="xy", type="l")
lines(r.lowpass.spec$freq, r.lowpass.spec$spec, col="red")
abline(v=1/length, col="blue")
abline(h=1, col="blue")
abline(h=1/2, col="blue") # half power