Python 二维高斯光束的奇异相位

Python 二维高斯光束的奇异相位,python,fft,Python,Fft,我有二维高斯光束: 在完成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 = fftpa

我有二维高斯光束:

在完成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)
阶段:
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==0

@CrisLuengo的可能重复我不太明白这如何解决我的问题。你能帮我修改密码吗?@SoH:请检查更新的答案。在发现明显的大问题后,我没有注意细节@SoH:很抱歉没有明确说明,x和y都需要相同的处理。请注意,对x的更改是如何删除其中一个渐变的。以相同的方式更改y将删除其他渐变。
x = np.linspace(-a, a, N, endpoint=False)
y = np.linspace(-a, a, N, endpoint=False)