MOD-N循環たたみ込み


7

2つのシーケンスおよび MOD-2循環たたみ込みを見つける方法。h=[1,3,2,1]x=[1,1,2,1,3,2,1,2]

私は答えがmatlabからことを知っていますが、グラフィックまたは数学的にそれを見つける方法がわかりません7 0

回答:


6

書く h(z)=1+3z2z2+z3そして、を計算します。つまり、をで除算し、余りだけを取ります。これは非常に複雑に見えますが、少し考えると、をと 分割しているだけです。と短いベクトルを追加してを取得します。について繰り返し 、長さ 4つのベクトルを追加してを取得します h(z)mod(z21)h(z)z21[13 21][13][21][34]x=[1 1 213212]2[34]。これは、特定のコマンドを提案する構文に精通していませんが、MATLABで行うのはそれほど難しいことではないでしょう。次に、MATLAB関数を呼び出さずに、との巡回畳み込みを計算します。 結果は [34][34]

[{(3)×3+4×4}{(3)×4+4×3}]=[70]

数学的には、あなたがやっていることは を計算することです。これは最初にFFTを使用してを見つけることで空想的に行うことができます。計算(これは長いベクトルを効果的に短い断片に切り分けて追加する)、またはより単純に最初に計算することによってと (より短いベクトルに切り刻み、それらを追加)してから、循環畳み込み これは簡単です。h(z)x(z)mod(z21)h(z)x(z)mod(z21)h^(z)=h(z)mod(z21)x^(z)=x(z)mod(z21)z^(z)x^(z)mod(z21)

Chop-add-convolveはconvolve-chop-addよりも簡単です


1
"chop add convolve"のMatlabは次のようになります:ifft(fft(sum(reshape(x、2 ,, length(x)/ 2)、2))。* conj(fft(sum(reshape(h、2、length(h )/ 2)、2))))
ピシェネット2012

chop-addコードの提案に感謝しますが、私はifft(fftの部分に同意しません。2つのlength-ベクトルの循環たたみ込みは、fftsなどを呼び出さずに直接計算する必要があります。、fftsとifftsの正式なメカニズムはほとんど必要ありません値が大きい場合のModulo-は別の問題です。Modulo-場合は過剰です2
(a+bz)(c+dz)mod(z21)=(ac+(ad+bc)z+bdz2)mod(z21)=(ac+bd)+(ad+bc)z
NN2
Dilip Sarwate

はい、IFFT(FFT()* CONJ(FFT())。)だけ大きなN.のために有用であるとの巡回畳み込みを行う
pichenettes

1
@pichenettes fftアプローチは、(fft)を計算し、乗算してから、畳み込みを見つけます2つのマルト、2つのスケーリング、6つの加算を使用した、結果。直接計算は4つのマルトと2つの加算が必要です。直接コーディングする場合、それはトスアップに近いですが、直接的な方法にはわずかな利点があると思います。MATLABサブルーチン呼び出しのオーバーヘッドを考慮すると、直接法の方が高速です。しかし、もちろん、これらはすべて、実行されている他のものと比較した計算時間におけるピーナッツの比較です。a+b,ab,c+d,cde=(a+b)(c+d),f=(ab)(cd)(e+f)/2(ef)/2ac+bd,ad+bc
Dilip Sarwate、2012

3

1つのアプローチは、フルサイズの循環たたみ込みを「再ラップ」することです。

sum(reshape(ifft(fft(x, 8) .* conj(fft(h, 8))), 2, 8 / 2), 2)

別の実装は、FFTを直接間引くことです。

N = 2;
Xf = fft(x); Xf = Xf(1:length(Xf) / N:end);
Hf = fft(h); Hf = Hf(1:length(Hf) / N:end);
ifft(Xf .* conj(Hf))

再現したいのがMATLABのcconvの動作である場合、MATLABファイルのソースコードを見るのが最善かもしれません:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.