def compute_zernike_basis(num_polynomials, field_res, dtype=torch.float32, wo_piston=False): """Computes a set of Zernike basis function with resolution field_res num_polynomials: number of Zernike polynomials in this basis field_res: [height, width] in px, any list-like object dtype: torch dtype for computation at different precision """ # size the zernike basis to avoid circular masking zernike_diam = int(np.ceil(np.sqrt(field_res[0]**2 + field_res[1]**2))) # create zernike functions if not wo_piston: zernike = zernikeArray(num_polynomials, zernike_diam) else: # 200427 - exclude pistorn term idxs = range(2, 2 + num_polynomials) zernike = zernikeArray(idxs, zernike_diam) zernike = utils.crop_image(zernike, field_res, pytorch=False) # convert to tensor and create phase zernike = torch.tensor(zernike, dtype=dtype, requires_grad=False) return zernike
def test_zernikeArray_comparison(): full_zernike_array = functions.zernikeArray(10, 32) subset_zernike_array = functions.zernikeArray([2, 3, 4], 32) assert (numpy.allclose(full_zernike_array[1:4], subset_zernike_array))
def test_zernikeArray_list(): zernike_array = functions.zernikeArray([2, 3, 4], 32) assert (zernike_array.shape == (3, 32, 32))
def test_zernikeArray_single(): zernike_array = functions.zernikeArray(10, 32) assert (zernike_array.shape == (10, 32, 32))
def test_zernikeArray_comparison(): full_zernike_array = functions.zernikeArray(10, 32) subset_zernike_array = functions.zernikeArray([2, 3, 4], 32) assert(numpy.allclose(full_zernike_array[1:4], subset_zernike_array))
def test_zernikeArray_list(): zernike_array = functions.zernikeArray([2, 3, 4], 32) assert(zernike_array.shape == (3, 32, 32))
def test_zernikeArray_single(): zernike_array = functions.zernikeArray(10, 32) assert(zernike_array.shape == (10, 32, 32))