R中的卷积

时间:2011-03-07 16:02:12

标签: r fft convolution

我试图直接在R中进行卷积并使用FFT然后进行反演。但似乎从简单的观察来看它是不正确的。看看这个例子:

# DIRECTLY
> x2$xt
[1] 24.610 24.605 24.610 24.605 24.610
> h2$xt
[1] 0.003891051 0.003875910 0.003860829 0.003845806 0.003830842
> convolve(h2$xt,x2$xt)
[1] 0.4750436 0.4750438 0.4750435 0.4750437 0.4750435

# USING INVERSE FOURIER TRANSFORM
> f=fft(fft(h2$xt)*fft(x2$xt), inv=TRUE)
> Re(f)/length(f) 
[1] 0.4750438 0.4750435 0.4750437 0.4750435 0.4750436
>

让我们取指数0.在0时,卷积应该只是x2 $ xt(24.610)的最后一个值乘以h2 $ xt(0.003891051)的第一个值,它应该在索引0 = 24.610 * 0.003891051 =时给出卷积0.09575877,这是从0.4750436。

我做错了吗?为什么这些价值与预期的不同?

1 个答案:

答案 0 :(得分:13)

convolvefft都是循环。卷积的第一个元素必须是这两个系列的点积。从这个意义上说,你获得的结果是正确的。

要执行线性卷积使用:

convolve(h2$xt,x2$xt,type="open")

在这种情况下也应用循环卷积,但是将所需数量的零填充到输入以实现线性卷积。

我认为没有直接的方法可以在R中使用fft实现线性卷积。但是,这并不重要,因为convolve本身使用您发布的FFT方法。


循环卷积

如果存在 N 的周期, x [n] = x [n + N] ,则离散信号 x 是周期性的所有 n 。此类信号可由 x [0] x [N-1] N 样本表示。

... x[-2] x[-1] x[0] x[1] x[2] ... x[N-2] x[N-1] x[N] x[N+1] ...
                ^    this part is sufficient   ^

非周期 x y 之间卷积的常规定义定义为:

(x * y)[n] = sum{k in [-inf, inf]}(x[k]y[n-k])

但是,对于周期性信号,此公式不会产生有限的结果。为了解决这个问题,我们在周期性 x y 之间定义循环卷积

(x * y)[n] = sum{k in [0, N-1]}(x[i]y[n-k])

当这两个信号仅以 N 值表示时,我们可以使用 y [n-k + N] 代替 y [nk] < / strong>表示 nk 的负值。

循环卷积的一个很酷的事情是,它可以计算箱信号之间的线性卷积,箱信号是具有有限数量的非零元素的离散信号。

长度 N 的箱信号可以被馈送到循环卷积,其中 2N 周期性, N 用于原始样本且 N 零结尾处填充零。结果将是带有 2N 样本的循环卷积,其中 2N-1 用于线性卷积并且额外为零。

循环卷积通常比直接线性卷积实现更快,因为它可以利用快速傅里叶变换,一种快速算法来计算离散傅里叶变换,这是仅针对周期性离散信号定义。


请参阅:

另见: