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.4750436 からはかなり離れています。

私は何か間違ったことをしていますか?値が予想と大きく異なるのはなぜですか?

4

1 に答える 1

15

convolveとはどちらfft円形です。畳み込みの最初の要素は、これら 2 つのシリーズの内積でなければなりません。得られた結果は、この意味で正しいです。

線形畳み込みを実行するには、次を使用します。

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

この場合、循環畳み込みも適用されますが、線形畳み込みを実現するために必要な量のゼロが入力にパディングされます。

Rで線形畳み込みを実現する直接的な方法はないと思いますが、投稿したFFTアプローチを使用しているため、fftこれは問題ではありません。convolve


循環畳み込み

すべてのn に対してx[n] = x[n+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])

これら 2 つの信号がN値のみで表される場合、 nkの負の値に対してy[nk]の代わりにy [n-k+N]を使用できます。

循環畳み込みの優れた点は、ボックス信号間の線形畳み込みを計算できることです。ボックス信号は有限数の非ゼロ要素を持つ離散信号です。

長さNのボックス信号は、 2Nの周期性を持つ循環畳み込みに供給することができます。元のサンプルはNで、最後にNのゼロがパディングされます。結果は、線形畳み込みの 2N-1と余分なゼロを使用した2Nサンプルの循環畳み込みになります。

巡回畳み込みは、通常、直接的な線形畳み込みの実装よりも高速です。これは、周期的な離散信号に対してのみ定義されている離散フーリエ変換を計算するための高速アルゴリズムである高速フーリエ変換を利用できるためです。


参照してください:

以下も参照してください。

于 2011-03-07T16:08:27.850 に答える