2D круговая свертка против свертки FFT [Matlab/Octave/Python]

Я пытаюсь понять FTT и теорию свертки (взаимной корреляции), и по этой причине я создал следующий код, чтобы понять это. Код Matlab/Octave, но я мог бы сделать это и на Python.

В 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

В 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 когда x а также y являются векторами, но как насчет того, когда они являются матрицами? Как я мог продолжить мой пример здесь?

1 ответ

Решение

Вам нужно обнулить одну переменную с помощью:

  • Столько нулевых столбцов, сколько столбцов другой переменной минус один.
  • Столько нулевых строк, сколько строк в другой переменной минус один.

В 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'); 

Чтобы уточнить свертку, посмотрите также на эту картинку:

Другие вопросы по тегам