def squareFit(self,xReal,yReal):
N=len(xReal)
mx = yReal.max()
mn = yReal.min()
OFFSET = (mx+mn)/2.
amplitude = (np.average(yReal[yReal>OFFSET]) - np.average(yReal[yReal<OFFSET]) )/2.0
yTmp = np.select([yReal<OFFSET,yReal>OFFSET],[0,2])
bools = abs(np.diff(yTmp))>1
edges = xReal[bools]
levels = yTmp[bools]
frequency = 1./(edges[2]-edges[0])
phase=edges[0]#.5*np.pi*((yReal[0]-offset)/amplitude)
dc=0.5
if len(edges)>=4:
if levels[0]==0:
dc = (edges[1]-edges[0])/(edges[2]-edges[0])
else:
dc = (edges[2]-edges[1])/(edges[3]-edges[1])
phase = edges[1]
guess = [amplitude, frequency, phase,dc,0]
try:
(amplitude, frequency, phase,dc,offset), pcov = self.optimize.curve_fit(self.squareFunc, xReal, yReal-OFFSET, guess)
offset+=OFFSET
if(frequency<0):
#print ('negative frq')
return False
freq=1e6*abs(frequency)
amp=abs(amplitude)
pcov[0]*=1e6
#print (pcov)
if(abs(pcov[-1][0])>1e-6):
False
return [amp, freq, phase,dc,offset]
except:
return False
评论列表
文章目录