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');
Чтобы уточнить свертку, посмотрите также на эту картинку: