convolve
Convolution of Sequences via FFT
Use the Fast Fourier Transform to compute the several kinds of convolutions of two sequences.
Usage
convolve(x, y, conj = TRUE, type = c("circular", "open", "filter"))
Arguments
 x, y
 numeric sequences of the same length to be convolved.
 conj
 logical; if
TRUE
, take the complex conjugate before backtransforming (default, and used for usual convolution).  type
 character; partially matched to
"circular"
,"open"
,"filter"
. For"circular"
, the two sequences are treated as circular, i.e., periodic.For
"open"
and"filter"
, the sequences are padded with0
s (from left and right) first;"filter"
returns the middle subvector of"open"
, namely, the result of running a weighted mean ofx
with weightsy
.
Details
The Fast Fourier Transform, fft
, is used for efficiency.
The input sequences x
and y
must have the same length if
circular
is true.
Note that the usual definition of convolution of two sequences
x
and y
is given by convolve(x, rev(y), type = "o")
.
Value

If
r < convolve(x, y, type = "open")
and n < length(x)
, m < length(y)
, then
$$r_k = \sum_{i} x_{km+i} y_{i}$$
where the sum is over all valid indices $i$, for
$k = 1, \dots, n+m1$.If type == "circular"
, $n = m$ is required, and the above is
true for $i , k = 1,\dots,n$ when
$x[j] := x[n+j]$ for $j < 1$.
References
Brillinger, D. R. (1981) Time Series: Data Analysis and Theory, Second Edition. San Francisco: HoldenDay.
See Also
fft
, nextn
, and particularly
filter
(from the stats package) which may be
more appropriate.
Examples
library(stats)
require(graphics)
x < c(0,0,0,100,0,0,0)
y < c(0,0,1, 2 ,1,0,0)/4
zapsmall(convolve(x, y)) # *NOT* what you first thought.
zapsmall(convolve(x, y[3:5], type = "f")) # rather
x < rnorm(50)
y < rnorm(50)
# Circular convolution *has* this symmetry:
all.equal(convolve(x, y, conj = FALSE), rev(convolve(rev(y),x)))
n < length(x < 20:24)
y < (x10)^2/1000 + rnorm(x)/8
Han < function(y) # Hanning
convolve(y, c(1,2,1)/4, type = "filter")
plot(x, y, main = "Using convolve(.) for Hanning filters")
lines(x[c(1 , n) ], Han(y), col = "red")
lines(x[c(1:2, (n1):n)], Han(Han(y)), lwd = 2, col = "dark blue")