def update(self, geo_pars=None, **kwargs): """ update internal p dictionary. Recompute all internal array buffers """ # local reference to avoid excessive self. use p = self.p if geo_pars is not None: p.update(geo_pars) for k, v in kwargs.iteritems(): if p.has_key(k): p[k] = v self.sh = p.N # calculate the grids [X, Y] = u.grids(self.sh, p.psize_sam, p.origin_sam) # maybe useful later. delete this references if space is short self.grids_sam = [X, Y] self.grids_det = [X, Y] # calculating kernel psize_fspace = p.lam * p.z / p.N / p.psize_det [V, W] = u.grids(self.sh, psize_fspace, 'fft') a2 = (V**2 + W**2) / p.z**2 self.kernel = np.exp(2j * np.pi * (p.z / p.lam) * (np.sqrt(1 - a2) - 1)) #self.kernel = np.fft.fftshift(self.kernel) self.ikernel = self.kernel.conj()
def update(self,geo_pars=None,**kwargs): """ update internal p dictionary. Recompute all internal array buffers """ # local reference to avoid excessive self. use p = self.p if geo_pars is not None: p.update(geo_pars) for k,v in kwargs.iteritems(): if p.has_key(k): p[k] = v self.sh = p.N # calculate the grids [X,Y] = u.grids(self.sh,p.psize_sam,p.origin_sam) # maybe useful later. delete this references if space is short self.grids_sam = [X,Y] self.grids_det = [X,Y] # calculating kernel psize_fspace = p.lam * p.z / p.N / p.psize_det [V,W] = u.grids(self.sh,psize_fspace,'fft') a2 = (V**2+W**2) /p.z**2 self.kernel = np.exp(2j * np.pi * (p.z / p.lam) * (np.sqrt(1 - a2) - 1)) #self.kernel = np.fft.fftshift(self.kernel) self.ikernel = self.kernel.conj()
def update(self, geo_pars=None, **kwargs): """ update internal p dictionary. Recompute all internal array buffers """ # local reference to avoid excessive self. use p = self.p if geo_pars is not None: p.update(geo_pars) for k, v in kwargs.iteritems(): if p.has_key(k): p[k] = v # wavelength * distance factor lz = p.lam * p.z #calculate real space pixel size. psize_sam = p.psize_sam if p.psize_sam is not None else lz / p.N / p.psize_det # calculate array shape from misfit self.crop_pad = np.round(u.expect2(p.misfit) / 2.0).astype(int) * 2 self.sh = p.N + self.crop_pad # calculate the grids [X, Y] = u.grids(self.sh, psize_sam, p.origin_sam) [V, W] = u.grids(self.sh, p.psize_det, p.origin_det) # maybe useful later. delete this references if space is short self.grids_sam = [X, Y] self.grids_det = [V, W] # quadratic phase + shift factor before fft pre = np.exp(1j * np.pi * (X**2 + Y**2) / lz).astype(self.dtype) self.pre_fft = pre * np.exp(-2.0 * np.pi * 1j * ( (X - X[0, 0]) * V[0, 0] + (Y - Y[0, 0]) * W[0, 0]) / lz).astype(self.dtype) # quadratic phase + shift factor before fft post = np.exp(1j * np.pi * (V**2 + W**2) / lz).astype(self.dtype) self.post_fft = post * np.exp(-2.0 * np.pi * 1j * (X[0, 0] * V + Y[0, 0] * W) / lz).astype( self.dtype) # factors for inverse operation self.pre_ifft = self.post_fft.conj() self.post_ifft = self.pre_fft.conj()
def update(self,geo_pars=None,**kwargs): """ update internal p dictionary. Recompute all internal array buffers """ # local reference to avoid excessive self. use p = self.p if geo_pars is not None: p.update(geo_pars) for k,v in kwargs.iteritems(): if p.has_key(k): p[k] = v # wavelength * distance factor lz= p.lam * p.z #calculate real space pixel size. psize_sam = p.psize_sam if p.psize_sam is not None else lz / p.N / p.psize_det # calculate array shape from misfit self.crop_pad = np.round(u.expect2(p.misfit) /2.0).astype(int) * 2 self.sh = p.N + self.crop_pad # calculate the grids [X,Y] = u.grids(self.sh,psize_sam,p.origin_sam) [V,W] = u.grids(self.sh,p.psize_det,p.origin_det) # maybe useful later. delete this references if space is short self.grids_sam = [X,Y] self.grids_det = [V,W] # quadratic phase + shift factor before fft pre = np.exp(1j * np.pi * (X**2+Y**2) / lz ).astype(self.dtype) self.pre_fft = pre*np.exp(-2.0*np.pi*1j*((X-X[0,0])*V[0,0]+(Y-Y[0,0])*W[0,0])/ lz).astype(self.dtype) # quadratic phase + shift factor before fft post=np.exp(1j * np.pi * (V**2+W**2) / lz ).astype(self.dtype) self.post_fft = post*np.exp(-2.0*np.pi*1j*(X[0,0]*V+Y[0,0]*W)/ lz).astype(self.dtype) # factors for inverse operation self.pre_ifft = self.post_fft.conj() self.post_ifft = self.pre_fft.conj()