Во-первых, самая большая ошибка в том, что вы неправильно вычисляете преобразование Фурье. При вычислении F
вы должны суммировать по x и y, чего вы не делаете. Вот как это исправить:
F = zeros(M, N);
for u=0:1:M-1
for v=0:1:N-1
for x=1:1:M
for y=1:1:N
F(u+1,v+1)=F(u+1,v+1) + f(x,y)*exp(-2*pi*(1i)*((u*(x-1)/M)+(v*(y-1)/N)));
end
end
end
end
Во-вторых, в обратном преобразовании ваш брекетинг неверен. Это должно быть 1/(M*N)
, а не (1/M*N)
.
Кроме того, за счет немного большего объема памяти вы можете ускорить вычисления, не вкладывая так много циклов. А именно, при вычислении БПФ вместо этого выполните следующие действия:
x = (1:1:M)'; % x is a column vector
y = (1:1:N) ; % y is a row vector
for u = 0:1:M-1
for v = 0:1:N-1
F2(u+1,v+1) = sum(f .* exp(-2i * pi * (u*(x-1)/M + v*(y-1)/N)), 'all');
end
end
Чтобы довести этот метод до крайности, т.е. вообще не использовать циклы, вы должны сделать следующее (хотя это не рекомендуется, поскольку вы потерял бы читаемость кода и стоимость памяти увеличилась бы в геометрической прогрессии)
x = (1:1:M)'; % x is in dimension 1
y = (1:1:N) ; % y is in dimension 2
u = permute(0:1:M-1, [1, 3, 2]); % x-freqs in dimension 3
v = permute(0:1:N-1, [1, 4, 3, 2]); % y-freqs in dimension 4
% sum the exponential terms in x and y, which are in dimensions 1 and 2.
% If you are using r2018a or older, the below summation should be
% sum(sum(..., 1), 2)
% instead of
% sum(..., [1,2])
F3 = sum(f .* exp(-2i * pi * (u.*(x-1)/M + v.*(y-1)/N)), [1, 2]);
% The resulting array F3 is 1 x 1 x M x N, to make it M x N, simply shiftdim or squeeze
F3 = squeeze(F3);