3

畳み込み定理によれば、時間領域の畳み込みは fft 領域の積です。正しいゼロパディングを使用すると、次のように機能します。

% convolution in time domain
a = [1 2 3];
b = [4 5 6];
c = conv(a,b);

a_padded=[a 0 0]; b_padded=[b 0 0];
c_bis=ifft(fft(a_padded).*fft(b_padded));
% we do find c_bis=c

ただし、この定理は逆に機能すると考えられます。時間領域の積は、fft 領域の畳み込みです。この部分がわかりません:

d = a.*b;
D=conv(fft(a_padded),fft(b_padded));
d_bis=ifft(D);

これにより、d_bis の複雑なベクトルが得られます。周波数領域での畳み込みを使用して、時間領域で作成された点ごとの積をどのように逆にすることができますか?

4

1 に答える 1

4

興味深い質問です!

間違いは(微妙なものですが)あなたが言うときです

時間領域の積は、FFT 領域の畳み込みです。

フーリエ変換についても同様です。離散フーリエ変換(DFT または FFT) では、正しい定式化は次のとおりです。

時間領域の積は、FFT 領域の循環畳み込みをシーケンス長で割ったものです。

d_bisしたがって、計算でこれを変更する必要があります。

  • 畳み込みではなく循環畳み込みを使用します。
  • シーケンスの長さで割ります。
  • パディングを適用しないでください。

Signal Processing ツールボックスがある場合はcconv、循環畳み込みを計算するために使用できます。

N = length(a);
D = cconv(fft(a),fft(b), N)/N;
d_bis=ifft(D); %// now this equals d

念のため、最初のケース (時間領域での畳み込みが周波数領域で積を与える)の正しい定式化には、循環畳み込みも含まれます。

時間領域での循環畳み込みは、FFT 領域での積です。

(この場合、シーケンス長による除算はありません)

しかし、時間領域でゼロをパディングしたため、通常のたたみ込みと循環たたみ込みの違いがなくなり、正しい結果が得られます。パディングなしでは、次のようになります。

c = cconv(a, b, N);
c_bis=ifft(fft(a).*fft(b)); %// this equals c
于 2014-02-18T22:24:58.933 に答える