Beispiel #1
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 30:
         return qfilter_warning(self, self.N, "Zero-phase Elliptic")
     else:
         return True
Beispiel #2
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 30:
         return qfilter_warning(None, self.N, "Chebychev 1")
     else:
         return True
Beispiel #3
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 25:
         return qfilter_warning(None, self.N, "Butterworth")
     else:
         return True
Beispiel #4
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 1000:
         return qfilter_warning(self, self.N, "FirWin")
     else:
         return True
Beispiel #5
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 25:
         return qfilter_warning(None, self.N, "Butterworth")
     else:
         return True
Beispiel #6
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 30:
         return qfilter_warning(None, self.N, "Chebychev 1")
     else:
         return True
Beispiel #7
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 2000:
         return qfilter_warning(self, self.N, "Equiripple")
     else:
         return True
Beispiel #8
0
 def _test_N(self):
     """
     Warn the user if the calculated order is too high for a reasonable filter
     design.
     """
     if self.N > 30:
         return qfilter_warning(self, self.N, "Zero-phase Elliptic")
     else:
         return True
Beispiel #9
0
    def calc_ma(self, fil_dict, rt='LP'):
        """
        Calculate coefficients and P/Z for moving average filter based on
        filter length L = N + 1 and number of cascaded stages and save the 
        result in the filter dictionary.
        """
        b = 1.
        k = 1.
        L = self.delays + 1
        
        if rt == 'LP':
            b0 = np.ones(L) #  h[n] = {1; 1; 1; ...}
            i = np.arange(1, L)

            norm = L

        elif rt == 'HP':
            b0 = np.ones(L)
            b0[::2] = -1. # h[n] = {1; -1; 1; -1; ...}
            
            i = np.arange(L)
            if (L % 2 == 0): # even order, remove middle element
                i = np.delete(i ,round(L/2.))
            else: # odd order, shift by 0.5 and remove middle element
                i = np.delete(i, int(L/2.)) + 0.5

            norm = L
            
        elif rt == 'BP':
            # N is even, L is odd
            b0 = np.ones(L)
            b0[1::2] = 0
            b0[::4] = -1 # h[n] = {1; 0; -1; 0; 1; ... }
            
            L = L + 1
            i = np.arange(L) # create N + 2 zeros around the unit circle, ...
            # ... remove first and middle element and rotate by L / 4 
            i = np.delete(i, [0, L // 2]) + L / 4         

            norm = np.sum(abs(b0))

        elif rt == 'BS':
            # N is even, L is odd
            b0 = np.ones(L)
            b0[1::2] = 0

            L = L + 1
            i = np.arange(L) # create N + 2 zeros around the unit circle and ...
            i = np.delete(i, [0, L // 2]) # ... remove first and middle element

            norm = np.sum(b0)

        if self.delays > 1000:
            if not qfilter_warning(None, self.delays*self.stages, "Moving Average"):
                return -1

        
        z0 = np.exp(-2j*np.pi*i/L)            
        # calculate filter for multiple cascaded stages    
        for i in range(self.stages):
            b = np.convolve(b0, b)
        z = np.repeat(z0, self.stages)
        
        # normalize filter to |H_max| = 1 if checked:
        if self.chk_norm.isChecked():
            b = b / (norm ** self.stages)
            k = 1./norm ** self.stages
        p = np.zeros(len(z))
        
        # store in class attributes for the _save method
        self.zpk = [z,p,k]
        self.b = b
        self._save(fil_dict)
Beispiel #10
0
    def calc_ma(self, fil_dict, rt='LP'):
        """
        Calculate coefficients and P/Z for moving average filter based on
        filter length L = N + 1 and number of cascaded stages and save the 
        result in the filter dictionary.
        """
        b = 1.
        k = 1.
        L = self.delays + 1
        
        if rt == 'LP':
            b0 = np.ones(L) #  h[n] = {1; 1; 1; ...}
            i = np.arange(1, L)

            norm = L

        elif rt == 'HP':
            b0 = np.ones(L)
            b0[::2] = -1. # h[n] = {1; -1; 1; -1; ...}
            
            i = np.arange(L)
            if (L % 2 == 0): # even order, remove middle element
                i = np.delete(i ,round(L/2.))
            else: # odd order, shift by 0.5 and remove middle element
                i = np.delete(i, int(L/2.)) + 0.5

            norm = L
            
        elif rt == 'BP':
            # N is even, L is odd
            b0 = np.ones(L)
            b0[1::2] = 0
            b0[::4] = -1 # h[n] = {1; 0; -1; 0; 1; ... }
            
            L = L + 1
            i = np.arange(L) # create N + 2 zeros around the unit circle, ...
            # ... remove first and middle element and rotate by L / 4 
            i = np.delete(i, [0, L // 2]) + L / 4         

            norm = np.sum(abs(b0))

        elif rt == 'BS':
            # N is even, L is odd
            b0 = np.ones(L)
            b0[1::2] = 0

            L = L + 1
            i = np.arange(L) # create N + 2 zeros around the unit circle and ...
            i = np.delete(i, [0, L // 2]) # ... remove first and middle element

            norm = np.sum(b0)

        if self.delays > 1000:
            if not qfilter_warning(None, self.delays*self.stages, "Moving Average"):
                return -1

        
        z0 = np.exp(-2j*np.pi*i/L)            
        # calculate filter for multiple cascaded stages    
        for i in range(self.stages):
            b = np.convolve(b0, b)
        z = np.repeat(z0, self.stages)
        
        # normalize filter to |H_max| = 1 if checked:
        if self.chk_norm.isChecked():
            b = b / (norm ** self.stages)
            k = 1./norm ** self.stages
        p = np.zeros(len(z))
        
        # store in class attributes for the _save method
        self.zpk = [z,p,k]
        self.b = b
        self._save(fil_dict)