TI/Boxcar: Różnice pomiędzy wersjami
Z Brain-wiki
(Utworzono nową stronę "<source lang="python"> #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue May 7 12:45:41 2019 @author: tgub """ #boxcar kompozycja class boxcar_com():...") |
|||
Linia 1: | Linia 1: | ||
+ | dziedziczenie vs kompozycja | ||
<source lang="python"> | <source lang="python"> | ||
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||
Linia 88: | Linia 89: | ||
+ | </source> | ||
+ | |||
+ | FFT w boxcar | ||
+ | |||
+ | <source lang="python"> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- coding: utf-8 -*- | ||
+ | """ | ||
+ | Created on Wed May 8 11:06:03 2019 | ||
+ | |||
+ | @author: tgub | ||
+ | """ | ||
+ | import matplotlib.pyplot as plt | ||
+ | import numpy as np | ||
+ | |||
+ | #boxcar dziedziczenie | ||
+ | class boxcar(list): | ||
+ | |||
+ | #prosta implementacja: | ||
+ | #https://docs.scipy.org/doc/numpy/reference/routines.fft.html | ||
+ | @staticmethod | ||
+ | def myfft(arr): | ||
+ | n=len(arr) | ||
+ | A=np.zeros(n,dtype='complex_') | ||
+ | for k in range(n): | ||
+ | for m in range(n): | ||
+ | A[k]+=arr[m]*np.exp(-2j*np.pi*m*k/n) | ||
+ | return A | ||
+ | |||
+ | def __init__(self,N): | ||
+ | super().__init__([0]*N) | ||
+ | self.__sum=0 | ||
+ | self.__sum2=0 | ||
+ | self.__N=N | ||
+ | self.__fft=boxcar.myfft(self) | ||
+ | self.__exp1=np.exp(2j*np.pi/N*np.arange(N)) | ||
+ | self.__exp2=np.exp(-2j*np.pi*(N-1)/N*np.arange(N)) | ||
+ | |||
+ | |||
+ | def __setitem__(self,index,value): | ||
+ | raise TypeError | ||
+ | |||
+ | def append(self,elem): | ||
+ | self.__sum+=elem | ||
+ | self.__sum2+=elem*elem | ||
+ | self.__sum-=self[0] | ||
+ | self.__sum2-=self[0]*self[0] | ||
+ | #update fft | ||
+ | self.__fft=(self.__fft-self[0])*self.__exp1+elem*self.__exp2 | ||
+ | |||
+ | self.pop(0) | ||
+ | super().append(elem) | ||
+ | |||
+ | @property | ||
+ | def mean(self): | ||
+ | return self.__sum/len(self) | ||
+ | |||
+ | @property | ||
+ | def var(self): | ||
+ | return self.__sum2/(len(self))-self.mean*self.mean | ||
+ | |||
+ | @property | ||
+ | def fft(self): | ||
+ | return self.__fft.copy() | ||
+ | |||
+ | sygnal = np.sin(np.arange(1000)) | ||
+ | x=boxcar(100) | ||
+ | for i in range(700): | ||
+ | x.append(sygnal[i]) | ||
+ | |||
+ | plt.plot(x.fft.imag+1.0) | ||
+ | plt.plot(boxcar.myfft(x).imag) | ||
+ | plt.show() | ||
</source> | </source> |
Aktualna wersja na dzień 10:47, 8 maj 2019
dziedziczenie vs kompozycja
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue May 7 12:45:41 2019
@author: tgub
"""
#boxcar kompozycja
class boxcar_com():
def __init__(self,N):
self.__sum=0
self.__sum2=0
self.__N=N
self.__list=[]
def __str__(self):return self.__list.__str__()
def __repr__(self):return self.__list.__repr__()
def __getitem__(self,index):
print('tutaj blad index =',index)
return self.__list[index]
def append(self,elem):
self.__sum+=elem
self.__sum2+=elem*elem
if len(self.__list)>=self.__N:
self.__sum-=self.__list[0]
self.__sum2-=self.__list[0]*self.__list[0]
self.__list.pop(0)
self.__list.append(elem)
print('append com',elem)
@property
def mean(self):
return self.__sum/len(self.__list)
@property
def var(self):
return self.__sum2/(len(self.__list))-self.mean*self.mean
#boxcar dziedziczenie
class boxcar_inh(list):
def __init__(self,N):
super().__init__([])
self.__sum=0
self.__sum2=0
self.__N=N
def __setitem__(self,index,value):
raise TypeError
def append(self,elem):
self.__sum+=elem
self.__sum2+=elem*elem
if len(self)>=self.__N:
self.__sum-=self[0]
self.__sum2-=self[0]*self[0]
self.pop(0)
super().append(elem)
print('append inh',elem)
@property
def mean(self):
return self.__sum/len(self)
@property
def var(self):
return self.__sum2/(len(self))-self.mean*self.mean
ac=boxcar_com(5)
ai=boxcar_inh(5)
ac.append(1)
ai.append(1)
ac.append(2)
ai.append(2)
ac.append(3)
ai.append(3)
ac.append(4)
ai.append(4)
ac.append(5)
ai.append(5)
print('ac',ac.mean,ac.var,ac)
print('ai',ai.mean,ai.var,ai)
ac.append(6)
ai.append(6)
print('ac',ac.mean,ac.var,ac)
print('ai',ai.mean,ai.var,ai)
ac.append(7)
ai.append(7)
print('ac',ac.mean,ac.var,ac)
print('ai',ai.mean,ai.var,ai)
FFT w boxcar
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed May 8 11:06:03 2019
@author: tgub
"""
import matplotlib.pyplot as plt
import numpy as np
#boxcar dziedziczenie
class boxcar(list):
#prosta implementacja:
#https://docs.scipy.org/doc/numpy/reference/routines.fft.html
@staticmethod
def myfft(arr):
n=len(arr)
A=np.zeros(n,dtype='complex_')
for k in range(n):
for m in range(n):
A[k]+=arr[m]*np.exp(-2j*np.pi*m*k/n)
return A
def __init__(self,N):
super().__init__([0]*N)
self.__sum=0
self.__sum2=0
self.__N=N
self.__fft=boxcar.myfft(self)
self.__exp1=np.exp(2j*np.pi/N*np.arange(N))
self.__exp2=np.exp(-2j*np.pi*(N-1)/N*np.arange(N))
def __setitem__(self,index,value):
raise TypeError
def append(self,elem):
self.__sum+=elem
self.__sum2+=elem*elem
self.__sum-=self[0]
self.__sum2-=self[0]*self[0]
#update fft
self.__fft=(self.__fft-self[0])*self.__exp1+elem*self.__exp2
self.pop(0)
super().append(elem)
@property
def mean(self):
return self.__sum/len(self)
@property
def var(self):
return self.__sum2/(len(self))-self.mean*self.mean
@property
def fft(self):
return self.__fft.copy()
sygnal = np.sin(np.arange(1000))
x=boxcar(100)
for i in range(700):
x.append(sygnal[i])
plt.plot(x.fft.imag+1.0)
plt.plot(boxcar.myfft(x).imag)
plt.show()