空间过滤器4f设置(Python)的模拟问题 我有一个关于我的代码的问题,它计算了一个4F设置的输出字段,中间有一个针孔,它作为一个空间滤波器。 我的设置包括两个50毫米焦距的镜头(距离2f),两个镜头之间有一个针孔。输入场具有高斯场分布,其中高斯光束的束腰为4mm,此外,我向输入场添加了一些噪声。我的目标是看看对于不同的针孔直径,我能过滤掉多少噪音

空间过滤器4f设置(Python)的模拟问题 我有一个关于我的代码的问题,它计算了一个4F设置的输出字段,中间有一个针孔,它作为一个空间滤波器。 我的设置包括两个50毫米焦距的镜头(距离2f),两个镜头之间有一个针孔。输入场具有高斯场分布,其中高斯光束的束腰为4mm,此外,我向输入场添加了一些噪声。我的目标是看看对于不同的针孔直径,我能过滤掉多少噪音,python,fft,simulation,spatial,optics-algorithm,Python,Fft,Simulation,Spatial,Optics Algorithm,我编写了一个程序,模拟4f设置中的空间滤波过程,一般来说,输出场的空间分布具有预期的形状(高斯场进入,高斯场出来)。我唯一的问题是,与输入场的振幅相比,输出场的振幅非常高(场4的最大值与2000的最大值) 在我的程序中,我使用夫琅和费近似,并使用python中的FFT/IFFT函数数值求解夫琅和费衍射积分(对于从透镜前焦平面开始的场)。我的代码的灵感来自Jason D.Schmidt(第4章)的书:“利用MATLAB中的示例对光波传播进行数值模拟”。我猜fft/ifft的比例因子有问题,但我不知

我编写了一个程序,模拟4f设置中的空间滤波过程,一般来说,输出场的空间分布具有预期的形状(高斯场进入,高斯场出来)。我唯一的问题是,与输入场的振幅相比,输出场的振幅非常高(场4的最大值与2000的最大值)

在我的程序中,我使用夫琅和费近似,并使用python中的FFT/IFFT函数数值求解夫琅和费衍射积分(对于从透镜前焦平面开始的场)。我的代码的灵感来自Jason D.Schmidt(第4章)的书:“利用MATLAB中的示例对光波传播进行数值模拟”。我猜fft/ifft的比例因子有问题,但我不知道代码中的错误在哪里,因为我使用的是与施密特书中完全相同的比例因子

(fft2->dl^2,ifft2->(N*dl\u f)**2,其中dl\u f=1/(N*dl))

我的代码的功能是:

将numpy导入为np
从matplotlib导入pyplot作为plt
def镜头(U英寸、λ0、L、N、焦距):
''计算从前焦点开始的场的场方向分布
然后聚焦到镜头的后焦平面
使用夫琅和费衍射的透镜。
我们在这个函数中假设一个正方形的计算域。
论据
---------
U_in:2d阵列
初始场方向分布
lambda_0:浮动
初始场的真空波长(mm)
焦点:浮动
镜头焦距
L:浮子
一侧计算域的长度
N:int
计算域一侧的网格点数量
退换商品
-------
输出:二维阵列
后初始场的傅里叶平面内的场分布
与透镜的相互作用
kx:1d阵列
x方向输出平面中的坐标
ky:1d阵列
y方向上输出平面中的坐标
'''
通过
#真空波数
k_0=2*np.pi/lambda_0
#初始字段的栅格间距
dl=L/N
#为输出平面定义网格
kx=np.fft.fftfreq(N,d=dl)
ky=np.fft.fftfreq(N,d=dl)
#排序数组
kx=np.asarray(np.append(kx[int(N/2):],kx[0:int(N/2)])*lambda_0*focal
ky=np.asarray(np.append(ky[int(N/2):],ky[0:int(N/2)])*lambda_0*focal
#为输出字段定义网格
kxx,kyy=np.meshgrid(kx,ky)
#将U_移入以执行fft校正
U_in=np.fft.fft移位(U_in)
#用夫琅和费积分计算输出场
U_out=(np.exp(1j*k_0*2*焦点)/(1j*lambda_0*焦点)*
np.fft.fft移位(np.fft.fft2(U_in))*(dl)**2)
返回U_out,kx,ky
def镜头俯仰英尺(俯仰英寸,λ0,左,右,焦距):
''计算场的逆傅里叶变换,该变换与
使用夫琅和费衍射的薄透镜。
我们在这个函数中假设一个二次计算域。
论据
---------
U_in:2d阵列
初始场方向分布
lambda_0:浮动
初始场的真空波长(mm)
焦点:浮动
镜头焦距
L:浮子
一侧计算域的长度
N:int
计算域一侧的网格点数量
退换商品
-------
输出:二维阵列
后初始场的傅里叶平面内的场分布
与透镜的相互作用
x:1d阵列
x方向输出平面中的坐标
y:1d阵列
y方向上输出平面中的坐标
'''
通过
#真空波数
k_0=2*np.pi/lambda_0
#空间域中初始场的网格间距
dl=L/N
#空间频率域中的网格间距
dl_f=1/(N*dl)
#为输出字段定义网格
x=np.linspace(-L/2,L/2,N,endpoint=False)
y=np.linspace(-L/2,L/2,N,endpoint=False)
xx,yy=np.meshgrid(x,y)
U_in=np.fft.ifftshift(U_in)
U_out=(np.exp(1j*k_0*2*焦点)/(1j*lambda_0*焦点)*
np.fft.ifftshift(np.fft.ifft2(U_in))*(N*dl_f)**2)
返回U_out,x,y
def针孔过滤器fct(cx、cy、r、N):
''创建具有针孔形状的过滤函数
论据
---------
cx:int
针孔居中的矩阵x索引
cy:int
针孔居中的矩阵y索引
r:int
针孔半径(mm)
N:int
计算域一侧的网格点数量
退换商品
-------
过滤器\u fct:2d阵列
具有圆形针孔形状的过滤函数(具有0和1个元素的矩阵)
'''
#将半径长度转换为像素
像素\针孔\半径=圆形(半径*N/L)
#定义过滤器fct的矩阵
x=np.arange(-N/2,N/2)
y=np.arange(-N/2,N/2)
filter_fct=np.零((N,N))
#在中创建针孔
掩码=(x
U_out = (np.exp(1j * k_0 * 2*focal) / (1j * lambda_0 * focal) *
         np.fft.fftshift(np.fft.fft2(U_in)) * (dl)**2) 
1 / (1j * lambda_0 * focal)