我试图直接在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。
我做错了吗?为什么这些价值与预期的不同?
答案 0 :(得分:13)
convolve
和fft
都是循环。卷积的第一个元素必须是这两个系列的点积。从这个意义上说,你获得的结果是正确的。
要执行线性卷积使用:
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 用于线性卷积并且额外为零。
循环卷积通常比直接线性卷积实现更快,因为它可以利用快速傅里叶变换,一种快速算法来计算离散傅里叶变换,这是仅针对周期性离散信号定义。
请参阅:
另见: