def signal_envelope1D(data, *, sigma=None, fs=None):
"""Docstring goes here
TODO: this is not yet epoch-aware!
sigma = 0 means no smoothing (default 4 ms)
"""
if sigma is None:
sigma = 0.004 # 4 ms standard deviation
if fs is None:
if isinstance(data, (np.ndarray, list)):
raise ValueError("sampling frequency must be specified!")
elif isinstance(data, core.AnalogSignalArray):
fs = data.fs
if isinstance(data, (np.ndarray, list)):
# Compute number of samples to compute fast FFTs
padlen = nextfastpower(len(data)) - len(data)
# Pad data
paddeddata = np.pad(data, (0, padlen), 'constant')
# Use hilbert transform to get an envelope
envelope = np.absolute(hilbert(paddeddata))
# Truncate results back to original length
envelope = envelope[:len(data)]
if sigma:
# Smooth envelope with a gaussian (sigma = 4 ms default)
EnvelopeSmoothingSD = sigma*fs
smoothed_envelope = scipy.ndimage.filters.gaussian_filter1d(envelope, EnvelopeSmoothingSD, mode='constant')
envelope = smoothed_envelope
elif isinstance(data, core.AnalogSignalArray):
newasa = copy.deepcopy(data)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
cum_lengths = np.insert(np.cumsum(data.lengths), 0, 0)
# for segment in data:
for idx in range(data.n_epochs):
# print('hilberting epoch {}/{}'.format(idx+1, data.n_epochs))
segment_data = data._ydata[:,cum_lengths[idx]:cum_lengths[idx+1]]
n_signals, n_samples = segment_data.shape
assert n_signals == 1, 'only 1D signals supported!'
# Compute number of samples to compute fast FFTs:
padlen = nextfastpower(n_samples) - n_samples
# Pad data
paddeddata = np.pad(segment_data.squeeze(), (0, padlen), 'constant')
# Use hilbert transform to get an envelope
envelope = np.absolute(hilbert(paddeddata))
# free up memory
del paddeddata
# Truncate results back to original length
envelope = envelope[:n_samples]
if sigma:
# Smooth envelope with a gaussian (sigma = 4 ms default)
EnvelopeSmoothingSD = sigma*fs
smoothed_envelope = scipy.ndimage.filters.gaussian_filter1d(envelope, EnvelopeSmoothingSD, mode='constant')
envelope = smoothed_envelope
newasa._ydata[:,cum_lengths[idx]:cum_lengths[idx+1]] = np.atleast_2d(envelope)
return newasa
return envelope
评论列表
文章目录