算法在 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 中获得相同的结果。
我正在 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 中获得相同的结果。