diff options
Diffstat (limited to 'pyecsca/sca/sampling.py')
| -rw-r--r-- | pyecsca/sca/sampling.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pyecsca/sca/sampling.py b/pyecsca/sca/sampling.py new file mode 100644 index 0000000..29dc251 --- /dev/null +++ b/pyecsca/sca/sampling.py @@ -0,0 +1,48 @@ +import numpy as np +from copy import copy +from public import public +from scipy.signal import decimate + +from .trace import Trace + + +@public +def downsample_average(trace: Trace, factor: int = 2) -> Trace: + """ + Downsample samples of `trace` by `factor` by averaging `factor` consecutive samples in + non-intersecting windows. + + :param trace: + :param factor: + :return: + """ + resized = np.resize(trace.samples, len(trace.samples) - (len(trace.samples) % factor)) + result_samples = resized.reshape(-1, factor).mean(axis=1).astype(trace.samples.dtype) + return Trace(copy(trace.title), copy(trace.data), result_samples) + + +@public +def downsample_pick(trace: Trace, factor: int = 2, offset: int = 0) -> Trace: + """ + Downsample samples of `trace` by `factor` by picking each `factor`-th sample, starting at `offset`. + + :param trace: + :param factor: + :param offset: + :return: + """ + result_samples = trace.samples[offset::factor].copy() + return Trace(copy(trace.title), copy(trace.data), result_samples) + + +@public +def downsample_decimate(trace: Trace, factor: int = 2) -> Trace: + """ + Downsample samples of `trace` by `factor` by decimating. + + :param trace: + :param factor: + :return: + """ + result_samples = decimate(trace.samples, factor) + return Trace(copy(trace.title), copy(trace.data), result_samples) |
