二维高斯光束的奇异位相

2022-04-02 00:00:00 python fft

问题描述

我有2D高斯光束:

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)

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


更新结果看起来不错,但中心区域仍有很小的梯度。这是由高斯的半像素偏移引起的。此移位由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

相关文章