Ejemplo n.º 1
0
 def _test_poles(self):
     """
     Warn the user if one of the poles is outside the unit circle
     """
     if abs(self.p[0]) >= 1 or abs(self.p[1]) >= 1:
         return qfilter_warning(self, self.p[0], "Delay")
     else:
         return True
Ejemplo n.º 2
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
Ejemplo n.º 3
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, "Delay")
     else:
         return True
Ejemplo n.º 4
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
Ejemplo n.º 5
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
Ejemplo n.º 6
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)