2
2
Finite Phase Screens
3
3
--------------------
4
4
5
- Creation of phase screens with Von Karmen Statistics.
5
+ Creation of phase screens of a defined size with Von Karmen Statistics.
6
6
7
7
"""
8
8
18
18
xrange = range
19
19
20
20
def ft_sh_phase_screen (r0 , N , delta , L0 , l0 , FFT = None , seed = None ):
21
- '''
21
+
22
+ """
22
23
Creates a random phase screen with Von Karmen statistics with added
23
24
sub-harmonics to augment tip-tilt modes.
24
25
(Schmidt 2010)
@@ -32,7 +33,7 @@ def ft_sh_phase_screen(r0, N, delta, L0, l0, FFT=None, seed=None):
32
33
33
34
Returns:
34
35
ndarray: numpy array representing phase screen
35
- '''
36
+ """
36
37
R = random .SystemRandom (time .time ())
37
38
if seed is None :
38
39
seed = int (R .random ()* 100000 )
@@ -60,7 +61,7 @@ def ft_sh_phase_screen(r0, N, delta, L0, l0, FFT=None, seed=None):
60
61
f = numpy .sqrt (fx ** 2 + fy ** 2 ) # polar grid
61
62
62
63
fm = 5.92 / l0 / (2 * numpy .pi ) # inner scale frequency [1/m]
63
- f0 = 1. / L0 ;
64
+ f0 = 1. / L0
64
65
65
66
# outer scale frequency [1/m]
66
67
# modified von Karman atmospheric phase PSD
@@ -89,28 +90,8 @@ def ft_sh_phase_screen(r0, N, delta, L0, l0, FFT=None, seed=None):
89
90
return phs
90
91
91
92
92
- def ift2 (G , delta_f ,FFT = None ):
93
- """
94
- Wrapper for inverse fourier transform
95
-
96
- Parameters:
97
- G: data to transform
98
- delta_f: pixel seperation
99
- FFT (FFT object, optional): An accelerated FFT object
100
- """
101
-
102
- N = G .shape [0 ]
103
-
104
- if FFT :
105
- g = numpy .fft .fftshift ( FFT ( numpy .fft .fftshift (G ) ) ) * (N * delta_f )** 2
106
- else :
107
- g = fft .ifftshift ( fft .ifft2 ( fft .fftshift (G ) ) ) * (N * delta_f )** 2
108
-
109
- return g
110
-
111
-
112
93
def ft_phase_screen (r0 , N , delta , L0 , l0 , FFT = None , seed = None ):
113
- '''
94
+ """
114
95
Creates a random phase screen with Von Karmen statistics.
115
96
(Schmidt 2010)
116
97
@@ -123,7 +104,7 @@ def ft_phase_screen(r0, N, delta, L0, l0, FFT=None, seed=None):
123
104
124
105
Returns:
125
106
ndarray: numpy array representing phase screen
126
- '''
107
+ """
127
108
delta = float (delta )
128
109
r0 = float (r0 )
129
110
L0 = float (L0 )
@@ -136,22 +117,40 @@ def ft_phase_screen(r0, N, delta, L0, l0, FFT=None, seed=None):
136
117
137
118
del_f = 1. / (N * delta )
138
119
139
- fx = numpy .arange (- N / 2. ,N / 2. ) * del_f
120
+ fx = numpy .arange (- N / 2. , N / 2. ) * del_f
140
121
141
- (fx ,fy ) = numpy .meshgrid (fx ,fx )
142
- f = numpy .sqrt (fx ** 2 + fy ** 2 )
122
+ (fx , fy ) = numpy .meshgrid (fx ,fx )
123
+ f = numpy .sqrt (fx ** 2. + fy ** 2. )
143
124
144
125
fm = 5.92 / l0 / (2 * numpy .pi )
145
126
f0 = 1. / L0
146
127
147
- PSD_phi = (0.023 * r0 ** (- 5. / 3. ) * numpy .exp (- 1 * ((f / fm )** 2 )) /
148
- ( ( (f ** 2 ) + (f0 ** 2 ) )** (11. / 6 ) ) )
128
+ PSD_phi = (0.023 * r0 ** (- 5. / 3. ) * numpy .exp (- 1 * ((f / fm )** 2 )) / (((f ** 2 ) + (f0 ** 2 ))** (11. / 6 )))
149
129
150
130
PSD_phi [int (N / 2 ), int (N / 2 )] = 0
151
131
152
- cn = ( (numpy .random .normal (size = (N ,N )) + 1j * numpy .random .normal (size = (N ,N )) )
153
- * numpy .sqrt (PSD_phi )* del_f )
132
+ cn = ((numpy .random .normal (size = (N , N ))+ 1j * numpy .random .normal (size = (N , N ))) * numpy .sqrt (PSD_phi )* del_f )
133
+
134
+ phs = ift2 (cn , 1 , FFT ).real
135
+
136
+ return phs
137
+
154
138
155
- phs = ift2 (cn ,1 , FFT ).real
139
+ def ift2 (G , delta_f , FFT = None ):
140
+ """
141
+ Wrapper for inverse fourier transform
156
142
157
- return phs
143
+ Parameters:
144
+ G: data to transform
145
+ delta_f: pixel seperation
146
+ FFT (FFT object, optional): An accelerated FFT object
147
+ """
148
+
149
+ N = G .shape [0 ]
150
+
151
+ if FFT :
152
+ g = numpy .fft .fftshift (FFT (numpy .fft .fftshift (G ))) * (N * delta_f ) ** 2
153
+ else :
154
+ g = fft .ifftshift (fft .ifft2 (fft .fftshift (G ))) * (N * delta_f ) ** 2
155
+
156
+ return g
0 commit comments