2015-10-27 3 views
1

Я реализую 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 по-разному в этих средах?

ответ

1

fft отличается между Scilab и Matlab, приведенная ниже ссылка покажет вам, как реализовать fft, чтобы иметь эквивалентный результат либо в matlab, либо в scilab.

fft (Matlab function)

Смежные вопросы