@@ -33,6 +33,30 @@ def wavelength_to_voltage(wavelength):
3333 ) / (2 * 0.978466 )
3434
3535
36+ def evaluate_grid_src (src , L , power = 1 ):
37+ """
38+ Given an ImageSource object, compute the source's unique filters
39+ at the filter_indices specified in its metadata.
40+ :return: an `L x L x len(src.filter_indices)` array containing the evaluated
41+ filters at each gridpoint
42+ """
43+ grid2d = grid_2d (L , dtype = src .dtype )
44+ omega = np .pi * np .vstack ((grid2d ["x" ].flatten (), grid2d ["y" ].flatten ()))
45+
46+ h = np .empty ((omega .shape [- 1 ], len (src .filter_indices )), dtype = src .dtype )
47+ for i , filt in enumerate (src .unique_filters ):
48+ idx_k = np .where (src .filter_indices == i )[0 ]
49+ if len (idx_k ) > 0 :
50+ filter_values = filt .evaluate (omega )
51+ if power != 1 :
52+ filter_values **= power
53+ h [:, idx_k ] = np .column_stack ((filter_values ,) * len (idx_k ))
54+
55+ h = np .reshape (h , grid2d ["x" ].shape + (len (src .filter_indices ),))
56+
57+ return h
58+
59+
3660# TODO: filters should probably be dtyped...
3761class Filter :
3862 def __init__ (self , dim = None , radial = False ):
@@ -116,20 +140,6 @@ def evaluate_grid(self, L, dtype=np.float32, *args, **kwargs):
116140
117141 return h
118142
119- def evaluate_grid_src (self , src , L , power = 1 ):
120- grid2d = grid_2d (L , dtype = src .dtype )
121- omega = np .pi * np .vstack ((grid2d ["x" ].flatten (), grid2d ["y" ].flatten ()))
122- h = np .empty ((omega .shape [- 1 ], len (src .filter_indices )), dtype = src .dtype )
123- for i , filt , in enumerate (src .unique_filters ):
124- idx_k = np .where (src .filter_indices == i )[0 ]
125- if len (idx_k ) > 0 :
126- filter_values = filt .evaluate (omega )
127- if power != 1 :
128- filter_values **= power
129- h [:, idx_k ] = np .column_stack ((filter_values ,)* len (idx_k ))
130- h = np .reshape (h , grid2d ["x" ].shape + (len (src .filter_indices ),))
131- return h
132-
133143 def dual (self ):
134144 return DualFilter (self )
135145
0 commit comments