我试图直接在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
>
Run Code Online (Sandbox Code Playgroud)
让我们取指数0.在0时,卷积应该只是x2 $ xt(24.610)的最后一个值乘以h2 $ xt(0.003891051)的第一个值,它应该在索引0 = 24.610*0.003891051 = 0.09575877处给出卷积,这是从0.4750436离开.
难道我做错了什么?为什么价值观与预期不同?
Tug*_*tes 13
两个convolve和fft是圆形.卷积的第一个元素必须是这两个系列的点积.从这个意义上说,您获得的结果是正确的.
要执行线性卷积使用:
convolve(h2$xt,x2$xt,type="open")
Run Code Online (Sandbox Code Playgroud)
在这种情况下也应用循环卷积,但是将所需量的零填充到输入以实现线性卷积.
我相信fft在R中没有直接的方法来实现线性卷积.但是这并不重要因为beacuse convolve本身使用你发布的FFT方法.
如果存在周期N,则离散信号x是周期性的,使得对于所有n,x [n] = x [n + 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 ^
Run Code Online (Sandbox Code Playgroud)
非周期性x和y之间的卷积的常规定义定义为:
(x * y)[n] = sum{k in [-inf, inf]}(x[k]y[n-k])
Run Code Online (Sandbox Code Playgroud)
但是,对于周期性信号,该公式不会产生有限的结果.为了克服这个问题,我们定义了周期x和y之间的循环卷积.
(x * y)[n] = sum{k in [0, N-1]}(x[i]y[n-k])
Run Code Online (Sandbox Code Playgroud)
当这两个信号仅用N值表示时,我们可以使用y [n-k + N]代替y [nk]来表示nk的负值.
圆形卷积的一个很酷的事情是它可以计算盒子信号之间的线性卷积,盒子信号是具有有限数量的非零元素的离散信号.
长度为N的盒信号可以馈送到具有2N周期的循环卷积,N用于原始样本,N个零填充在末尾.结果将是具有2N个样本的循环卷积,其中2N-1用于线性卷积并且额外为零.
循环卷积通常比直接线性卷积实现更快,因为它可以利用快速傅立叶变换,快速算法来计算离散傅里叶变换,其仅针对周期性离散信号定义.
请参阅:
另见: