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()