この例では、線形畳み込みと循環畳み込みの間に等価性を確立する方法を示します。
線形畳み込みと円形畳み込みは根本的に異なる操作です。 しかし、線形畳み込みと円形畳み込みが等価である条件があります。 この等価性を確立することは重要な意味を持っています。 2つのベクトルx
とy
の場合、循環畳み込みは、ベクトルのDftの積の逆離散フーリエ変換(DFT)に等しくなります。 線形畳み込みと循環畳み込みが等価である条件を知ることで、DFTを使用して線形畳み込みを効率的に計算することができます。
N点ベクトルx
とL点ベクトルy
の線形畳み込みの長さはN+L-1です。
xとyの循環畳み込みを等価にするには、DFTを取得する前に、少なくともn+L-1の長さにゼロでベクトルを埋めなければなりません。 Dftの積を反転した後、最初のN+L-1要素のみを保持します。
2つのベクトルx
とy
を作成し、2つのベクトルの線形畳み込みを計算します。
x = ;y = ;clin = conv(x,y);
出力の長さは4+3-1です。
両方のベクトルを長さ4+3-1にゼロで埋めます。 両方のベクトルのDFTを取得し、Dftを乗算し、積の逆DFTを取得します。
xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));
ゼロパディングベクトルxpad
とypad
の循環畳み込みは、x
とy
の線形畳み込みに相当します。 出力の長さは4+3-1なので、ccirc
のすべての要素を保持します。
線形畳み込みの出力とDFT積の逆数をプロットして、等価性を示します。
subplot(2,1,1)stem(clin,'filled')ylim()title('Linear Convolution of x and y')subplot(2,1,2)stem(ccirc,'filled')ylim()title('Circular Convolution of xpad and ypad')
ベクトルを長さ12にパッドし、Dftの積の逆DFTを使用して円形畳み込みを取得します。 線形畳み込みと同等の結果を生成するには、最初の4+3-1要素のみを保持します。
N = length(x)+length(y)-1;xpad = ;ypad = ;ccirc = ifft(fft(xpad).*fft(ypad));ccirc = ccirc(1:N);
Signal Processing Toolbox™ソフトウェアには、2つのベクトルの循環畳み込みを返す関数cconv
があります。 次のコードで循環畳み込みを使用して、x
とy
の線形畳み込みを取得できます。
ccirc2 = cconv(x,y,6);
cconv
前の例で示したのと同じDFTベースの手順を内部的に使用します。