我的腰部有一个2D高斯光束(整个横向平面的相位为零)。当我使用fft2找到2D空间傅立叶变换并绘制相位时,我观察到任何2个相邻数据点之间存在pi相移。但是,当我使用for循环来计算傅里叶变换而不是使用fft2时,我没有观察到这一点。
这是由于相位缠绕吗?我该如何克服这个问题?
感谢。
编辑:我发布了圆形光圈fft的代码,因为观察到相同的结果,并且因为它更简单。
Nx = 200; Ny = Nx;
%creating coordinate grids
x = -Nx/2:Nx/2 - 1; y = -Ny/2:Ny/2 - 1;
[X,Y] = meshgrid(x,y);
r = 15; %radius of aperture
Eip = ((X.^2 + Y.^2 ) <= r^2); %aperture
figure;pcolor(abs(Eip));axis square; shading flat; colorbar;
figure;pcolor(angle(Eip));axis square; shading flat; colorbar;
Cip = fftshift(fft2(Eip)); %FFT
figure;pcolor(abs(Cip));axis square; shading flat; colorbar;
figure;pcolor(angle(Cip));axis square; shading flat; colorbar;
答案 0 :(得分:0)
Cip
证明是真实的。你只看到了连续点之间的符号变化。
Eip
显然是真实的。此外,它沿x和y轴呈现以下对称性。我们先取x轴。对于任何固定的y
,请将Eip
视为在x
值0
,1
,...,Nx-1
定义的有限信号。如果该有限信号被扩展为周期序列,则该周期序列变为偶数。对于Eip
的具体定义,情况确实如此。连同值是真实的这一事实,这意味着 1 ,x
上的DFT也是真实的并且具有相同类型的对称性。现在,关于y轴,同样成立。最终结果是2D-DFT Cip
真实并且具有上述x和y 对称性。
(作为旁注,代码中获得的Cip
不是真实的,而是复杂的。但是,虚部的大小为eps
,因此可以忽略不计。您可以检查:< / p>
>> max(real(Cip(:)))
ans =
709
>> max(imag(Cip(:)))
ans =
4.6262e-014
因此,虚部只是有限数值精度的人工制品。我们可以做到
Cip = real(Cip);
删除虚假虚部。)
既然我们知道Cip
是真实的(达到数值精度),那么它的所有值都具有相位0
或pi
(或等效-pi
是很自然的)。也就是说,您所看到的只是DFT中连续值之间符号的变化。为了说明,请参阅下图,其中显示了Cip
沿着与y
轴平行的线的变化(对应于x
等于120;仅作为示例):
stem(1:Nx, Cip(120,:))
1 参见离散时间信号处理,Oppenheim 等。,第2版,第568-570页。 功能
答案 1 :(得分:0)
为避免这种情况,您需要额外的ifftshift
。
这是由于Matlab使用的算法和您期望的结果。
为了避免pi阶段跳跃,请使用此代码:
fftshift(fft2(ifftshift(Eip)));