當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。