[docs]classDataFiltFitBase(DepBunch):def__build__(self,_args=None,F_Hz=None,data=None,W=None,parent=None,codings=None,F_cutoff_Hz=None,**kwargs):if_argsisnotNone:raiseRuntimeError("Only keyword arguments allowed")ifparentisnotNone:ifF_HzisNone:F_Hz=parent.F_HzifdataisNone:data=parent.dataifWisNone:W=parent.WifcodingsisNone:codings=parent.codingsifF_cutoff_HzisNone:F_cutoff_Hz=parent.F_cutoff_Hzelse:ifF_HzisNone:raiseRuntimeError("Must Specify F_Hz")ifdataisNone:raiseRuntimeError("Must Specify data")ifWisNone:W=1ifdataisnotNoneandlen(np.asarray(data).flatten())==0:data=NoneifWisnotNoneandlen(np.asarray(W).flatten())==0:W=NoneifdataisnotNone:ifWisNone:W=1F_Hz,data,W=np.broadcast_arrays(F_Hz,data,W)self.F_Hz=F_Hzself.data=dataself.W=Wself.codings=codingsifF_cutoff_HzisnotNone:self.F_cutoff_Hz=F_cutoff_Hzsuper(DataFiltFitBase,self).__build__(**kwargs)@depB_propertydefresiduals(self):ifself.dataisNone:raiseRuntimeError("Can't generate residuals as data was not Specified")debias_reweight=1/(0.001+self.W**2)retB=Bunch()retB.resP=self.W*(self.xfer_fit/self.data-1)retB.resZ=self.W*(self.data/self.xfer_fit-1)retB.total=np.sum((abs(retB.resP)**2+abs(retB.resZ*debias_reweight)**2)/(1+debias_reweight))/(2*len(self.data))returnretB@depB_propertydefF_max_Hz(self):returnnp.max(self.F_Hz)@depB_propertydefF_cutoff_Hz(self):return1.00*np.max(self.F_Hz)@depB_propertydeforder(self):returnmax(len(self.poles)+len(self.poles_overlay),len(self.zeros)+len(self.zeros_overlay),)@depB_propertydeforder_total(self):return(len(self.poles)+len(self.poles_overlay)+len(self.zeros)+len(self.zeros_overlay))@depB_propertydeforder_sos(self):return(max(len(self.poles)+len(self.poles_overlay),len(self.zeros)+len(self.zeros_overlay),)+1)//2@depB_propertydeforder_relative(self):return(len(self.zeros)+len(self.zeros_overlay))-(len(self.poles)+len(self.poles_overlay))@depB_propertydefZPKrep(self):# cheap to compute, no need to autodeleteself.codings_revisionreturnrepresentations.ZPKwData(data=self.data,W=self.W,F_Hz=self.F_Hz,zeros=self.zeros,poles=self.poles,zeros_overlay=self.zeros_overlay,poles_overlay=self.poles_overlay,gain=self.gain,delay_s=self.delay_s,F_nyquist_Hz=self.F_nyquist_Hz,)
[docs]classDataFiltFitZ(DataFiltFitBase):def__build__(self,_args=None,F_nyquist_Hz=declarative.NOARG,parent=None,**kwargs):if_argsisnotNone:raiseRuntimeError("Only keyword arguments allowed")ifparentisnotNone:ifF_nyquist_Hzisdeclarative.NOARG:F_nyquist_Hz=parent.F_nyquist_Hzelse:ifF_nyquist_Hzisdeclarative.NOARG:raiseRuntimeError("Must Specify F_nyquist_Hz")ifF_nyquist_HzisNone:raiseRuntimeError("This type cannot support F_nyquist_Hz = None")self.F_nyquist_Hz=F_nyquist_Hzsuper(DataFiltFitZ,self).__build__(parent=parent,**kwargs)@depB_propertydefXzp_grid(self):returnnp.exp(1j*np.pi*self.F_Hz/self.F_nyquist_Hz)@depB_propertydefXzp_grid_sq(self):returnself.Xzp_grid*self.Xzp_grid@depB_propertydefXzn_grid(self):returnnp.exp(-1j*np.pi*self.F_Hz/self.F_nyquist_Hz)@depB_propertydefXzn_grid_sq(self):returnself.Xzn_grid*self.Xzn_grid@depB_propertydefXex_grid(self):returnself.Xzp_grid
[docs]classDataFiltFitSf(DataFiltFitBase):def__build__(self,_args=None,F_nyquist_Hz=declarative.NOARG,parent=None,**kwargs):if_argsisnotNone:raiseRuntimeError("Only keyword arguments allowed")ifparentisnotNone:ifF_nyquist_Hzisdeclarative.NOARG:F_nyquist_Hz=parent.F_nyquist_Hzelse:ifF_nyquist_Hzisdeclarative.NOARG:F_nyquist_Hz=NoneifF_nyquist_HzisnotNone:raiseRuntimeError("This type cannot support F_nyquist_Hz != None")self.F_nyquist_Hz=F_nyquist_Hzsuper(DataFiltFitSf,self).__build__(parent=parent,**kwargs)@depB_propertydefXsf_grid(self):return2j*np.pi*self.F_Hz@depB_propertydefXsf_grid_sq(self):returnself.Xsf_grid*self.Xsf_grid@depB_propertydefXex_grid(self):returnself.Xsf_grid