2D 循环卷积与卷积 FFT [Matlab/Octave/Python]

2024-02-18

我试图理解 FTT 和卷积(互相关)理论,因此我创建了以下代码来理解它。代码是 Matlab/Octave,但我也可以用 Python 来完成。

In 1D:

 x = [5 6 8 2 5]; 
 y = [6 -1 3 5 1];
 x1 = [x zeros(1,4)];
 y1 = [y zeros(1,4)];
 c1 = ifft(fft(x1).*fft(y1));
 c2 = conv(x,y);

 c1 =   30   31   57   47   87   47   33   27    5 
 c2 =   30   31   57   47   87   47   33   27    5

In 2D:

 X=[1 2 3;4 5 6; 7 8 9]
 y=[-1 1];
 conv1 = conv2(x,y)
 conv1 =
        24    53    89    29    21
        96   140   197    65    42
       168   227   305   101    63

这是我发现问题的地方,填充一个矩阵和一个向量?我该怎么做呢?我可以垫x周围有零?或者只是在一侧?那么呢y?我知道卷积的长度应该是M+L-1 when x and y是向量,但是当它们是矩阵时呢? 我怎样才能在这里继续我的例子?


您需要使用以下方法对一个变量进行零填充:

  • 零列的数量等于其他变量的列数减去 一。
  • 零行的数量与另一个变量的行数减一的数量相同。

在 Matlab 中,它看起来如下:

% 1D
x = [5 6 8 2 5]; 
y = [6 -1 3 5 1];
x1 = [x zeros(1,size(x,2))];
y1 = [y zeros(1,size(y,2))];
c1 = ifft(fft(x1).*fft(y1));
c2 = conv(x,y,'full');

% 2D 
X = [1 2 3;4 5 6; 7 8 9];
Y = [-1 1];
X1 = [X zeros(size(X,1),size(Y,2)-1);zeros(size(Y,1)-1,size(X,2)+size(Y,2)-1)];
Y1 = zeros(size(X1));    Y1(1:size(Y,1),1:size(Y,2)) = Y;
c1 = ifft2(fft2(X1).*fft2(Y1));
c2 = conv2(X,Y,'full'); 

为了搞清楚卷积,再看看这张图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2D 循环卷积与卷积 FFT [Matlab/Octave/Python] 的相关文章

随机推荐