def tf_coefficients(self, frequencies=None, coefficients=None,
delay=False):
"""
computes implemented transfer function - assuming no delay and
infinite precision (actually floating-point precision)
Returns the discrete transfer function realized by coefficients at
frequencies.
Parameters
----------
coefficients: np.array
coefficients as returned from iir module
frequencies: np.array
frequencies to compute the transfer function for
dt: float
discrete sampling time (seconds)
zoh: bool
If true, zero-order hold implementation is assumed. Otherwise,
the delay is expected to depend on the index of biquad.
Returns
-------
np.array(..., dtype=np.complex)
"""
if frequencies is None:
frequencies = self.frequencies
frequencies = np.asarray(frequencies, dtype=np.float64)
if coefficients is None:
fcoefficients = self.coefficients
else:
fcoefficients = coefficients
# discrete frequency
w = frequencies * 2 * np.pi * self.dt * self.loops
# the higher stages have progressively more delay to the output
if delay:
delay_per_cycle = np.exp(-1j * self.dt * frequencies * 2 * np.pi)
h = np.zeros(len(w), dtype=np.complex128)
for i in range(len(fcoefficients)):
sos = np.asarray(fcoefficients[i], dtype=np.float64)
# later we can use sig.sosfreqz (very recent function, dont want
# to update scipy now)
ww, hh = sig.freqz(sos[:3], sos[3:], worN=np.asarray(w,
dtype=np.float64))
if delay:
hh *= delay_per_cycle ** i
h += hh
return h
评论列表
文章目录