用于远场衍射模拟的2D FFT中的频移操作顺序(使用Matlab/Octave/Scipy)

用于远场衍射模拟的2D FFT中的频移操作顺序(使用Matlab/Octave/Scipy),matlab,scipy,signal-processing,fft,octave,Matlab,Scipy,Signal Processing,Fft,Octave,在Matlab/Octave/Scipy中,在两个平面(输出平面为输入平面的远场衍射平面)之间来回执行2D傅里叶变换后,如何正确地移动频率分量 假设我想在这两个平面之间运行一个迭代傅里叶变换算法,以便计算全息图(应用于输入平面的相位延迟图案),以便在输出平面中获得给定的强度图案 将输入平面中的字段称为 输出平面中的场称为B 所以B是A的傅里叶变换,A是B的逆傅里叶变换(这是根据弗兰霍夫衍射理论得出的) 问题是:在连接两个平面的傅里叶变换之间,我应该以什么顺序使用命令fftshift移动频率分量

在Matlab/Octave/Scipy中,在两个平面(输出平面为输入平面的远场衍射平面)之间来回执行2D傅里叶变换后,如何正确地移动频率分量

假设我想在这两个平面之间运行一个迭代傅里叶变换算法,以便计算全息图(应用于输入平面的相位延迟图案),以便在输出平面中获得给定的强度图案

将输入平面中的字段称为 输出平面中的场称为B

所以B是A的傅里叶变换,A是B的逆傅里叶变换(这是根据弗兰霍夫衍射理论得出的)

问题是:在连接两个平面的傅里叶变换之间,我应该以什么顺序使用命令fftshift移动频率分量

似乎写下以下内容并不起作用: B=FFT换档(fft2(A)); A2=FFT换档(ifft2(B))


这可能是一个常见问题,但我在任何地方都找不到答案。

我不确定我是否理解您的用例,但
fftshift
的一般用途是旋转
fft
的输出,以使DC(零频率)仓居中。因此,通常的模式是:

X       = fft2(x);         % DC at X(1,1)
X_shift = fftshift(X);     % DC at X_shift(M/2+1,N/2+1)

% ... processing occurs here (Y_shift = foo(X_shift)) ...

Y       = ifftshift(Y_shift);
y       = ifft2(Y);

为什么要使用
fftshift
呢?问得好。。实际上,我在两个平面上都有所需的场模,它在每次迭代时替换输入和输出场的模-因此,即使我在每次fft2之后不FFT移动计算场,我也需要移动所需的模。。你明白这个论点吗?也许问题是我使用fftshift而不是ifftshift进行逆变换。你是说fftshift(fftshift(X))!=十、 但是ifftshift(fftshift(X))==X?这里是一个典型的用例示例:@calvintiger:Yes。试试
X=[12;34;56]
.OMG。这就是原因。非常感谢你,我自己是不会找到它的,至少在合理的时间内不会:)