1

2 つの 1D ベクトル間の線形畳み込みと相互相関を計算し、FFTaを使用する必要があるアルゴリズムを実装しています。bの長さが で、 の長さが である場合am結果bn畳み込みの合計の長さは になりますm + n - 1

ただし、このアルゴリズムでは、畳み込みの出力が入力と同じ長さである必要があります。であるためm = n、入力ベクトルは同じ長さです。

Matlab では、両方のベクトルが length までゼロ パディングされている場合m + n - 1、畳み込みは次のように計算されます。

ifft(fft(a).*fft(b))

あるいは、2 つのベクトル間の相互相関は次のように計算されます。

fftshift(ifft(fft(a).*conj(fft(b))))

出力の長さは ですm + n - 1。FFT の使用時に循環畳み込みが発生しないように、ベクトルをゼロ パディングする必要があります。

ただし、出力の長さを入力の長さと同じにしたいと思います。関連する質問 (これも stackoverflow に関するもの) は、2 つの画像の相関関係をどのようにトリミングできるかを示しています。

入力ベクトルと同じ長さになるように 1D 出力ベクトルをトリミングするにはどうすればよいですか?

4

2 に答える 2

1

MATLAB では、conv(a, b, 'same')a と同じサイズの畳み込みの中心部分を返します。相互相関の場合、 を使用できますxcorr。これにより、相互相関の結果が得られます。入力と同じサイズを得るには、結果を自分でトリミングする必要があると思います。

于 2012-09-05T15:13:31.467 に答える
0

式があります:

c = a conv b;

ここで、a、b、c は時間領域です。周波数ドメインに変換した後、式は次のように変わります

C = A * B;

ここで、A、B、および C は、それぞれ a、b、および c の fft 結果であり、それらはすべて周波数領域にあります。したがって、c = ifft(C);

于 2012-11-08T05:57:19.273 に答える