我有二维高斯光束:
经过fft2
和角度调整后,我得到了奇怪的结果:
def finite2D(x,y, N, M, a, hx):
f = np.array([[0.0]*N]*N)
for i in range(len(x)):
for k in range(len(y)):
f[i][k] = np.exp(-(x[i]*x[i] + y[k]*y[k]))
D1 = fftpack.fft2(f)
D2 = fftpack.fftshift(D1)
b = N*N/(4*a*M)
x = np.linspace(-b, b, N)
y = np.linspace(-b, b, N)
xx, yy = np.meshgrid(x, y)
plt.imshow(np.abs(D2))
plt.show()
plt.imshow(np.angle(D2))
plt.show(True)
return D2, phas
a = 5
N = 128
M = 256
b = N*N/(4*a*M)
hx = 2*a/N
x = np.linspace(-a, a, N)
y = np.linspace(-a, a, N)
finite2D(x,y, N, M, a, hx)
它应该是0阶段或接近0。为什么不是这种情况,我该如何解决?
///更新:
def finite2D(x,y, N, M, a, hx):
f = np.array([[0.0]*N]*N)
for i in range(len(x)):
for k in range(len(y)):
f[i][k] = np.exp(-(x[i]*x[i] + y[k]*y[k]))
f = fftpack.ifftshift(f)
D1 = fftpack.fft2(f)
D2 = fftpack.fftshift(D1)
b = N*N/(4*a*M)
x = np.linspace(-b, b, N)
y = np.linspace(-b, b, N)
xx, yy = np.meshgrid(x, y)
plt.imshow(np.abs(D2))
plt.show()
plt.imshow(np.angle(D2))
plt.show(True)
return D2
a = 5
N = 128
M = 256
b = N*N/(4*a*M)
hx = 2*a/N
x = np.linspace(-a, a, N, endpoint=False)
y = np.linspace(-a, a, N, endpoint=False)
finite2D(x,y, N, M, a, hx)
阶段:
答案 0 :(得分:1)
FFT假定原点位于图像的左上角。因此,您正在计算偏移了图像大小一半的高斯FFT。这种偏移会导致频域中的高频相移。
要解决此问题,您需要将高斯信号的原点移到图像的左上角。 ifftshift
这样做:
f = fftpack.ifftshift(f)
D1 = fftpack.fft2(f)
D2 = fftpack.fftshift(D1)
请注意,在幅度很小的情况下,相位是由舍入误差定义的,不要期望那里的相位为零。
更新后的结果看起来不错,但是中央区域的梯度仍然很小。这是由高斯的半像素移动引起的。这种移动由x
和y
坐标的定义给出:
N = 128
x = np.linspace(-a, a, N)
y = np.linspace(-a, a, N)
对于大小均匀的N
,请
x = np.linspace(-a, a, N, endpoint=False)
y = np.linspace(-a, a, N, endpoint=False)
,这样有一个示例x==0
。