import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['figure.figsize'] = (12.0, 9.0) import random t=np.arange(0.0,10.0,1.0/15) tData=np.zeros(t.size,np.float32) for i in range(t.size): if t[i]<2: tData[i]=0 elif t[i]<3: tData[i]=t[i]-2 elif t[i]<5: tData[i]=1 elif t[i]<8: tData[i]=np.cos(0.5*np.pi*(t[i]-5)); else: tData[i]=0 plt.plot(t,tData) plt.ylim(-1.0,1.2) oData=np.zeros(t.size,np.float32) for i in range(oData.size): oData[i] = tData[i] + random.gauss(0,0.05) plt.plot(t,tData) plt.plot(t,oData,'.') def SimpleAverage(data,N): filtered = np.zeros(data.size) for i in range(N): filtered[i]=data[i] for i in range(data.size): if i>N: sum=0 for j in range(N): sum = sum + data[i-j] filtered[i] = sum/N return filtered pData1=SimpleAverage(oData,5) plt.plot(t,tData,"b") plt.plot(t,oData,'.g') plt.plot(t,pData1,"r") def DoubleMovingAverage(data,N): filtered1 = np.zeros(data.size) filtered2 = np.zeros(data.size) for i in range(N): filtered1[i]=data[i] for i in range(N): filtered2[i]=filtered1[i] for i in range(data.size): if i>N: sum=0 for j in range(N): sum = sum + data[i-j] filtered1[i] = sum/N for i in range(data.size): if i>N: sum=0 for j in range(N): sum = sum + filtered1[i-j] filtered2[i] = sum/N #return filtered1*2-filtered2 return filtered2 pData2=DoubleMovingAverage(oData,4) pData1=SimpleAverage(oData,4) plt.plot(t,tData,'b') plt.plot(t,oData,'.g') plt.plot(t,pData2,'r') plt.plot(t,pData1,'y') pData3=2*SimpleAverage(oData,4)-DoubleMovingAverage(oData,4) plt.plot(t,tData,'b') plt.plot(t,oData,'.g') plt.plot(t,pData3,'r') def ExponentialSmoothing(data,alpha): filtered = np.zeros(data.size) filtered[0]=alpha*data[0] for i in range(data.size): if i>0: filtered[i]=alpha*data[i]+(1-alpha)*filtered[i-1] return filtered pData4=ExponentialSmoothing(oData,0.9) pData5=ExponentialSmoothing(oData,0.5) pData6=ExponentialSmoothing(oData,0.1) plt.plot(t,tData,'b') plt.plot(t,oData,'.g') plt.plot(t,pData4,'r') plt.plot(t,pData5,'k') plt.plot(t,pData6,'y') def DoubleExponentialSmoothing(data,alpha,gamma): filtered=np.zeros(data.size) b=np.zeros(data.size) b[0]=data[1]-data[0] filtered[0]=data[0] for i in range(data.size): filtered[i]=alpha*data[i]+(1-alpha)*(filtered[i-1]+b[i-1]) b[i]=gamma*(filtered[i]-filtered[i-1])+(1-gamma)*b[i-1] return filtered pData5=ExponentialSmoothing(oData,0.4) pData6=DoubleExponentialSmoothing(oData,0.4,0.5) plt.plot(t,tData,'b') plt.plot(t,oData,'.g') plt.plot(t,pData6,'r') plt.plot(t,pData5,'y')