Niccko commited on
Commit
e47e960
·
1 Parent(s): d3df871

add fraunhofer diffraction test

Browse files
Files changed (2) hide show
  1. fraunhofer_test.py +70 -0
  2. zern_generator.py +2 -2
fraunhofer_test.py ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import astropy.units as u
2
+ import pyoptica as po
3
+ import matplotlib.pyplot as plt
4
+ import numpy as np
5
+ import math
6
+ import os
7
+ from scipy.fft import fft2, ifft2, fftshift, ifftshift
8
+ import aotools.opticalpropagation as op
9
+ import scipy.special as sc
10
+ import time
11
+ import multiprocessing
12
+ from multiprocessing import Pool
13
+ from zern_generator import generate_zern_wavefront
14
+ from scipy.ndimage import zoom
15
+
16
+ fig, axs = plt.subplots(2, 2)
17
+
18
+
19
+ f = 100 * 10 ** -3 # Форкусное расстояние линзы
20
+
21
+
22
+ radius = 5 * 10 ** -3 # Радиус линзы
23
+
24
+ span = (-(10 ** -2), 10 ** -2)
25
+ lens = po.ThinLens(radius, f)
26
+ z = 100 * 10 ** -3 # Расстояние
27
+ wavelength = 500 * 10 ** -9 # Длина волны
28
+
29
+ pixel_scale = 250 * 10 ** -4 # Размер пикселя
30
+ npix = 2**9 # Размер сетки
31
+
32
+
33
+ ddx = np.linspace(*span, npix)
34
+ ddy = np.linspace(*span, npix)
35
+ xv, yv = np.meshgrid(ddx, ddy)
36
+ f2 = generate_zern_wavefront(xv, yv, [0, 0, 0, 3, 0], norm_radius=radius)
37
+
38
+ dist_from_center = np.sqrt(xv**2 + yv**2)
39
+ mask = dist_from_center <= radius
40
+ f2[mask == 0] = 0
41
+ f2[np.isnan(f2)] = 0
42
+ k = 2*math.pi/wavelength
43
+
44
+ wf = np.zeros((npix, npix), dtype=np.complex64)
45
+ wf[mask] = 1 + 0j
46
+ wf += f2 * 1j
47
+
48
+
49
+ D = 2e-6
50
+ fscale = wavelength*z
51
+
52
+ target_min, target_max = -50e-6, 50e-6
53
+ v = np.fft.fftfreq(npix, d=D/npix)
54
+ v = fscale * np.fft.fftshift(v)
55
+ extent = [1e3 * v[0], 1e3 * v[-1], 1e3 * v[0], 1e3 * v[-1]]
56
+
57
+ phase_mul = ((np.exp(1j*k*z) * np.exp(1j*k*(xv**2 + yv**2)/(2*z)))/(1j*wavelength*z))
58
+ U_fraun = fft2(ifftshift(wf), overwrite_x=True)
59
+ U_fraun = fftshift(U_fraun * phase_mul)
60
+
61
+
62
+ I_fraun = np.abs(U_fraun)**2
63
+ I_fraun = I_fraun / np.max(I_fraun)
64
+
65
+ axs[0][1].imshow(I_fraun, cmap='grey', extent=(*span, *span))
66
+ axs[1][1].plot(np.linspace(extent[0], extent[1], I_fraun.shape[0]),
67
+ I_fraun[:, I_fraun.shape[0]//2], antialiased='none')
68
+ axs[0][0].imshow(np.abs(wf)**2, cmap='grey', extent=(*span, *span))
69
+ axs[1][0].imshow(f2, cmap='grey', extent=(*span, *span), interpolation='none')
70
+ plt.show()
zern_generator.py CHANGED
@@ -8,14 +8,14 @@ SAMPLE_SIZE = 256
8
  span = (-1, 1)
9
 
10
 
11
- def generate_zern_wavefront(xv, yv, zerns):
12
  num_zerns = len(zerns)
13
 
14
  degree = math.ceil((-3 + math.sqrt(8 * num_zerns + 1)) / 2)
15
  zerns = list(zerns) + [0] * int((((degree + 1) * (degree + 2) / 2) - len(zerns)))
16
 
17
  cart = RZern(degree)
18
- cart.make_cart_grid(xv, yv)
19
  return np.array(cart.eval_grid(np.array(zerns), matrix=True))
20
 
21
 
 
8
  span = (-1, 1)
9
 
10
 
11
+ def generate_zern_wavefront(xv, yv, zerns, norm_radius = 1):
12
  num_zerns = len(zerns)
13
 
14
  degree = math.ceil((-3 + math.sqrt(8 * num_zerns + 1)) / 2)
15
  zerns = list(zerns) + [0] * int((((degree + 1) * (degree + 2) / 2) - len(zerns)))
16
 
17
  cart = RZern(degree)
18
+ cart.make_cart_grid(xv/norm_radius, yv/norm_radius)
19
  return np.array(cart.eval_grid(np.array(zerns), matrix=True))
20
 
21