高斯光束2D的奇怪相位

时间:2019-04-07 08:09:06

标签: python fft

我有二维高斯光束:

2D Gaussian

经过fft2和角度调整后,我得到了奇怪的结果:

magnitude of FFT

phase of FFT

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)

阶段: Phase

1 个答案:

答案 0 :(得分:1)

FFT假定原点位于图像的左上角。因此,您正在计算偏移了图像大小一半的高斯FFT。这种偏移会导致频域中的高频相移。

要解决此问题,您需要将高斯信号的原点移到图像的左上角。 ifftshift这样做:

f = fftpack.ifftshift(f)
D1 = fftpack.fft2(f)
D2 = fftpack.fftshift(D1)

请注意,在幅度很小的情况下,相位是由舍入误差定义的,不要期望那里的相位为零。


更新后的结果看起来不错,但是中央区域的梯度仍然很小。这是由高斯的半像素移动引起的。这种移动由xy坐标的定义给出:

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