算法在 matlab 和 scilab 中的表现不同

Algorithm behaves differently in matlab and scilab

我正在 Matlab 中实现 Gerchberg-Saxton-Algorithm 相位检索作为报告的一部分。当我无法访问具有 Matlab 许可证的 PC 时,我想我可以继续使用 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

"angle" 函数的实现直接来自 Scilab documentation。据我了解,如果给定矩阵,matlab 中的 fft 会独立地对每个列向量执行傅立叶变换(因此使用 fft2 进行实际的二维傅立叶变换),而 scilab 已经做了 'real' fft.

二维变换

我在两个程序中都使用了 source = [1 1 1; 1 2 1; 1 1 1]target = [0 1 1; 0 1 1; 0 0 0] 和 1000 次迭代。 Matlabreturns相位分布如下:

   -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 在这些环境中的实现方式不同吗?

fft 在 Scilab 和 Matlab 之间是不同的,下面的 link 将向您展示如何实现 fft 以在 matlab 或 scilab 中获得相同的结果。

fft (Matlab function)