Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
onsets : array
Indices of EMG pulse onsets.
"""
# check inputs
if signal is None:
raise TypeError("Please specify an input signal.")
# ensure numpy
signal = np.array(signal)
sampling_rate = float(sampling_rate)
# filter signal
filtered, _, _ = st.filter_signal(signal=signal,
ftype='butter',
band='highpass',
order=4,
frequency=100,
sampling_rate=sampling_rate)
# find onsets
onsets, = find_onsets(signal=filtered, sampling_rate=sampling_rate)
# get time vectors
length = len(signal)
T = (length - 1) / sampling_rate
ts = np.linspace(0, T, length, endpoint=True)
# plot
if show:
v1s = int(1. * sampling_rate)
v100ms = int(0.1 * sampling_rate)
TH_elapsed = np.ceil(0.36 * sampling_rate)
sm_size = int(0.08 * sampling_rate)
init_ecg = 8 # seconds for initialization
if dur < init_ecg:
init_ecg = int(dur)
# filtering
filtered, _, _ = st.filter_signal(signal=signal,
ftype='butter',
band='lowpass',
order=4,
frequency=25.,
sampling_rate=sampling_rate)
filtered, _, _ = st.filter_signal(signal=filtered,
ftype='butter',
band='highpass',
order=4,
frequency=3.,
sampling_rate=sampling_rate)
# diff
dx = np.abs(np.diff(filtered, 1) * sampling_rate)
# smoothing
dx, _ = st.smoother(signal=dx, kernel='hamming', size=sm_size, mirror=True)
# buffers
qrspeakbuffer = np.zeros(init_ecg)
noisepeakbuffer = np.zeros(init_ecg)
peak_idx_test = np.zeros(init_ecg)
def _apply_filter(self, signal_raw, filter_bandwidth):
"""Apply FIR bandpass filter to waveform."""
signal_filtered, _, _ = filter_signal(signal=signal_raw, ftype='FIR', band='bandpass',
order=int(0.3 * self.fs), frequency=filter_bandwidth,
sampling_rate=self.fs)
return signal_filtered
amplitudes : array
SCR pulse amplitudes.
"""
# check inputs
if signal is None:
raise TypeError("Please specify an input signal.")
# ensure numpy
signal = np.array(signal)
sampling_rate = float(sampling_rate)
# filter signal
aux, _, _ = st.filter_signal(signal=signal,
ftype='butter',
band='lowpass',
order=4,
frequency=5,
sampling_rate=sampling_rate)
# smooth
sm_size = int(0.75 * sampling_rate)
filtered, _ = st.smoother(signal=aux,
kernel='boxzen',
size=sm_size,
mirror=True)
# get SCR info
onsets, peaks, amps = kbk_scr(signal=filtered,
sampling_rate=sampling_rate,
def _filter_waveform(self):
"""Filter raw ECG waveform with bandpass finite-impulse-response filter."""
# Calculate filter order
order = int(0.3 * self.fs)
# Filter waveform
filtered, _, _ = filter_signal(signal=self.waveform, ftype='FIR', band='bandpass', order=order,
frequency=self.filter_bands, sampling_rate=self.fs)
return filtered
resp_rate : array
Instantaneous respiration rate (Hz).
"""
# check inputs
if signal is None:
raise TypeError("Please specify an input signal.")
# ensure numpy
signal = np.array(signal)
sampling_rate = float(sampling_rate)
# filter signal
filtered, _, _ = st.filter_signal(signal=signal,
ftype='butter',
band='bandpass',
order=2,
frequency=[0.1, 0.35],
sampling_rate=sampling_rate)
# compute zero crossings
zeros, = st.zero_cross(signal=filtered, detrend=True)
beats = zeros[::2]
if len(beats) < 2:
rate_idx = []
rate = []
else:
# compute respiration rate
rate_idx = beats[1:]
# averages samples in one period of the powerline
# interference frequency with a first zero at this frequency.
b = np.ones(int(0.02 * sampling_rate)) / 50.
a = [1]
X = ss.filtfilt(b, a, signal)
# 2. Moving averaging of samples in 28 ms interval for electromyogram
# noise suppression a filter with first zero at about 35 Hz.
b = np.ones(int(sampling_rate / 35.)) / 35.
X = ss.filtfilt(b, a, X)
X, _, _ = st.filter_signal(signal=X,
ftype='butter',
band='lowpass',
order=7,
frequency=40.,
sampling_rate=sampling_rate)
X, _, _ = st.filter_signal(signal=X,
ftype='butter',
band='highpass',
order=7,
frequency=9.,
sampling_rate=sampling_rate)
k, Y, L = 1, [], len(X)
for n in range(k + 1, L - k):
Y.append(X[n] ** 2 - X[n - k] * X[n + k])
Y = np.array(Y)
Y[Y < 0] = 0
# Complex lead
# Y = abs(scipy.diff(X)) # 1-lead
# 3. Moving averaging of a complex lead (the sintesis is
# explained in the next section) in 40 ms intervals a filter