当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R convolve 通过 FFT 进行序列卷积


R语言 convolve 位于 stats 包(package)。

说明

使用快速傅里叶变换来计算两个序列的几种卷积。

用法

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

参数

x, y

要进行卷积的相同长度的数字序列。

conj

逻辑性;如果 TRUE ,则在 back-transforming 之前取复共轭(默认值,用于通常的卷积)。

type

特点;部分匹配 "circular""open""filter" 。对于 "circular" ,这两个序列被视为循环的,即周期性的。

对于 "open""filter" ,首先用 0 (从左到右)填充序列; "filter" 返回 "open" 的中间子向量,即对 x 与权重 y 进行加权平均的结果。

细节

使用快速傅里叶变换 fft 来提高效率。

如果 circular 为 true,则输入序列 xy 必须具有相同的长度。

请注意,两个序列 xy 的卷积的通常定义由 convolve(x, rev(y), type = "o") 给出。

如果 r <- convolve(x, y, type = "open")n <- length(x) , m <- length(y) ,则

其中对于 来说,总和是所有有效索引 的总和。

如果 type == "circular" ,则需要 ,并且上述情况对于 成立,而 对于 成立。

例子

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 <- (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")

参考

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

也可以看看

fftnextn ,特别是 filter (来自 stats 包)可能更合适。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Convolution of Sequences via FFT。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。