Source code for denspp.offline.analog.func
import numpy as np
from fractions import Fraction
from scipy.integrate import cumulative_trapezoid
from denspp.offline import check_keylist_elements_all
[docs]
def do_quantize_transient(transient_orig: dict, fs_new: float, u_lsb: float, i_gain: float=2e3) -> dict:
"""Performing a re-quantization of the transient input signal (amplitude and time)
Args:
transient_orig: Input dictionary with transient signal ['V': voltage, 'I': current, 'fs': sampling rate]
fs_new: New sampling rate [Hz]
u_lsb: New smallest voltage resolution (least significant bit, LSB)
Returns:
Dictionary with new transient output ['V': voltage, 'I': current, 'fs': sampling rate]
"""
assert check_keylist_elements_all(
keylist=[key for key in transient_orig.keys()],
elements=['V', 'I', 'fs']
), "Not all attributes of transiend_orig are included ['V', 'I', 'fs']"
current0 = do_resample_time(transient_orig['I'], transient_orig['fs'], fs_new, do_offset_comp=True)
voltage0 = do_resample_time(transient_orig['V'], transient_orig['fs'], fs_new)
current_tran = do_resample_amplitude(i_gain * current0, u_lsb) / i_gain
voltage_tran = do_resample_amplitude(voltage0, u_lsb)
return {'I': current_tran, 'V': voltage_tran, 'fs': fs_new}
[docs]
def do_resample_time(signal_in: np.ndarray, fs_orig: float, fs_new: float,
do_offset_comp: bool=False) -> np.ndarray:
"""Do resampling of time value from transient signals
Args:
signal_in: Numpy array of transient input signal
fs_orig: Original sampling rate value
fs_new: New sampling rate value
do_offset_comp: Do offset compensation on output
Returns:
Numpy array of resampled into
"""
from scipy.signal import resample_poly
u_chck = np.mean(signal_in)
u_off = u_chck if not do_offset_comp else 0
if not fs_orig == fs_new:
p, q = Fraction(fs_new / fs_orig).limit_denominator(10000).as_integer_ratio()
return u_off + resample_poly(signal_in - u_chck, p, q)
else:
return signal_in - u_off
[docs]
def do_resample_amplitude(signal_in: np.ndarray, u_lsb: float) -> np.ndarray:
"""Do resampling of amplitude from transient signal
Args:
signal_in: Numpy array with transient signal
u_lsb: New smallest voltage resolution (least significant bit, LSB)
Returns:
Numpy array with re-sampled input (amplitude)
"""
return u_lsb * np.round(signal_in / u_lsb, 0)
[docs]
def calculate_signal_integration(signal: np.ndarray, time: np.ndarray, initial: float=0.0) -> np.ndarray:
"""Calculating the injected charge amount of one stimulation pattern
:param signal: Numpy array with current input signal
:param time: Numpy array with timesamples [s]
:param initial: Floating value with initial value
:return: Numpy array with injected charge amount during signal time
"""
period = float(np.diff(time).mean())
return initial + cumulative_trapezoid(
y=signal,
x=time,
dx=period,
initial=0.0,
axis=-1
)