def gamma(n, tau, tsample, tol=0.01):
"""Returns the impulse response of `n` cascaded leaky integrators
This function calculates the impulse response of `n` cascaded
leaky integrators with constant of proportionality 1/`tau`:
y = (t/theta).^(n-1).*exp(-t/theta)/(theta*factorial(n-1))
Parameters
----------
n : int
Number of cascaded leaky integrators
tau : float
Decay constant of leaky integration (seconds).
Equivalent to the inverse of the constant of proportionality.
tsample : float
Sampling time step (seconds).
tol : float
Cut the kernel to size by ignoring function values smaller
than a fraction `tol` of the peak value.
"""
n = int(n)
tau = float(tau)
tsample = float(tsample)
if n <= 0 or tau <= 0 or tsample <= 0:
raise ValueError("`n`, `tau`, and `tsample` must be nonnegative.")
if tau <= tsample:
raise ValueError("`tau` cannot be smaller than `tsample`.")
# Allocate a time vector that is long enough for sure.
# Trim vector later on.
t = np.arange(0, 5 * n * tau, tsample)
# Calculate gamma
y = (t / tau) ** (n - 1) * np.exp(-t / tau)
y /= (tau * spm.factorial(n - 1))
# Normalize to unit area
y /= np.trapz(np.abs(y), dx=tsample)
# Cut off tail where values are smaller than `tol`.
# Make sure to start search on the right-hand side of the peak.
peak = y.argmax()
small_vals = np.where(y[peak:] < tol * y.max())[0]
if small_vals.size:
t = t[:small_vals[0] + peak]
y = y[:small_vals[0] + peak]
return t, y
评论列表
文章目录