二维高斯光束的奇异相位

2024-06-16 11:54:39 发布

您现在位置:Python中文网/ 问答频道 /正文

二维高斯光束:

2D Gaussian

在做了fft2和angle之后,我得到了奇怪的结果:

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


Tags: inforlenshownprangepltd2
1条回答
网友
1楼 · 发布于 2024-06-16 11:54:39

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。你知道吗

相关问题 更多 >