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