6

我尝试直接在 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。

难道我做错了什么?为什么值与预期如此不同?

4

1 回答 1

15

convolve和都是圆形fft的。卷积的第一个元素一定是这两个系列的点积。你得到的结果在这个意义上是正确的。

要执行线性卷积,请使用:

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

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

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


循环卷积

如果有一个周期N使得所有n的x[n] = x[n+N] ,则离散信号x是周期性的。这样的信号可以用从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   ^

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

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

然而,对于周期性信号,这个公式不会产生有限的结果。为了克服这个问题,我们定义了周期性xy之间的循环卷积

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

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

循环卷积的酷之处在于它可以计算盒信号之间的线性卷积,盒信号是具有有限数量的非零元素的离散信号。

长度为N的框信号可以被馈送到具有2N周期的循环卷积,N用于原始样本,最后填充N个零。结果将是具有2N个样本的循环卷积,其中2N-1用于线性卷积和一个额外的零。

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


请参见:

另见:

于 2011-03-07T16:08:27.850 回答