aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/sca/sampling.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/sca/sampling.py')
-rw-r--r--pyecsca/sca/sampling.py48
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)