

   convolve {base}                              R Documentation

   FFaasstt CCoonnvvoolluuttiioonn

   DDeessccrriippttiioonn::

        Use the Fast Fourier Transform to compute the several
        kinds of convolutions of two sequences.

   UUssaaggee::

        convolve(x, y, conj = TRUE, type = c("circular", "open", "filter"))

   AArrgguummeennttss::

        x,y: numeric sequences of the same length to be con-
             volved.

       conj: logical; if `TRUE', take the complex conjugate
             before back-transforming (default, and used for
             usual convolution).

       type: character; one of `"circular"', `"open"', `"fil-
             ter"' (beginning of word is ok).  For `circular',
             the two sequences are treated as circular, i.e.,
             periodic.

             For `open' and `filter', the sequences are padded
             with `0's (from left and right) first; `"filter"'
             returns the middle sub-vector of `"open"', namely,
             the result of running a weighted mean of `x' with
             weights `y'.

   DDeettaaiillss::

        The Fast Fourier Transform, `fft', is used for effi-
        ciency.

        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")'.

   VVaalluuee::

        If `r <- convolve(x,y, type = "open")' and `n <-
        length(x)', `m <- length(y)', then

                    r[k] = sum(i; x[k-m+i] * y[i])

        where the sum is over all valid indices i, for k =
        1,..., n+m-1

        If `type == "circular"', n = m is required, and the
        above is true for i , k = 1,...,n when x[j] := x[n+j]
        for j < 1.

   RReeffeerreenncceess::

        Brillinger, D. R. (1981).  Time Series: Data Analysis
        and Theory, Second Edition.  San Francisco: Holden-Day.

   SSeeee AAllssoo::

        `fft', `nextn'.

   EExxaammpplleess::

        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 <- (x-10)^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, (n-1):n)], Han(Han(y)), lwd=2, col="dark blue")

