scipy 的快速傅里叶逆变换 (ifft2) 不适用于傅里叶光学

问题描述 投票:0回答:1

我正在关注 YouTube 上有关 Python 中的傅里叶光学的教程,以模拟光通过狭缝的衍射。
相关视频
视频源代码
现在,我正在尝试实现

get_U(z, k)
函数,然后在其下方显示相应的绘图,如视频所示(我对这个主题有基本的了解),但是,我似乎无法理解绘图工作(白色绘图始终可见)。经过检查,我发现
U
变量只是由一堆
(nan+nanj)
值组成,我认为不应该是这样。我已经交叉检查了公式,它看起来很完美。我还意识到,有时
np.sqrt()
必须处理负值,但添加
np.abs()
np.where()
(将负数转换为零)都不会给我预期的输出。
我的代码:

import numpy as np
import scipy as sp
from scipy.fft import fft2, ifft2, fftfreq, fftshift
import matplotlib.pyplot as plt
import pint

plt.style.use(['grayscale'])
u = pint.UnitRegistry()

D = 0.1 * u.mm
lam = 660 * u.mm

x = np.linspace(-2, 2, 1600) * u.mm
xv, yv = np.meshgrid(x, x)

U0 = (np.abs(xv) < D/2) * (np.abs(yv) < 0.5 * u.mm)
U0 = U0.astype(float)

A = fft2(U0)
kx = fftfreq(len(x), np.diff(x)[0]) * 2 * np.pi
kxv, kyv = np.meshgrid(kx, kx)

def get_U(z, k):
  return ifft2(A*np.exp(1j*z.magnitude*np.sqrt(k.magnitude**2 - kxv.magnitude**2 - kyv.magnitude**2)))
k = 2*np.pi/(lam)
d = 3 * u.cm
U = get_U(d, k)

plt.figure(figsize=(5, 5))
plt.pcolormesh(xv, yv, np.abs(U), cmap='inferno')
plt.xlabel('$x$ [mm]')
plt.ylabel('$y$ [mm]')
plt.title('Single slit diffraction')
plt.show()
python numpy matplotlib scipy fft
1个回答
0
投票

你的 lam 单位是错误的 - 如果你打算使用品脱(但我建议你不要)那么它们应该是 nm,而不是 mm。

当您进行更改后,我建议您删除所有对品脱和混合单位的引用,并完全使用一组长度单位(此处为米)。然后你就会得到我认为你需要的东西。

enter image description here

import numpy as np
import scipy as sp
from scipy.fft import fft2, ifft2, fftfreq, fftshift
import matplotlib.pyplot as plt

plt.style.use(['grayscale'])

D = 0.1   * 1e-3
lam = 660 * 1e-9

x = np.linspace(-2, 2, 1600) * 1e-3
xv, yv = np.meshgrid(x, x)

U0 = (np.abs(xv) < D/2) * (np.abs(yv) < 0.5 * 1e-3)
U0 = U0.astype(float)

A = fft2(U0)
kx = fftfreq(len(x), np.diff(x)[0]) * 2 * np.pi
kxv, kyv = np.meshgrid(kx, kx)

def get_U(z, k):
  return ifft2(A*np.exp(1j*z*np.sqrt(k**2 - kxv**2 - kyv**2)))
k = 2*np.pi/(lam)
d = 3 * 1e-2
U = get_U(d, k)

plt.figure(figsize=(5, 5))
plt.pcolormesh(xv*1e3, yv*1e3, np.abs(U), cmap='inferno')
plt.xlabel('$x$ [mm]')
plt.ylabel('$y$ [mm]')
plt.title('Single slit diffraction')
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.