Я реализую Gerchberg-Saxton-Algorithm для фазового поиска в Matlab как часть отчета. Когда у меня не было доступа к ПК с лицензией Matlab, я подумал, что могу продолжить работу с Scilab. Однако результаты заметно отличаются.Алгоритм ведет себя по-разному в matlab и scilab
код Matlab:
function [ realphase ] = GerchSax(source, target, iterations)
[n, m] = size(target);
fourierspace = fft2(source);
for iter=1:iterations
fourierphase = angle(fourierspace);
fourierspace = sqrt(abs(target)) .* exp(1i * fourierphase);
realspace = ifft2(fourierspace);
realphase = angle(realspace);
realspace = sqrt(abs(source)) .* exp(1i * realphase);
fourierspace = fft2(realspace);
end
Scilab Код:
function [ res ] = angle(A)
res = atan(imag(A), real(A))
endfunction
function [ realphase ] = GerchSax(source, target, iterations)
fourierspace = fft(source);
for iter=1:iterations
fourierphase = angle(fourierspace);
fourierspace = sqrt(abs(target)) .* exp(%i * fourierphase);
realspace = ifft(fourierspace);
realphase = angle(realspace);
realspace = sqrt(abs(source)) .* exp(%i * realphase);
fourierspace = fft(realspace);
end
Реализация функции "угол" происходит непосредственно из Scilab documentation. Как я понимаю, fft
в matlab выполняет преобразование Фурье по каждому вектору столбца независимо, если задано матрица (таким образом, использование fft2
для фактического преобразования 2D Фурье), тогда как scilab уже выполняет «реальное» 2D-преобразование с fft
.
Я использовал source = [1 1 1; 1 2 1; 1 1 1]
, target = [0 1 1; 0 1 1; 0 0 0]
и 1000 итераций в обеих программах. Matlab возвращает следующее распределение фаз:
-3.0589 -1.0472 0.9645
3.1416 0 3.1416
3.0589 1.0472 -0.9645
В то время как я получаю это распределение фазы от Scilab:
2.0943951 - 1.0471976 2.0943951
3.1415927 - 1.977D-16 3.1415927
- 2.0943951 1.0471976 - 2.0943951
ли я сделать какие-либо ошибки преобразования кода Matlab в правильное эквивалент Scilab? Является ли FFT по-разному в этих средах?